/ Hex Artifact Content
Login

Artifact 81271e38084e74ddc6602ee5a80ea0a7d5dfacf9:


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 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 20 21 64 65 66 69 6e  no.h>.#if !defin
1140: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
1150: 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
1160: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 69  X_MMAP_SIZE>0.#i
1170: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1180: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  .h>.#endif...#if
1190: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
11a0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
11b0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
11c0: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
11d0: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
11e0: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
11f0: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
1200: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
1210: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
1220: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
1230: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
1240: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1250: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1260: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1270: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1280: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1290: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
12a0: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
12b0: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
12c0: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
12d0: 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45  dif..#ifdef HAVE
12e0: 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65  _UTIME.# include
12f0: 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69   <utime.h>.#endi
1300: 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  f../*.** Allowed
1310: 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46   values of unixF
1320: 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23  ile.fsFlags.*/.#
1330: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53  define SQLITE_FS
1340: 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20  FLAGS_IS_MSDOS  
1350: 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66     0x1../*.** If
1360: 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68   we are to be th
1370: 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75  read-safe, inclu
1380: 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20  de the pthreads 
1390: 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e  header and defin
13a0: 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  e.** the SQLITE_
13b0: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63  UNIX_THREADS mac
13c0: 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ro..*/.#if SQLIT
13d0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69  E_THREADSAFE.# i
13e0: 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e  nclude <pthread.
13f0: 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  h>.# define SQLI
1400: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
1410: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
1420: 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  Default permissi
1430: 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e  ons when creatin
1440: 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a  g a new file.*/.
1450: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
1460: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
1470: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
1480: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1490: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
14a0: 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0644.#endif../*
14b0: 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d  .** Default perm
14c0: 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65  issions when cre
14d0: 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79  ating auto proxy
14e0: 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64 65 66 20   dir.*/.#ifndef 
14f0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
1500: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
1510: 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  ONS.# define SQL
1520: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
1530: 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
1540: 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0755.#endif../*
1550: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70  .** Maximum supp
1560: 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74  orted path-lengt
1570: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  h..*/.#define MA
1580: 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a  X_PATHNAME 512..
1590: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74  /*.** Only set t
15a0: 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20  he lastErrno if 
15b0: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
15c0: 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61  s a real error a
15d0: 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72  nd not .** a nor
15e0: 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74  mal expected ret
15f0: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
1600: 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
1610: 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  E_OK.*/.#define 
1620: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29  IS_LOCK_ERROR(x)
1630: 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f    ((x != SQLITE_
1640: 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c  OK) && (x != SQL
1650: 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46  ITE_BUSY))../* F
1660: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1670: 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  s */.typedef str
1680: 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78  uct unixShm unix
1690: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
16a0: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
16b0: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
16c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
16d0: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69   unixShmNode uni
16e0: 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  xShmNode;       
16f0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1700: 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70   instance */.typ
1710: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
1720: 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e  InodeInfo unixIn
1730: 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e  odeInfo;   /* An
1740: 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64   i-node */.typed
1750: 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e  ef struct UnixUn
1760: 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65  usedFd UnixUnuse
1770: 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75  dFd;     /* An u
1780: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1790: 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  iptor */../*.** 
17a0: 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72  Sometimes, after
17b0: 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69   a file handle i
17c0: 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69  s closed by SQLi
17d0: 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73  te, the file des
17e0: 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f  criptor.** canno
17f0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
1800: 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73  diately. In thes
1810: 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63  e cases, instanc
1820: 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  es of the follow
1830: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
1840: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f   are used to sto
1850: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  re the file desc
1860: 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69  riptor while wai
1870: 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f  ting for an.** o
1880: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69  pportunity to ei
1890: 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65  ther close or re
18a0: 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63  use it..*/.struc
18b0: 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b  t UnixUnusedFd {
18c0: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18e0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
18f0: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e  to close */.  in
1900: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
1910: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
1920: 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   this file descr
1930: 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  iptor was opened
1940: 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55   with */.  UnixU
1950: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20  nusedFd *pNext; 
1960: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75       /* Next unu
1970: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
1980: 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65  tor on same file
1990: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
19a0: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
19b0: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
19c0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
19d0: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
19e0: 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70   unix.** VFS imp
19f0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f  lementations..*/
1a00: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1a10: 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c  unixFile unixFil
1a20: 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  e;.struct unixFi
1a30: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  le {.  sqlite3_i
1a40: 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
1a50: 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c  *pMethod;  /* Al
1a60: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65  ways the first e
1a70: 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
1a80: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aa0: 20 54 68 65 20 56 46 53 20 74 68 61 74 20 63 72   The VFS that cr
1ab0: 65 61 74 65 64 20 74 68 69 73 20 75 6e 69 78 46  eated this unixF
1ac0: 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ile */.  unixIno
1ad0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af0: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
1b00: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
1b10: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1b40: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1b50: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1b60: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1b70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1b80: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1b90: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1ba0: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
1bb0: 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20  int ctrlFlags;  
1bc0: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1bd0: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
1be0: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
1bf0: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c10: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
1c20: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
1c30: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1c40: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1c50: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1c60: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1c70: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1c80: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1c90: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1cb0: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1cc0: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1cd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
1ce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cf0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1d00: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
1d10: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1d40: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1d50: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1d60: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d80: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1d90: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1da0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
1db0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1dc0: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1df0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
1e00: 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71  tch refs */.  sq
1e10: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1e20: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1e30: 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65    /* Usable size
1e40: 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70   of mapping at p
1e50: 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  MapRegion */.  s
1e60: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1e70: 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20  pSizeActual;    
1e80: 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a     /* Actual siz
1e90: 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20  e of mapping at 
1ea0: 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  pMapRegion */.  
1eb0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1ec0: 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20  apSizeMax;      
1ed0: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65      /* Configure
1ee0: 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  d FCNTL_MMAP_SIZ
1ef0: 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69  E value */.  voi
1f00: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
1f30: 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64  d region */.#end
1f40: 69 66 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  if.#ifdef __QNXN
1f50: 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f  TO__.  int secto
1f60: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1f70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1f80: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1f90: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1fa0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1fc0: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1fd0: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1fe0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  */.#endif.#if SQ
1ff0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2000: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
2010: 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20  openFlags;      
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70 65  /* The flags spe
2040: 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29  cified at open()
2050: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
2060: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2070: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
2080: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2090: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
20a0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
20b0: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
20c0: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
20d0: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
20e0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
20f0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
2100: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
2110: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
2120: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
2130: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
2140: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
2150: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
2160: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
2170: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
2180: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
2190: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
21a0: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
21b0: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
21c0: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
21d0: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
21e0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
21f0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
2200: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
2210: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
2220: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
2230: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
2240: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
2250: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2260: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
2270: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
2280: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
2290: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
22a0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
22b0: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
22c0: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
22d0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
22e0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
22f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2300: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2310: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
2320: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2330: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2340: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2350: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2360: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
2370: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2380: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2390: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
23a0: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
23b0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
23c0: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
23d0: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
23e0: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
23f0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
2400: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
2410: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
2420: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
2430: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2440: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2450: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2460: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2470: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
2480: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
2490: 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
24a0: 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61  unixFile.ctrlFla
24b0: 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23  gs bitmask:.*/.#
24c0: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
24d0: 45 58 43 4c 20 20 20 20 20 20 20 20 30 78 30 31  EXCL        0x01
24e0: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
24f0: 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f  ons from one pro
2500: 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  cess only */.#de
2510: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44  fine UNIXFILE_RD
2520: 4f 4e 4c 59 20 20 20 20 20 20 30 78 30 32 20 20  ONLY      0x02  
2530: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
2540: 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f   is read only */
2550: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2560: 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78  E_PERSIST_WAL 0x
2570: 30 34 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73  04     /* Persis
2580: 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f  tent WAL mode */
2590: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25a0: 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
25b0: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
25c0: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
25d0: 38 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f  8     /* Directo
25e0: 72 79 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a  ry sync needed *
25f0: 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  /.#else.# define
2600: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2610: 43 20 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66  C    0x00.#endif
2620: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2630: 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 30 78  E_PSOW        0x
2640: 31 30 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  10     /* SQLITE
2650: 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
2660: 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 23 64  _OVERWRITE */.#d
2670: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44  efine UNIXFILE_D
2680: 45 4c 45 54 45 20 20 20 20 20 20 30 78 32 30 20  ELETE      0x20 
2690: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
26a0: 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69 6e   close */.#defin
26b0: 65 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 20 20  e UNIXFILE_URI  
26c0: 20 20 20 20 20 20 20 30 78 34 30 20 20 20 20 20         0x40     
26d0: 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67 68  /* Filename migh
26e0: 74 20 68 61 76 65 20 71 75 65 72 79 20 70 61 72  t have query par
26f0: 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64 65 66 69  ameters */.#defi
2700: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  ne UNIXFILE_NOLO
2710: 43 4b 20 20 20 20 20 20 30 78 38 30 20 20 20 20  CK      0x80    
2720: 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20 6c   /* Do no file l
2730: 6f 63 6b 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e  ocking */.#defin
2740: 65 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45  e UNIXFILE_WARNE
2750: 44 20 20 20 20 30 78 30 31 30 30 20 20 20 20 20  D    0x0100     
2760: 2f 2a 20 76 65 72 69 66 79 44 62 46 69 6c 65 28  /* verifyDbFile(
2770: 29 20 77 61 72 6e 69 6e 67 73 20 68 61 76 65 20  ) warnings have 
2780: 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 0a  been issued */..
2790: 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f  /*.** Include co
27a0: 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f  de that is commo
27b0: 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20  n to all os_*.c 
27c0: 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64  files.*/.#includ
27d0: 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a  e "os_common.h".
27e0: 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61  ./*.** Define va
27f0: 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61  rious macros tha
2800: 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72  t are missing fr
2810: 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e  om some systems.
2820: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41  .*/.#ifndef O_LA
2830: 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65  RGEFILE.# define
2840: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23   O_LARGEFILE 0.#
2850: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
2860: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a  ITE_DISABLE_LFS.
2870: 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46  # undef O_LARGEF
2880: 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c  ILE.# define O_L
2890: 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69  ARGEFILE 0.#endi
28a0: 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f  f.#ifndef O_NOFO
28b0: 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f  LLOW.# define O_
28c0: 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69  NOFOLLOW 0.#endi
28d0: 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41  f.#ifndef O_BINA
28e0: 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49  RY.# define O_BI
28f0: 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  NARY 0.#endif../
2900: 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69  *.** The threadi
2910: 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73  d macro resolves
2920: 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69   to the thread-i
2930: 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64  d or to 0.  Used
2940: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
2950: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
2960: 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ly..*/.#if SQLIT
2970: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65  E_THREADSAFE.#de
2980: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74  fine threadid pt
2990: 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c  hread_self().#el
29a0: 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61  se.#define threa
29b0: 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  did 0.#endif../*
29c0: 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41 50 20  .** HAVE_MREMAP 
29d0: 64 65 66 61 75 6c 74 73 20 74 6f 20 74 72 75 65  defaults to true
29e0: 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20 66 61   on Linux and fa
29f0: 6c 73 65 20 65 76 65 72 79 77 68 65 72 65 20 65  lse everywhere e
2a00: 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  lse..*/.#if !def
2a10: 69 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d 41 50  ined(HAVE_MREMAP
2a20: 29 0a 23 20 69 66 20 64 65 66 69 6e 65 64 28 5f  ).# if defined(_
2a30: 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66  _linux__) && def
2a40: 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52 43 45  ined(_GNU_SOURCE
2a50: 29 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56 45  ).#  define HAVE
2a60: 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c 73 65  _MREMAP 1.# else
2a70: 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f  .#  define HAVE_
2a80: 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e 64 69 66  MREMAP 0.# endif
2a90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
2aa0: 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79  ifferent Unix sy
2ab0: 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70  stems declare op
2ac0: 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e  en() in differen
2ad0: 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73  t ways.  Same us
2ae0: 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20  e.** open(const 
2af0: 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74  char*,int,mode_t
2b00: 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f  ).  Others use o
2b10: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pen(const char*,
2b20: 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65  int,...)..** The
2b30: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69   difference is i
2b40: 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73  mportant when us
2b50: 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
2b60: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   the function..*
2b70: 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20  *.** The safest 
2b80: 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68  way to deal with
2b90: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20   the problem is 
2ba0: 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  to always use th
2bb0: 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68  is wrapper.** wh
2bc0: 69 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74  ich always has t
2bd0: 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66  he same well-def
2be0: 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a  ined interface..
2bf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
2c00: 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68  sixOpen(const ch
2c10: 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66  ar *zFile, int f
2c20: 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b  lags, int mode){
2c30: 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a  .  return open(z
2c40: 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64  File, flags, mod
2c50: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20  e);.}../*.** On 
2c60: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61  some systems, ca
2c70: 6c 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20  lls to fchown() 
2c80: 77 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d  will trigger a m
2c90: 65 73 73 61 67 65 20 69 6e 20 61 20 73 65 63 75  essage in a secu
2ca0: 72 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74  rity.** log if t
2cb0: 68 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f  hey come from no
2cc0: 6e 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73  n-root processes
2cd0: 2e 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c  .  So avoid call
2ce0: 69 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a  ing fchown() if.
2cf0: 2a 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75  ** we are not ru
2d00: 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a  nning as root..*
2d10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
2d20: 69 78 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c  ixFchown(int fd,
2d30: 20 75 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f   uid_t uid, gid_
2d40: 74 20 67 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  t gid){.  return
2d50: 20 67 65 74 65 75 69 64 28 29 20 3f 20 30 20 3a   geteuid() ? 0 :
2d60: 20 66 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67   fchown(fd,uid,g
2d70: 69 64 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  id);.}../* Forwa
2d80: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
2d90: 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
2da0: 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
2db0: 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 2f 2a  har*, int*);../*
2dc0: 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20  .** Many system 
2dd0: 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73  calls are access
2de0: 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74  ed through point
2df0: 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20  er-to-functions 
2e00: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20  so that.** they 
2e10: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
2e20: 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20  n at runtime to 
2e30: 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74  facilitate fault
2e40: 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e   injection durin
2e50: 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  g.** testing and
2e60: 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68   sandboxing.  Th
2e70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
2e80: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  y holds the name
2e90: 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a  s and pointers.*
2ea0: 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64  * to all overrid
2eb0: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
2ec0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  ls..*/.static st
2ed0: 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c  ruct unix_syscal
2ee0: 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  l {.  const char
2ef0: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
2f00: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2f10: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a  he system call *
2f20: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
2f30: 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74  all_ptr pCurrent
2f40: 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c  ; /* Current val
2f50: 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d  ue of the system
2f60: 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74   call */.  sqlit
2f70: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
2f80: 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61  Default; /* Defa
2f90: 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61  ult value */.} a
2fa0: 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20  Syscall[] = {.  
2fb0: 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20 20 20 20  { "open",       
2fc0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
2fd0: 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70 65 6e  ll_ptr)posixOpen
2fe0: 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65  ,  0  },.#define
2ff0: 20 6f 73 4f 70 65 6e 20 20 20 20 20 20 28 28 69   osOpen      ((i
3000: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3010: 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79 73 63  *,int,int))aSysc
3020: 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29  all[0].pCurrent)
3030: 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20  ..  { "close",  
3040: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3050: 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65  yscall_ptr)close
3060: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
3070: 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20 20  fine osClose    
3080: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 29 29 61   ((int(*)(int))a
3090: 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72  Syscall[1].pCurr
30a0: 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63 65 73  ent)..  { "acces
30b0: 73 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  s",       (sqlit
30c0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 61  e3_syscall_ptr)a
30d0: 63 63 65 73 73 2c 20 20 20 20 20 30 20 20 7d 2c  ccess,     0  },
30e0: 0a 23 64 65 66 69 6e 65 20 6f 73 41 63 63 65 73  .#define osAcces
30f0: 73 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f  s    ((int(*)(co
3100: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 29 61  nst char*,int))a
3110: 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72  Syscall[2].pCurr
3120: 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 63 77  ent)..  { "getcw
3130: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
3140: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67  e3_syscall_ptr)g
3150: 65 74 63 77 64 2c 20 20 20 20 20 30 20 20 7d 2c  etcwd,     0  },
3160: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 63 77  .#define osGetcw
3170: 64 20 20 20 20 28 28 63 68 61 72 2a 28 2a 29 28  d    ((char*(*)(
3180: 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53  char*,size_t))aS
3190: 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65  yscall[3].pCurre
31a0: 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c  nt)..  { "stat",
31b0: 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
31c0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 73 74  3_syscall_ptr)st
31d0: 61 74 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a  at,       0  },.
31e0: 23 64 65 66 69 6e 65 20 6f 73 53 74 61 74 20 20  #define osStat  
31f0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
3200: 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63 74 20  st char*,struct 
3210: 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b  stat*))aSyscall[
3220: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a  4].pCurrent)../*
3230: 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f  .** The DJGPP co
3240: 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65  mpiler environme
3250: 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20  nt looks mostly 
3260: 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69  like Unix, but i
3270: 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66  t.** lacks the f
3280: 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61  cntl() system ca
3290: 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65  ll.  So redefine
32a0: 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73   fcntl() to be s
32b0: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74  omething.** that
32c0: 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
32d0: 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
32e0: 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20  at locking does 
32f0: 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a  not occur under.
3300: 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69  ** DJGPP.  But i
3310: 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20  t is DOS - what 
3320: 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a  did you expect?.
3330: 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50  */.#ifdef __DJGP
3340: 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74 22 2c  P__.  { "fstat",
3350: 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20          0,      
3360: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c             0  },
3370: 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74  .#define osFstat
3380: 28 61 2c 62 2c 63 29 20 20 20 20 30 0a 23 65 6c  (a,b,c)    0.#el
3390: 73 65 20 20 20 20 20 0a 20 20 7b 20 22 66 73 74  se     .  { "fst
33a0: 61 74 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  at",        (sql
33b0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
33c0: 29 66 73 74 61 74 2c 20 20 20 20 20 20 30 20 20  )fstat,      0  
33d0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74  },.#define osFst
33e0: 61 74 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  at     ((int(*)(
33f0: 69 6e 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a  int,struct stat*
3400: 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43  ))aSyscall[5].pC
3410: 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a  urrent).#endif..
3420: 20 20 7b 20 22 66 74 72 75 6e 63 61 74 65 22 2c    { "ftruncate",
3430: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3440: 63 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63 61  call_ptr)ftrunca
3450: 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69  te,  0  },.#defi
3460: 6e 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20 28  ne osFtruncate (
3470: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f  (int(*)(int,off_
3480: 74 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70  t))aSyscall[6].p
3490: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66  Current)..  { "f
34a0: 63 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28 73  cntl",        (s
34b0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
34c0: 74 72 29 66 63 6e 74 6c 2c 20 20 20 20 20 20 30  tr)fcntl,      0
34d0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
34e0: 63 6e 74 6c 20 20 20 20 20 28 28 69 6e 74 28 2a  cntl     ((int(*
34f0: 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61  )(int,int,...))a
3500: 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72  Syscall[7].pCurr
3510: 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 22  ent)..  { "read"
3520: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
3530: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72  e3_syscall_ptr)r
3540: 65 61 64 2c 20 20 20 20 20 20 20 30 20 20 7d 2c  ead,       0  },
3550: 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 20  .#define osRead 
3560: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
3570: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
3580: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e  _t))aSyscall[8].
3590: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
35a0: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
35b0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
35c0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
35d0: 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20  .  { "pread",   
35e0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
35f0: 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c  scall_ptr)pread,
3600: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73        0  },.#els
3610: 65 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20  e.  { "pread",  
3620: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3630: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
3640: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
3650: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72  dif.#define osPr
3660: 65 61 64 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ead     ((ssize_
3670: 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73  t(*)(int,void*,s
3680: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79  ize_t,off_t))aSy
3690: 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e  scall[9].pCurren
36a0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
36b0: 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b  USE_PREAD64).  {
36c0: 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20   "pread64",     
36d0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
36e0: 6c 5f 70 74 72 29 70 72 65 61 64 36 34 2c 20 20  l_ptr)pread64,  
36f0: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
3700: 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20  { "pread64",    
3710: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3720: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3730: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
3740: 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64 36  #define osPread6
3750: 34 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29  4   ((ssize_t(*)
3760: 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f  (int,void*,size_
3770: 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c  t,off_t))aSyscal
3780: 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[10].pCurrent).
3790: 0a 20 20 7b 20 22 77 72 69 74 65 22 2c 20 20 20  .  { "write",   
37a0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
37b0: 73 63 61 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c  scall_ptr)write,
37c0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
37d0: 69 6e 65 20 6f 73 57 72 69 74 65 20 20 20 20 20  ine osWrite     
37e0: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
37f0: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a  ,const void*,siz
3800: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 31  e_t))aSyscall[11
3810: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3820: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
3830: 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e  AD) || SQLITE_EN
3840: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
3850: 4c 45 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c  LE.  { "pwrite",
3860: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3870: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69  syscall_ptr)pwri
3880: 74 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65  te,     0  },.#e
3890: 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65 22  lse.  { "pwrite"
38a0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
38b0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
38c0: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
38d0: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
38e0: 50 77 72 69 74 65 20 20 20 20 28 28 73 73 69 7a  Pwrite    ((ssiz
38f0: 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74  e_t(*)(int,const
3900: 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66   void*,size_t,of
3910: 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20  f_t))\.         
3920: 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63             aSysc
3930: 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74  all[12].pCurrent
3940: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
3950: 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20  SE_PREAD64).  { 
3960: 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20  "pwrite64",     
3970: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3980: 5f 70 74 72 29 70 77 72 69 74 65 36 34 2c 20 20  _ptr)pwrite64,  
3990: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
39a0: 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20   "pwrite64",    
39b0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
39c0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
39d0: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
39e0: 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 36  define osPwrite6
39f0: 34 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28  4  ((ssize_t(*)(
3a00: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
3a10: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a  size_t,off_t))\.
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a30: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d      aSyscall[13]
3a40: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3a50: 22 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20  "fchmod",       
3a60: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3a70: 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20 20 20 20  _ptr)fchmod,    
3a80: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3a90: 73 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e 74  sFchmod    ((int
3aa0: 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29  (*)(int,mode_t))
3ab0: 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75  aSyscall[14].pCu
3ac0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3ad0: 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46  ned(HAVE_POSIX_F
3ae0: 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56  ALLOCATE) && HAV
3af0: 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
3b00: 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65  E.  { "fallocate
3b10: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
3b20: 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78  yscall_ptr)posix
3b30: 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d  _fallocate,  0 }
3b40: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c  ,.#else.  { "fal
3b50: 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  locate",    (sql
3b60: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3b70: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3b80: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
3b90: 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61  define osFalloca
3ba0: 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c  te ((int(*)(int,
3bb0: 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79  off_t,off_t))aSy
3bc0: 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65  scall[15].pCurre
3bd0: 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e 6b  nt)..  { "unlink
3be0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3bf0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e  3_syscall_ptr)un
3c00: 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 20 20 20  link,           
3c10: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 55  0 },.#define osU
3c20: 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74 28 2a  nlink    ((int(*
3c30: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61  )(const char*))a
3c40: 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72  Syscall[16].pCur
3c50: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70 65 6e  rent)..  { "open
3c60: 44 69 72 65 63 74 6f 72 79 22 2c 20 20 20 20 28  Directory",    (
3c70: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3c80: 70 74 72 29 6f 70 65 6e 44 69 72 65 63 74 6f 72  ptr)openDirector
3c90: 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65  y,      0 },.#de
3ca0: 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72 65 63  fine osOpenDirec
3cb0: 74 6f 72 79 20 28 28 69 6e 74 28 2a 29 28 63 6f  tory ((int(*)(co
3cc0: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a 29 29  nst char*,int*))
3cd0: 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75  aSyscall[17].pCu
3ce0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 6b 64  rrent)..  { "mkd
3cf0: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
3d00: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3d10: 29 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20 20  )mkdir,         
3d20: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3d30: 73 4d 6b 64 69 72 20 20 20 20 20 28 28 69 6e 74  sMkdir     ((int
3d40: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
3d50: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
3d60: 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [18].pCurrent)..
3d70: 20 20 7b 20 22 72 6d 64 69 72 22 2c 20 20 20 20    { "rmdir",    
3d80: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3d90: 63 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72 2c 20  call_ptr)rmdir, 
3da0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3db0: 64 65 66 69 6e 65 20 6f 73 52 6d 64 69 72 20 20  define osRmdir  
3dc0: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3dd0: 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c  t char*))aSyscal
3de0: 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[19].pCurrent).
3df0: 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20  .  { "fchown",  
3e00: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3e10: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 46  scall_ptr)posixF
3e20: 63 68 6f 77 6e 2c 20 20 20 20 20 30 20 7d 2c 0a  chown,     0 },.
3e30: 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6f 77 6e  #define osFchown
3e40: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
3e50: 2c 75 69 64 5f 74 2c 67 69 64 5f 74 29 29 61 53  ,uid_t,gid_t))aS
3e60: 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72  yscall[20].pCurr
3e70: 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  ent)..#if !defin
3e80: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
3e90: 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
3ea0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
3eb0: 7b 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20  { "mmap",       
3ec0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3ed0: 5f 70 74 72 29 6d 6d 61 70 2c 20 20 20 20 20 30  _ptr)mmap,     0
3ee0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d   },.#define osMm
3ef0: 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f  ap ((void*(*)(vo
3f00: 69 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69  id*,size_t,int,i
3f10: 6e 74 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53  nt,int,off_t))aS
3f20: 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72  yscall[21].pCurr
3f30: 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 75 6e 6d 61  ent)..  { "munma
3f40: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
3f50: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d  e3_syscall_ptr)m
3f60: 75 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  unmap,          
3f70: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d  0 },.#define osM
3f80: 75 6e 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29  unmap ((void*(*)
3f90: 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61  (void*,size_t))a
3fa0: 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72  Syscall[22].pCur
3fb0: 72 65 6e 74 29 0a 0a 23 69 66 20 48 41 56 45 5f  rent)..#if HAVE_
3fc0: 4d 52 45 4d 41 50 0a 20 20 7b 20 22 6d 72 65 6d  MREMAP.  { "mrem
3fd0: 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ap",       (sqli
3fe0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3ff0: 6d 72 65 6d 61 70 2c 20 20 20 20 20 20 20 20 20  mremap,         
4000: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4010: 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20  "mremap",       
4020: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
4030: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
4040: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4050: 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 72 65 6d  f.#define osMrem
4060: 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f  ap ((void*(*)(vo
4070: 69 64 2a 2c 73 69 7a 65 5f 74 2c 73 69 7a 65 5f  id*,size_t,size_
4080: 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63  t,int,...))aSysc
4090: 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74  all[23].pCurrent
40a0: 29 0a 23 65 6e 64 69 66 0a 0a 7d 3b 20 2f 2a 20  ).#endif..}; /* 
40b0: 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72  End of the overr
40c0: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
40d0: 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  alls */../*.** T
40e0: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
40f0: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
4100: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
4110: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
4120: 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73  .** "unix" VFSes
4130: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4140: 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73  _OK opon success
4150: 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74  fully updating t
4160: 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  he.** system cal
4170: 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51  l pointer, or SQ
4180: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66  LITE_NOTFOUND if
4190: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e   there is no con
41a0: 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73  figurable.** sys
41b0: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a  tem call named z
41c0: 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Name..*/.static 
41d0: 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65  int unixSetSyste
41e0: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
41f0: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
4200: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
4210: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
4220: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
4230: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
4240: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
4250: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
4260: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
4270: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
4280: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
4290: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
42a0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
42b0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
42c0: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
42d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
42e0: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
42f0: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
4300: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
4310: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
4320: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
4330: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
4340: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
4350: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
4360: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
4370: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
4380: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
4390: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
43a0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
43b0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
43c0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
43d0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
43e0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
43f0: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
4400: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4410: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
4420: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
4430: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
4440: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
4450: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
4460: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
4470: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
4480: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
4490: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
44a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
44b0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
44c0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
44d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
44e0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
44f0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
4500: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
4510: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
4520: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
4530: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
4540: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
4550: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
4560: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
4570: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
4580: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
4590: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
45a0: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
45b0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
45c0: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
45d0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
45e0: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
45f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4600: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
4610: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4620: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
4630: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
4640: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
4650: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
4660: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
4670: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
4680: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
4690: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
46a0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
46b0: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
46c0: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
46d0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
46e0: 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74  call_ptr unixGet
46f0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
4700: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
4710: 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sed,.  const cha
4720: 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e  r *zName.){.  un
4730: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20  signed int i;.. 
4740: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
4750: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66  R(pNotUsed);.  f
4760: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
4770: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
4780: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
4790: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
47a0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
47b0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
47c0: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
47d0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
47e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
47f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4800: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
4810: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
4820: 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20  ll after zName. 
4830: 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a   If zName==NULL.
4840: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  ** then return t
4850: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
4860: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
4870: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
4880: 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68  f zName.** is th
4890: 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61  e last system ca
48a0: 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69  ll or if zName i
48b0: 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f  s not the name o
48c0: 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73  f a valid.** sys
48d0: 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  tem call..*/.sta
48e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
48f0: 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61  unixNextSystemCa
4900: 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ll(sqlite3_vfs *
4910: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
4920: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
4930: 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50   -1;..  UNUSED_P
4940: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69  ARAMETER(p);.  i
4950: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
4960: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
4970: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31  Size(aSyscall)-1
4980: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
4990: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
49a0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
49b0: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
49c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
49d0: 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  ++; i<ArraySize(
49e0: 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b  aSyscall); i++){
49f0: 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c  .    if( aSyscal
4a00: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30  l[i].pCurrent!=0
4a10: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
4a20: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d  ll[i].zName;.  }
4a30: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4a40: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65  /*.** Invoke ope
4a50: 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74  n().  Do so mult
4a60: 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69  iple times, unti
4a70: 6c 20 69 74 20 65 69 74 68 65 72 20 73 75 63 63  l it either succ
4a80: 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73  eeds or.** fails
4a90: 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e   for some reason
4aa0: 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54   other than EINT
4ab0: 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  R..**.** If the 
4ac0: 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f  file creation mo
4ad0: 64 65 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e  de "m" is 0 then
4ae0: 20 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 64   set it to the d
4af0: 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51  efault for.** SQ
4b00: 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66 61 75  Lite.  The defau
4b10: 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46  lt is SQLITE_DEF
4b20: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
4b30: 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a  SIONS (normally.
4b40: 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69  ** 0644) as modi
4b50: 66 69 65 64 20 62 79 20 74 68 65 20 73 79 73 74  fied by the syst
4b60: 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20  em umask.  If m 
4b70: 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a  is not 0, then.*
4b80: 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
4b90: 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65  creation mode be
4ba0: 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72   exactly m ignor
4bb0: 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a  ing the umask..*
4bc0: 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d  *.** The m param
4bd0: 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e  eter will be non
4be0: 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20  -zero only when 
4bf0: 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d  creating -wal, -
4c00: 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20  journal,.** and 
4c10: 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20  -shm files.  We 
4c20: 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73  want those files
4c30: 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c   to have *exactl
4c40: 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70  y* the same.** p
4c50: 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68  ermissions as th
4c60: 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
4c70: 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72  abase, unadulter
4c80: 61 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73  ated by the umas
4c90: 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61  k..** In that wa
4ca0: 79 2c 20 69 66 20 61 20 64 61 74 61 62 61 73 65  y, if a database
4cb0: 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d   file is -rw-rw-
4cc0: 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c  rw or -rw-rw-r-,
4cd0: 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61   and a.** transa
4ce0: 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e  ction crashes an
4cf0: 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20  d leaves behind 
4d00: 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  hot journals, th
4d10: 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73  en any.** proces
4d20: 73 20 74 68 61 74 20 69 73 20 61 62 6c 65 20 74  s that is able t
4d30: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  o write to the d
4d40: 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73  atabase will als
4d50: 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20  o be able to.** 
4d60: 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20  recover the hot 
4d70: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61  journals..*/.sta
4d80: 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f  tic int robust_o
4d90: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
4da0: 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74  z, int f, mode_t
4db0: 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20   m){.  int fd;. 
4dc0: 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f   mode_t m2 = m ?
4dd0: 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41   m : SQLITE_DEFA
4de0: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
4df0: 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31 29  IONS;.  while(1)
4e00: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f  {.#if defined(O_
4e10: 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20  CLOEXEC).    fd 
4e20: 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43  = osOpen(z,f|O_C
4e30: 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73  LOEXEC,m2);.#els
4e40: 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65  e.    fd = osOpe
4e50: 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69  n(z,f,m2);.#endi
4e60: 66 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  f.    if( fd<0 )
4e70: 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e  {.      if( errn
4e80: 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74 69  o==EINTR ) conti
4e90: 6e 75 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nue;.      break
4ea0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4eb0: 66 64 3e 32 20 29 20 62 72 65 61 6b 3b 0a 20 20  fd>2 ) break;.  
4ec0: 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20    osClose(fd);. 
4ed0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
4ee0: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a  QLITE_WARNING, .
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f00: 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e  "attempt to open
4f10: 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65 20   \"%s\" as file 
4f20: 64 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c 20  descriptor %d", 
4f30: 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20 3d  z, fd);.    fd =
4f40: 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f   -1;.    if( osO
4f50: 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c  pen("/dev/null",
4f60: 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61 6b   f, m)<0 ) break
4f70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d  ;.  }.  if( fd>=
4f80: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d  0 ){.    if( m!=
4f90: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
4fa0: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a  t stat statbuf;.
4fb0: 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
4fc0: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d  t(fd, &statbuf)=
4fd0: 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73 74  =0 .       && st
4fe0: 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30  atbuf.st_size==0
4ff0: 0a 20 20 20 20 20 20 20 26 26 20 28 73 74 61 74  .       && (stat
5000: 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37  buf.st_mode&0777
5010: 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20  )!=m .      ){. 
5020: 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28         osFchmod(
5030: 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  fd, m);.      }.
5040: 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65      }.#if define
5050: 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26  d(FD_CLOEXEC) &&
5060: 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f   (!defined(O_CLO
5070: 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58  EXEC) || O_CLOEX
5080: 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e  EC==0).    osFcn
5090: 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20  tl(fd, F_SETFD, 
50a0: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  osFcntl(fd, F_GE
50b0: 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f  TFD, 0) | FD_CLO
50c0: 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  EXEC);.#endif.  
50d0: 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d  }.  return fd;.}
50e0: 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
50f0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61  unctions to obta
5100: 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73  in and relinquis
5110: 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  h the global mut
5120: 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61  ex. The.** globa
5130: 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20  l mutex is used 
5140: 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 75  to protect the u
5150: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64  nixInodeInfo and
5160: 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  .** vxworksFileI
5170: 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  d objects used b
5180: 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c  y this file, all
5190: 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65   of which may be
51a0: 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d   .** shared by m
51b0: 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e  ultiple threads.
51c0: 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  .**.** Function 
51d0: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
51e0: 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72  is used to asser
51f0: 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f  t() that the glo
5200: 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73  bal mutex .** is
5210: 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
5220: 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
5230: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
5240: 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
5250: 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  t() .** statemen
5260: 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20  ts. e.g..**.**  
5270: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
5280: 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  ).**     assert(
5290: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
52a0: 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74   );.**   unixEnt
52b0: 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61  erLeave().*/.sta
52c0: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74  tic void unixEnt
52d0: 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  erMutex(void){. 
52e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
52f0: 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
5300: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
5310: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
5320: 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  R));.}.static vo
5330: 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  id unixLeaveMute
5340: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
5350: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
5360: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
5370: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5380: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
5390: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
53a0: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
53b0: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f  unixMutexHeld(vo
53c0: 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73  id) {.  return s
53d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
53e0: 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  d(sqlite3MutexAl
53f0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
5400: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
5410: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
5420: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5430: 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64  TEST) && defined
5440: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
5450: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
5460: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
5470: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
5480: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
5490: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
54a0: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
54b0: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
54c0: 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  esetation of the
54d0: 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74   supplied.** int
54e0: 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a  eger lock-type..
54f0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
5500: 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b  char *azFileLock
5510: 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b  (int eFileLock){
5520: 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65  .  switch( eFile
5530: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65  Lock ){.    case
5540: 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e   NO_LOCK: return
5550: 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73   "NONE";.    cas
5560: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
5570: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
5580: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
5590: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
55a0: 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63  RESERVED";.    c
55b0: 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ase PENDING_LOCK
55c0: 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e  : return "PENDIN
55d0: 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43  G";.    case EXC
55e0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74  LUSIVE_LOCK: ret
55f0: 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b  urn "EXCLUSIVE";
5600: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45  .  }.  return "E
5610: 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RROR";.}.#endif.
5620: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c  .#ifdef SQLITE_L
5630: 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  OCK_TRACE./*.** 
5640: 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d  Print out inform
5650: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20  ation about all 
5660: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
5670: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
5680: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
5690: 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69  or troubleshooti
56a0: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74  ng locks on mult
56b0: 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61  ithreaded.** pla
56c0: 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20  tforms.  Enable 
56d0: 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74  by compiling wit
56e0: 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c  h the -DSQLITE_L
56f0: 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d  OCK_TRACE.** com
5700: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
5710: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
5720: 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  .  This code is 
5730: 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e  normally.** turn
5740: 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  ed off..*/.stati
5750: 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28  c int lockTrace(
5760: 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20  int fd, int op, 
5770: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29  struct flock *p)
5780: 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  {.  char *zOpNam
5790: 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74  e, *zType;.  int
57a0: 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45   s;.  int savedE
57b0: 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  rrno;.  if( op==
57c0: 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_GETLK ){.    z
57d0: 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22  OpName = "GETLK"
57e0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
57f0: 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_SETLK ){.   
5800: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c   zOpName = "SETL
5810: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
5820: 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c   s = osFcntl(fd,
5830: 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c   op, p);.    sql
5840: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
5850: 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25  "fcntl unknown %
5860: 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20  d %d %d\n", fd, 
5870: 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75  op, s);.    retu
5880: 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn s;.  }.  if( 
5890: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  p->l_type==F_RDL
58a0: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
58b0: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "RDLCK";.  }el
58c0: 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  se if( p->l_type
58d0: 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20  ==F_WRLCK ){.   
58e0: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
58f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
5900: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  >l_type==F_UNLCK
5910: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
5920: 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "UNLCK";.  }else
5930: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20  {.    assert( 0 
5940: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
5950: 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45   p->l_whence==SE
5960: 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20  EK_SET );.  s = 
5970: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  osFcntl(fd, op, 
5980: 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f  p);.  savedErrno
5990: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69   = errno;.  sqli
59a0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
59b0: 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25  fcntl %d %d %s %
59c0: 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22  s %d %d %d %d\n"
59d0: 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64 2c  ,.     threadid,
59e0: 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54   fd, zOpName, zT
59f0: 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73  ype, (int)p->l_s
5a00: 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  tart, (int)p->l_
5a10: 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70  len,.     (int)p
5a20: 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69  ->l_pid, s);.  i
5a30: 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70  f( s==(-1) && op
5a40: 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d  ==F_SETLK && (p-
5a50: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
5a60: 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46   || p->l_type==F
5a70: 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73  _WRLCK) ){.    s
5a80: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a  truct flock l2;.
5a90: 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20      l2 = *p;.   
5aa0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
5ab0: 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20  ETLK, &l2);.    
5ac0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
5ad0: 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
5ae0: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
5af0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
5b00: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  2.l_type==F_WRLC
5b10: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
5b20: 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20   = "WRLCK";.    
5b30: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
5b40: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
5b50: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55        zType = "U
5b60: 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  NLCK";.    }else
5b70: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5b80: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
5b90: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
5ba0: 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65  f("fcntl-failure
5bb0: 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25  -reason: %s %d %
5bc0: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %d\n",.       
5bd0: 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c  zType, (int)l2.l
5be0: 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e  _start, (int)l2.
5bf0: 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c  l_len, (int)l2.l
5c00: 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72  _pid);.  }.  err
5c10: 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b  no = savedErrno;
5c20: 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23  .  return s;.}.#
5c30: 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64  undef osFcntl.#d
5c40: 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f  efine osFcntl lo
5c50: 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f  ckTrace.#endif /
5c60: 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  * SQLITE_LOCK_TR
5c70: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ACE */../*.** Re
5c80: 74 72 79 20 66 74 72 75 6e 63 61 74 65 28 29 20  try ftruncate() 
5c90: 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20  calls that fail 
5ca0: 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a  due to EINTR.*/.
5cb0: 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
5cc0: 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20  t_ftruncate(int 
5cd0: 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  h, sqlite3_int64
5ce0: 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   sz){.  int rc;.
5cf0: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72    do{ rc = osFtr
5d00: 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77  uncate(h,sz); }w
5d10: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
5d20: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
5d30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5d40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5d50: 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74   translates a st
5d60: 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72  andard POSIX err
5d70: 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d  no code into som
5d80: 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c  ething.** useful
5d90: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20   to the clients 
5da0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66  of the sqlite3 f
5db0: 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69  unctions.  Speci
5dc0: 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a  fically, it is.*
5dd0: 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72  * intended to tr
5de0: 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74  anslate a variet
5df0: 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22  y of "try again"
5e00: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c   errors into SQL
5e10: 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20  ITE_BUSY.** and 
5e20: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c  a variety of "pl
5e30: 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66  ease close the f
5e40: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e  ile descriptor N
5e50: 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20  OW" errors into 
5e60: 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
5e70: 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64  .** .** Errors d
5e80: 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61  uring initializa
5e90: 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f  tion of locks, o
5ea0: 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  r file system su
5eb0: 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c  pport for locks,
5ec0: 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c  .** should handl
5ed0: 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55  e ENOLCK, ENOTSU
5ee0: 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65  P, EOPNOTSUPP se
5ef0: 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  parately..*/.sta
5f00: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72  tic int sqliteEr
5f10: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
5f20: 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72  r(int posixError
5f30: 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72  , int sqliteIOEr
5f40: 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70  r) {.  switch (p
5f50: 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69 66  osixError) {.#if
5f60: 20 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70   0.  /* At one p
5f70: 6f 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20 77  oint this code w
5f80: 61 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64  as not commented
5f90: 20 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c   out. In theory,
5fa0: 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a   this branch.  *
5fb0: 2a 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  * should never b
5fc0: 65 20 68 69 74 2c 20 61 73 20 74 68 69 73 20 66  e hit, as this f
5fd0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
5fe0: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
5ff0: 74 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69  ter.  ** a locki
6000: 6e 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ng-related funct
6010: 69 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28  ion (i.e. fcntl(
6020: 29 29 20 68 61 73 20 72 65 74 75 72 6e 65 64 20  )) has returned 
6030: 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20  non-zero with.  
6040: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
6050: 65 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69 72  errno as the fir
6060: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e  st argument. Sin
6070: 63 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c  ce a system call
6080: 20 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a   has failed,.  *
6090: 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62  * errno should b
60a0: 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a  e non-zero..  **
60b0: 0a 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74 68  .  ** Despite th
60c0: 69 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65 61  is, if errno rea
60d0: 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65 20  lly is zero, we 
60e0: 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74  still don't want
60f0: 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20   to return.  ** 
6100: 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73  SQLITE_OK. The s
6110: 79 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65  ystem call faile
6120: 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51  d, and *some* SQ
6130: 4c 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75 6c  Lite error shoul
6140: 64 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67  d be.  ** propag
6150: 61 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  ated back to the
6160: 20 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74   caller. Comment
6170: 69 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68 20  ing this branch 
6180: 6f 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d  out means errno=
6190: 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  =0.  ** will be 
61a0: 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 22  handled by the "
61b0: 64 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20 62  default:" case b
61c0: 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  elow..  */.  cas
61d0: 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  e 0: .    return
61e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
61f0: 69 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41 49  if..  case EAGAI
6200: 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44  N:.  case ETIMED
6210: 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53  OUT:.  case EBUS
6220: 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a  Y:.  case EINTR:
6230: 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20  .  case ENOLCK: 
6240: 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20   .    /* random 
6250: 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c  NFS retry error,
6260: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
6270: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
6280: 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f  rt .     * intro
6290: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
62a0: 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d  ch it actually m
62b0: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
62c0: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
62d0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
62e0: 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a   .  case EACCES:
62f0: 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20   .    /* EACCES 
6300: 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64  is like EAGAIN d
6310: 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70  uring locking op
6320: 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f  erations, but no
6330: 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65  t any other time
6340: 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69  */.    if( (sqli
6350: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
6360: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c  E_IOERR_LOCK) ||
6370: 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69 74   .        (sqlit
6380: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
6390: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c  _IOERR_UNLOCK) |
63a0: 7c 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69  | .        (sqli
63b0: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
63c0: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20  E_IOERR_RDLOCK) 
63d0: 7c 7c 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69  ||.        (sqli
63e0: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
63f0: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
6400: 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20  ERVEDLOCK) ){.  
6410: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6420: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
6430: 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74    /* else fall t
6440: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65  hrough */.  case
6450: 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74   EPERM: .    ret
6460: 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
6470: 0a 20 20 20 20 0a 20 20 2f 2a 20 45 44 45 41 44  .    .  /* EDEAD
6480: 4c 4b 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69  LK is only possi
6490: 62 6c 65 20 69 66 20 61 20 63 61 6c 6c 20 74 6f  ble if a call to
64a0: 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 57 29   fcntl(F_SETLKW)
64b0: 20 69 73 20 6d 61 64 65 2e 20 41 6e 64 0a 20 20   is made. And.  
64c0: 2a 2a 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 6e  ** this module n
64d0: 65 76 65 72 20 6d 61 6b 65 73 20 73 75 63 68 20  ever makes such 
64e0: 61 20 63 61 6c 6c 2e 20 41 6e 64 20 74 68 65 20  a call. And the 
64f0: 63 6f 64 65 20 69 6e 20 53 51 4c 69 74 65 20 69  code in SQLite i
6500: 74 73 65 6c 66 20 0a 20 20 2a 2a 20 61 73 73 65  tself .  ** asse
6510: 72 74 73 20 74 68 61 74 20 53 51 4c 49 54 45 5f  rts that SQLITE_
6520: 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 69 73  IOERR_BLOCKED is
6530: 20 6e 65 76 65 72 20 72 65 74 75 72 6e 65 64 2e   never returned.
6540: 20 46 6f 72 20 74 68 65 73 65 20 72 65 61 73 6f   For these reaso
6550: 6e 73 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 73  ns.  ** this cas
6560: 65 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e  e is also commen
6570: 74 65 64 20 6f 75 74 2e 20 49 66 20 74 68 65 20  ted out. If the 
6580: 73 79 73 74 65 6d 20 64 6f 65 73 20 73 65 74 20  system does set 
6590: 65 72 72 6e 6f 20 74 6f 20 45 44 45 41 44 4c 4b  errno to EDEADLK
65a0: 2c 0a 20 20 2a 2a 20 74 68 65 20 64 65 66 61 75  ,.  ** the defau
65b0: 6c 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  lt SQLITE_IOERR_
65c0: 58 58 58 20 63 6f 64 65 20 77 69 6c 6c 20 62 65  XXX code will be
65d0: 20 72 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 23 69   returned. */.#i
65e0: 66 20 30 0a 20 20 63 61 73 65 20 45 44 45 41 44  f 0.  case EDEAD
65f0: 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 53  LK:.    return S
6600: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
6610: 4b 45 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  KED;.#endif.    
6620: 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21  .#if EOPNOTSUPP!
6630: 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20  =ENOTSUP.  case 
6640: 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20  EOPNOTSUPP: .   
6650: 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65   /* something we
6660: 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77 72 79  nt terribly awry
6670: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
6680: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
6690: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
66a0: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
66b0: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
66c0: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
66d0: 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ys */.#endif.#if
66e0: 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61  def ENOTSUP.  ca
66f0: 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20  se ENOTSUP: .   
6700: 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20   /* invalid fd, 
6710: 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69  unless during fi
6720: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
6730: 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  t introspection,
6740: 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20   in which .     
6750: 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65  * it actually me
6760: 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73  ans what it says
6770: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73   */.#endif.  cas
6780: 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42  e EIO:.  case EB
6790: 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56  ADF:.  case EINV
67a0: 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43  AL:.  case ENOTC
67b0: 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44  ONN:.  case ENOD
67c0: 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f  EV:.  case ENXIO
67d0: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a  :.  case ENOENT:
67e0: 0a 23 69 66 64 65 66 20 45 53 54 41 4c 45 20 20  .#ifdef ESTALE  
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6800: 20 20 20 2f 2a 20 45 53 54 41 4c 45 20 69 73 20     /* ESTALE is 
6810: 6e 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e 20 49  not defined on I
6820: 6e 74 65 72 69 78 20 73 79 73 74 65 6d 73 20 2a  nterix systems *
6830: 2f 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a  /.  case ESTALE:
6840: 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45  .#endif.  case E
6850: 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68  NOSYS:.    /* th
6860: 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65  ese should force
6870: 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63   the client to c
6880: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e  lose the file an
6890: 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20  d reconnect */. 
68a0: 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a     .  default: .
68b0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
68c0: 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a  eIOErr;.  }.}...
68d0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
68e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
6920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6930: 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20  ** Begin Unique 
6940: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
6950: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
6960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
6970: 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65  **.** On most ve
6980: 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20  rsions of unix, 
6990: 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69  we can get a uni
69a0: 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c  que ID for a fil
69b0: 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69  e by concatenati
69c0: 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65  ng.** the device
69d0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
69e0: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42  inode number.  B
69f0: 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  ut this does not
6a00: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
6a10: 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c  ..** On VxWorks,
6a20: 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69   a unique file i
6a30: 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64 20  d must be based 
6a40: 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  on the canonical
6a50: 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a   filename..**.**
6a60: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   A pointer to an
6a70: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
6a80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
6a90: 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65 64  ture can be used
6aa0: 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20   as a.** unique 
6ab0: 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72  file ID in VxWor
6ac0: 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e  ks.  Each instan
6ad0: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
6ae0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ture contains.**
6af0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
6b00: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
6b10: 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c 73  e.  There is als
6b20: 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  o a reference co
6b30: 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74  unt.  .** The st
6b40: 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c 61  ructure is recla
6b50: 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75  imed when the nu
6b60: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
6b70: 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a   to it drops to.
6b80: 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  ** zero..**.** T
6b90: 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 76  here are never v
6ba0: 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f  ery many files o
6bb0: 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20  pen at one time 
6bc0: 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20  and lookups are 
6bd0: 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d  not.** a perform
6be0: 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61  ance-critical pa
6bf0: 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66  th, so it is suf
6c00: 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74  ficient to put t
6c10: 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  hese.** structur
6c20: 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  es on a linked l
6c30: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76  ist..*/.struct v
6c40: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20  xworksFileId {. 
6c50: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
6c60: 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f  ileId *pNext;  /
6c70: 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74  * Next in a list
6c80: 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a   of them all */.
6c90: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cb0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
6cc0: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
6cd0: 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  one */.  int nNa
6ce0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
6cf0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
6d00: 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63   of the zCanonic
6d10: 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20  alName[] string 
6d20: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f  */.  char *zCano
6d30: 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20  nicalName;      
6d40: 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20     /* Canonical 
6d50: 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a  filename */.};..
6d60: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f  #if OS_VXWORKS./
6d70: 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65  * .** All unique
6d80: 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68   filenames are h
6d90: 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  eld on a linked 
6da0: 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20 74  list headed by t
6db0: 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a  his.** variable:
6dc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
6dd0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
6de0: 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  *vxworksFileList
6df0: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d   = 0;../*.** Sim
6e00: 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65  plify a filename
6e10: 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69   into its canoni
6e20: 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d  cal form.** by m
6e30: 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  aking the follow
6e40: 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a  ing changes:.**.
6e50: 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61  **  * removing a
6e60: 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20  ny trailing and 
6e70: 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20  duplicate /.**  
6e80: 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e  * convert /./ in
6e90: 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20  to just /.**  * 
6ea0: 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77  convert /A/../ w
6eb0: 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73 69  here A is any si
6ec0: 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a  mple name into j
6ed0: 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  ust /.**.** Chan
6ee0: 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d  ges are made in-
6ef0: 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74  place.  Return t
6f00: 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67  he new name leng
6f10: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  th..**.** The or
6f20: 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  iginal filename 
6f30: 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e  is in z[0..n-1].
6f40: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
6f50: 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63  ber of.** charac
6f60: 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70  ters in the simp
6f70: 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a  lified name..*/.
6f80: 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72  static int vxwor
6f90: 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63  ksSimplifyName(c
6fa0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
6fb0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68    int i, j;.  wh
6fc0: 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d  ile( n>1 && z[n-
6fd0: 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20  1]=='/' ){ n--; 
6fe0: 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  }.  for(i=j=0; i
6ff0: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <n; i++){.    if
7000: 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ( z[i]=='/' ){. 
7010: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
7020: 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='/' ) continue;
7030: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
7040: 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20  ]=='.' && i+2<n 
7050: 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29  && z[i+2]=='/' )
7060: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31  {.        i += 1
7070: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
7080: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
7090: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
70a0: 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b  ' && i+3<n && z[
70b0: 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69  i+2]=='.' && z[i
70c0: 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +3]=='/' ){.    
70d0: 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26      while( j>0 &
70e0: 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b  & z[j-1]!='/' ){
70f0: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
7100: 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20  if( j>0 ){ j--; 
7110: 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  }.        i += 2
7120: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
7130: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
7140: 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a  }.    z[j++] = z
7150: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20  [i];.  }.  z[j] 
7160: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b  = 0;.  return j;
7170: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
7180: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
7190: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61 62  for the given ab
71a0: 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e  solute pathname.
71b0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
71c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78 77  inter to the vxw
71d0: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
71e0: 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72  t.  This pointer
71f0: 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a   is the unique.*
7200: 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a  * file ID..**.**
7210: 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20   The nRef field 
7220: 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69  of the vxworksFi
7230: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69  leId object is i
7240: 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72  ncremented befor
7250: 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20  e.** the object 
7260: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20  is returned.  A 
7270: 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  new vxworksFileI
7280: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  d object is crea
7290: 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64  ted.** and added
72a0: 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c   to the global l
72b0: 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72 79  ist if necessary
72c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
72d0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
72e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
72f0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
7300: 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72  tic struct vxwor
7310: 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b  ksFileId *vxwork
7320: 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73  sFindFileId(cons
7330: 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74  t char *zAbsolut
7340: 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74  eName){.  struct
7350: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
7360: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a  pNew;         /*
7370: 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20   search key and 
7380: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
7390: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
73a0: 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74  ileId *pCandidat
73b0: 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  e;   /* For loop
73c0: 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e  ing over existin
73d0: 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20  g file IDs */.  
73e0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7400: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
7410: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73   zAbsoluteName s
7420: 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65  tring */..  asse
7430: 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  rt( zAbsoluteNam
7440: 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e  e[0]=='/' );.  n
7450: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
7460: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20  AbsoluteName);. 
7470: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
7480: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
7490: 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b  pNew) + (n+1) );
74a0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
74b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
74c0: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
74d0: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
74e0: 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e  [1];.  memcpy(pN
74f0: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
7500: 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  me, zAbsoluteNam
7510: 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76  e, n+1);.  n = v
7520: 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61  xworksSimplifyNa
7530: 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  me(pNew->zCanoni
7540: 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20  calName, n);..  
7550: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
7560: 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
7570: 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68  that matching th
7580: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65  e canonical name
7590: 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c  ..  ** If found,
75a0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   increment the r
75b0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61  eference count a
75c0: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
75d0: 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ter to.  ** the 
75e0: 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44  existing file ID
75f0: 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  ..  */.  unixEnt
7600: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72  erMutex();.  for
7610: 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f  (pCandidate=vxwo
7620: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61  rksFileList; pCa
7630: 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64  ndidate; pCandid
7640: 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e  ate=pCandidate->
7650: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
7660: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d  pCandidate->nNam
7670: 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65  e==n .     && me
7680: 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d  mcmp(pCandidate-
7690: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
76a0: 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61   pNew->zCanonica
76b0: 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20  lName, n)==0.   
76c0: 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74   ){.       sqlit
76d0: 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
76e0: 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65        pCandidate
76f0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
7700: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
7710: 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e  );.       return
7720: 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20   pCandidate;.   
7730: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20   }.  }..  /* No 
7740: 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e  match was found.
7750: 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61    We will make a
7760: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
7770: 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31    pNew->nRef = 1
7780: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20  ;.  pNew->nName 
7790: 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  = n;.  pNew->pNe
77a0: 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65  xt = vxworksFile
77b0: 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46  List;.  vxworksF
77c0: 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  ileList = pNew;.
77d0: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
77e0: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  ();.  return pNe
77f0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  w;.}../*.** Decr
7800: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
7810: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76  nce count on a v
7820: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
7830: 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68  ect.  Free.** th
7840: 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68  e object when th
7850: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
7860: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a  t reaches zero..
7870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
7880: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
7890: 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72  eId(struct vxwor
78a0: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a  ksFileId *pId){.
78b0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
78c0: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  ();.  assert( pI
78d0: 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  d->nRef>0 );.  p
78e0: 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Id->nRef--;.  if
78f0: 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pId->nRef==0 )
7900: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77  {.    struct vxw
7910: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b  orksFileId **pp;
7920: 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77  .    for(pp=&vxw
7930: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70  orksFileList; *p
7940: 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70  p && *pp!=pId; p
7950: 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65  p = &((*pp)->pNe
7960: 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72  xt)){}.    asser
7970: 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20  t( *pp==pId );. 
7980: 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e     *pp = pId->pN
7990: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
79a0: 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a  _free(pId);.  }.
79b0: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
79c0: 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ();.}.#endif /* 
79d0: 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
79e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
79f0: 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c  nd of Unique Fil
7a00: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
7a10: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
7a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
7a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
7a80: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
7a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
7ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69  *********** Posi
7af0: 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69  x Advisory Locki
7b00: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
7b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
7b20: 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69  **.** POSIX advi
7b30: 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62  sory locks are b
7b40: 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e  roken by design.
7b50: 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e    ANSI STD 1003.
7b60: 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74  1 (1996).** sect
7b70: 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65  ion 6.5.2.2 line
7b80: 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39  s 483 through 49
7b90: 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77  0 specify that w
7ba0: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a  hen a process.**
7bb0: 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20   sets or clears 
7bc0: 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65  a lock, that ope
7bd0: 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73  ration overrides
7be0: 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73   any prior locks
7bf0: 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73   set.** by the s
7c00: 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74  ame process.  It
7c10: 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63   does not explic
7c20: 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74  itly say so, but
7c30: 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a   this implies.**
7c40: 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64   that it overrid
7c50: 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20  es locks set by 
7c60: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
7c70: 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65   using a differe
7c80: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
7c90: 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72  iptor.  Consider
7ca0: 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a   this test case:
7cb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  .**.**       int
7cc0: 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd1 = open("./f
7cd0: 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile1", O_RDWR|O_
7ce0: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
7cf0: 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d         int fd2 =
7d00: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c   open("./file2",
7d10: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
7d20: 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75   0644);.**.** Su
7d30: 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e  ppose ./file1 an
7d40: 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65  d ./file2 are re
7d50: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69  ally the same fi
7d60: 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f  le (because.** o
7d70: 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20  ne is a hard or 
7d80: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f  symbolic link to
7d90: 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e   the other) then
7da0: 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61   if you set.** a
7db0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
7dc0: 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72   on fd1, then tr
7dd0: 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c  y to get an excl
7de0: 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e  usive lock.** on
7df0: 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20   fd2, it works. 
7e00: 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78   I would have ex
7e10: 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e  pected the secon
7e20: 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69  d lock to.** fai
7e30: 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61  l since there wa
7e40: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
7e50: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65   on the file due
7e60: 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20   to fd1..** But 
7e70: 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62  not so.  Since b
7e80: 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66  oth locks came f
7e90: 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f  rom the same pro
7ea0: 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63  cess, the.** sec
7eb0: 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68  ond overrides th
7ec0: 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68  e first, even th
7ed0: 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f  ough they were o
7ee0: 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  n different.** f
7ef0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
7f00: 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72  opened on differ
7f10: 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a  ent file names..
7f20: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73  **.** This means
7f30: 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20   that we cannot 
7f40: 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  use POSIX locks 
7f50: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66  to synchronize f
7f60: 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d  ile access.** am
7f70: 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68  ong competing th
7f80: 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d  reads of the sam
7f90: 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49  e process.  POSI
7fa0: 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72  X locks will wor
7fb0: 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e  k fine.** to syn
7fc0: 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20  chronize access 
7fd0: 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73  for threads in s
7fe0: 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65  eparate processe
7ff0: 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68  s, but not.** th
8000: 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65  reads within the
8010: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a   same process..*
8020: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
8030: 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c  und the problem,
8040: 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d   SQLite has to m
8050: 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73  anage file locks
8060: 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f   internally.** o
8070: 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e  n its own.  When
8080: 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62  ever a new datab
8090: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77  ase is opened, w
80a0: 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74  e have to find t
80b0: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69  he.** specific i
80c0: 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61  node of the data
80d0: 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69  base file (the i
80e0: 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e  node is determin
80f0: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f  ed by the.** st_
8100: 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66  dev and st_ino f
8110: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61  ields of the sta
8120: 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  t structure that
8130: 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69   fstat() fills i
8140: 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20  n).** and check 
8150: 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64  for locks alread
8160: 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68  y existing on th
8170: 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20  at inode.  When 
8180: 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65  locks are.** cre
8190: 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c  ated or removed,
81a0: 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b   we have to look
81b0: 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65   at our own inte
81c0: 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
81d0: 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73  he.** locks to s
81e0: 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68  ee if another th
81f0: 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75  read has previou
8200: 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f  sly set a lock o
8210: 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69  n that same.** i
8220: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69  node..**.** (Asi
8230: 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69  de: The use of i
8240: 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20  node numbers as 
8250: 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20  unique IDs does 
8260: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
8270: 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f  rks..** For VxWo
8280: 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20  rks, we have to 
8290: 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74  use the alternat
82a0: 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79  ive unique ID sy
82b0: 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  stem based on.**
82c0: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
82d0: 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e  ame and implemen
82e0: 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69  ted in the previ
82f0: 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a  ous division.).*
8300: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
8310: 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  _file structure 
8320: 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20  for POSIX is no 
8330: 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69  longer just an i
8340: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
8350: 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69  escriptor.  It i
8360: 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72  s now a structur
8370: 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  e that holds the
8380: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
8390: 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20   descriptor and 
83a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
83b0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
83c0: 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65  scribes the inte
83d0: 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e  rnal.** locks on
83e0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
83f0: 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65  ng inode.  There
8400: 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20   is one locking 
8410: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72  structure.** per
8420: 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68   inode, so if th
8430: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20  e same inode is 
8440: 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f  opened twice, bo
8450: 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  th unixFile stru
8460: 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20  ctures.** point 
8470: 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b  to the same lock
8480: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
8490: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  The locking stru
84a0: 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61  cture keeps.** a
84b0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
84c0: 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f   (so we will kno
84d0: 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65  w when to delete
84e0: 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22   it) and a "cnt"
84f0: 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74  .** field that t
8500: 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65  ells us its inte
8510: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73  rnal lock status
8520: 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  .  cnt==0 means 
8530: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75  the.** file is u
8540: 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d  nlocked.  cnt==-
8550: 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65  1 means the file
8560: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
8570: 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30  e lock..** cnt>0
8580: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
8590: 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   cnt shared lock
85a0: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  s on the file..*
85b0: 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74  *.** Any attempt
85c0: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
85d0: 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20  ck a file first 
85e0: 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69  checks the locki
85f0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
8600: 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79    The fcntl() sy
8610: 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c  stem call is onl
8620: 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  y invoked to set
8630: 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63   a .** POSIX loc
8640: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  k if the interna
8650: 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65  l lock structure
8660: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74   transitions bet
8670: 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64  ween.** a locked
8680: 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64   and an unlocked
8690: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75   state..**.** Bu
86a0: 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61  t wait:  there a
86b0: 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62  re yet more prob
86c0: 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20  lems with POSIX 
86d0: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a  advisory locks..
86e0: 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f  **.** If you clo
86f0: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
8700: 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73  ptor that points
8710: 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20   to a file that 
8720: 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c  has locks,.** al
8730: 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20  l locks on that 
8740: 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77  file that are ow
8750: 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
8760: 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a  nt process are.*
8770: 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20  * released.  To 
8780: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
8790: 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75   problem, each u
87a0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
87b0: 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73  ect.** maintains
87c0: 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20   a count of the 
87d0: 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e  number of pendin
87e0: 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69  g locks on tha i
87f0: 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e  node..** When an
8800: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
8810: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69   to close an uni
8820: 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20  xFile, if there 
8830: 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69  are.** other uni
8840: 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68  xFile open on th
8850: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61  e same inode tha
8860: 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f  t are holding lo
8870: 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a  cks, the call.**
8880: 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20   to close() the 
8890: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
88a0: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
88b0: 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63  l all of the loc
88c0: 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65  ks clear..** The
88d0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73   unixInodeInfo s
88e0: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61  tructure keeps a
88f0: 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65   list of file de
8900: 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e  scriptors that n
8910: 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f  eed to.** be clo
8920: 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73  sed and that lis
8930: 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64  t is walked (and
8940: 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74   cleared) when t
8950: 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20  he last lock.** 
8960: 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65  clears..**.** Ye
8970: 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65  t another proble
8980: 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73  m:  LinuxThreads
8990: 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c   do not play wel
89a0: 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63  l with posix loc
89b0: 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f  ks..**.** Many o
89c0: 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
89d0: 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c   linux use the L
89e0: 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62 72  inuxThreads libr
89f0: 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ary which is.** 
8a00: 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69  not posix compli
8a10: 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75  ant.  Under Linu
8a20: 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b  xThreads, a lock
8a30: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65   created by thre
8a40: 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62  ad.** A cannot b
8a50: 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76  e modified or ov
8a60: 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64 69  erridden by a di
8a70: 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 42  fferent thread B
8a80: 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64  ..** Only thread
8a90: 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68   A can modify th
8aa0: 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67  e lock.  Locking
8ab0: 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72   behavior is cor
8ac0: 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61  rect.** if the a
8ad0: 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74  ppliation uses t
8ae0: 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20  he newer Native 
8af0: 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69 62  Posix Thread Lib
8b00: 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f  rary (NPTL).** o
8b10: 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e  n linux - with N
8b20: 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74  PTL a lock creat
8b30: 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20 63  ed by thread A c
8b40: 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  an override lock
8b50: 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42  s.** in thread B
8b60: 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
8b70: 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61  no way to know a
8b80: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  t compile-time w
8b90: 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e  hich.** threadin
8ba0: 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65 69  g library is bei
8bb0: 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65  ng used.  So the
8bc0: 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20  re is no way to 
8bd0: 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69  know at.** compi
8be0: 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20  le-time whether 
8bf0: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20  or not thread A 
8c00: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
8c10: 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a  ks on thread B..
8c20: 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f  ** One has to do
8c30: 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63   a run-time chec
8c40: 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  k to discover th
8c50: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
8c60: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f  e.** current pro
8c70: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  cess..**.** SQLi
8c80: 74 65 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f  te used to suppo
8c90: 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e  rt LinuxThreads.
8ca0: 20 20 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f    But support fo
8cb0: 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a  r LinuxThreads.*
8cc0: 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20 62 65  * was dropped be
8cd0: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72  ginning with ver
8ce0: 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c  sion 3.7.0.  SQL
8cf0: 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77  ite will still w
8d00: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75  ork with.** Linu
8d10: 78 54 68 72 65 61 64 73 20 70 72 6f 76 69 64 65  xThreads provide
8d20: 64 20 74 68 61 74 20 28 31 29 20 74 68 65 72 65  d that (1) there
8d30: 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e   is no more than
8d40: 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   one connection 
8d50: 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73 65  .** per database
8d60: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d   file in the sam
8d70: 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32  e process and (2
8d80: 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  ) database conne
8d90: 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74  ctions.** do not
8da0: 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72   move across thr
8db0: 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  eads..*/../*.** 
8dc0: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
8dd0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
8de0: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
8df0: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
8e00: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
8e10: 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64  ticular unixInod
8e20: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  eInfo object..*/
8e30: 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65  .struct unixFile
8e40: 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76  Id {.  dev_t dev
8e50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8e60: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d     /* Device num
8e70: 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58  ber */.#if OS_VX
8e80: 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76  WORKS.  struct v
8e90: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49  xworksFileId *pI
8ea0: 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69  d;  /* Unique fi
8eb0: 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b  le ID for vxwork
8ec0: 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e  s. */.#else.  in
8ed0: 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20  o_t ino;        
8ee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f            /* Ino
8ef0: 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e  de number */.#en
8f00: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  dif.};../*.** An
8f10: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
8f20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
8f30: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
8f40: 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a  d for each open.
8f50: 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f  ** inode.  Or, o
8f60: 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20  n LinuxThreads, 
8f70: 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20  there is one of 
8f80: 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73  these structures
8f90: 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f   for.** each ino
8fa0: 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63  de opened by eac
8fb0: 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  h thread..**.** 
8fc0: 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63  A single inode c
8fd0: 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65  an have multiple
8fe0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8ff0: 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46  s, so each unixF
9000: 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ile.** structure
9010: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
9020: 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  ter to an instan
9030: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
9040: 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62  t and this.** ob
9050: 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75  ject keeps a cou
9060: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
9070: 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69   of unixFile poi
9080: 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a  nting to it..*/.
9090: 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65  struct unixInode
90a0: 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20  Info {.  struct 
90b0: 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49  unixFileId fileI
90c0: 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d;       /* The 
90d0: 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20  lookup key */.  
90e0: 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20  int nShared;    
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9100: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41  /* Number of SHA
9110: 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  RED locks held *
9120: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
9130: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
9140: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48      /* One of SH
9150: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
9160: 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f  VED_LOCK etc. */
9170: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9180: 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20   bProcessLock;  
9190: 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69     /* An exclusi
91a0: 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20  ve process lock 
91b0: 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  is held */.  int
91c0: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
91e0: 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  Number of pointe
91f0: 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63  rs to this struc
9200: 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ture */.  unixSh
9210: 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
9220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
9230: 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red memory assoc
9240: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
9250: 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  inode */.  int n
9260: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
9270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9280: 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64  mber of outstand
9290: 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a  ing file locks *
92a0: 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  /.  UnixUnusedFd
92b0: 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20   *pUnused;      
92c0: 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69      /* Unused fi
92d0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
92e0: 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69  o close */.  uni
92f0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78  xInodeInfo *pNex
9300: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
9310: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78  List of all unix
9320: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
9330: 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  s */.  unixInode
9340: 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20  Info *pPrev;    
9350: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e         /*    ...
9360: 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20  . doubly linked 
9370: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
9380: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
9390: 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  LE.  unsigned lo
93a0: 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79  ng long sharedBy
93b0: 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20  te;  /* for AFP 
93c0: 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64  simulated shared
93d0: 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a   lock */.#endif.
93e0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
93f0: 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20   sem_t *pSem;   
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9410: 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20   /* Named POSIX 
9420: 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63  semaphore */.  c
9430: 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58  har aSemName[MAX
9440: 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f  _PATHNAME+2];  /
9450: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73  * Name of that s
9460: 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64  emaphore */.#end
9470: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c  if.};../*.** A l
9480: 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78  ists of all unix
9490: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
94a0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69  s..*/.static uni
94b0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64  xInodeInfo *inod
94c0: 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  eList = 0;../*.*
94d0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
94e0: 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  on - unixLogErro
94f0: 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65  r_x(), is only e
9500: 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74  ver called via t
9510: 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78  he macro.** unix
9520: 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a  LogError()..**.*
9530: 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  * It is invoked 
9540: 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f  after an error o
9550: 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66  ccurs in an OS f
9560: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e  unction and errn
9570: 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65  o has been.** se
9580: 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73  t. It logs a mes
9590: 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74  sage using sqlit
95a0: 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e  e3_log() contain
95b0: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
95c0: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e  value of.** errn
95d0: 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62  o and, if possib
95e0: 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  le, the human-re
95f0: 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e  adable equivalen
9600: 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28  t from strerror(
9610: 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72  ) or.** strerror
9620: 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  _r()..**.** The 
9630: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
9640: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63  assed to the mac
9650: 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ro should be the
9660: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
9670: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75  .** will be retu
9680: 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28  rned to SQLite (
9690: 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  e.g. SQLITE_IOER
96a0: 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45  R_DELETE, SQLITE
96b0: 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20  _CANTOPEN). .** 
96c0: 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65  The two subseque
96d0: 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f  nt arguments sho
96e0: 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20  uld be the name 
96f0: 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69  of the OS functi
9700: 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65  on that.** faile
9710: 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22  d (e.g. "unlink"
9720: 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68  , "open") and th
9730: 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  e associated fil
9740: 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a  e-system path,.*
9750: 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65  * if any..*/.#de
9760: 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f  fine unixLogErro
9770: 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69  r(a,b,c)     uni
9780: 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  xLogErrorAtLine(
9790: 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a  a,b,c,__LINE__).
97a0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c  static int unixL
97b0: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20  ogErrorAtLine(. 
97c0: 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20   int errcode,   
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97e0: 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72   /* SQLite error
97f0: 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   code */.  const
9800: 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20   char *zFunc,   
9810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
9820: 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f  me of OS functio
9830: 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f  n that failed */
9840: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9850: 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
9860: 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20     /* File path 
9870: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
9880: 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  error */.  int i
9890: 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20  Line            
98a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
98b0: 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72  urce line number
98c0: 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63   where error occ
98d0: 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68  urred */.){.  ch
98e0: 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20  ar *zErr;       
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9900: 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74   Message from st
9910: 72 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69  rerror() or equi
9920: 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  valent */.  int 
9930: 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20  iErrno = errno; 
9940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9950: 61 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72  aved syscall err
9960: 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20  or number */..  
9970: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  /* If this is no
9980: 74 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62  t a threadsafe b
9990: 75 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52  uild (SQLITE_THR
99a0: 45 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65  EADSAFE==0), the
99b0: 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73  n use.  ** the s
99c0: 74 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69  trerror() functi
99d0: 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  on to obtain the
99e0: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
99f0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
9a00: 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  ** equivalent to
9a10: 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73   errno. Otherwis
9a20: 65 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f  e, use strerror_
9a30: 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53  r()..  */ .#if S
9a40: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
9a50: 20 26 26 20 64 65 66 69 6e 65 64 28 48 41 56 45   && defined(HAVE
9a60: 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63  _STRERROR_R).  c
9a70: 68 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20  har aErr[80];.  
9a80: 6d 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20  memset(aErr, 0, 
9a90: 73 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20  sizeof(aErr));. 
9aa0: 20 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20   zErr = aErr;.. 
9ab0: 20 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f   /* If STRERROR_
9ac0: 52 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62 79  R_CHAR_P (set by
9ad0: 20 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74   autoconf script
9ae0: 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20  s) or __USE_GNU 
9af0: 69 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a  is defined,.  **
9b00: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
9b10: 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73   system provides
9b20: 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e   the GNU version
9b30: 20 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28 29   of strerror_r()
9b40: 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 74 75 72   that.  ** retur
9b50: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
9b60: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
9b70: 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65  ing the error me
9b80: 73 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e  ssage. That poin
9b90: 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f  ter .  ** may po
9ba0: 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f  int to aErr[], o
9bb0: 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74  r it may point t
9bc0: 6f 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74  o some static st
9bd0: 6f 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e  orage somewhere.
9be0: 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65   .  ** Otherwise
9bf0: 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
9c00: 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65  e system provide
9c10: 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73  s the POSIX vers
9c20: 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72  ion of .  ** str
9c30: 65 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68  error_r(), which
9c40: 20 61 6c 77 61 79 73 20 77 72 69 74 65 73 20 61   always writes a
9c50: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
9c60: 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a  into aErr[]..  *
9c70: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f  *.  ** If the co
9c80: 64 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61  de incorrectly a
9c90: 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69  ssumes that it i
9ca0: 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73  s the POSIX vers
9cb0: 69 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ion that is.  **
9cc0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20   available, the 
9cd0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69  error message wi
9ce0: 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65  ll often be an e
9cf0: 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74  mpty string. Not
9d00: 20 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f   a.  ** huge pro
9d10: 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c  blem. Incorrectl
9d20: 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61  y concluding tha
9d30: 74 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f  t the GNU versio
9d40: 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a  n is available .
9d50: 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20    ** could lead 
9d60: 74 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74 68  to a segfault th
9d70: 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64  ough..  */.#if d
9d80: 65 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f  efined(STRERROR_
9d90: 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66  R_CHAR_P) || def
9da0: 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a  ined(__USE_GNU).
9db0: 20 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69    zErr = .# endi
9dc0: 66 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69  f.  strerror_r(i
9dd0: 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a  Errno, aErr, siz
9de0: 65 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23  eof(aErr)-1);..#
9df0: 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  elif SQLITE_THRE
9e00: 41 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73  ADSAFE.  /* This
9e10: 20 69 73 20 61 20 74 68 72 65 61 64 73 61 66 65   is a threadsafe
9e20: 20 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65   build, but stre
9e30: 72 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20  rror_r() is not 
9e40: 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20  available. */.  
9e50: 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65  zErr = "";.#else
9e60: 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64  .  /* Non-thread
9e70: 73 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20  safe build, use 
9e80: 73 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20  strerror(). */. 
9e90: 20 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72   zErr = strerror
9ea0: 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66  (iErrno);.#endif
9eb0: 0a 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30  ..  if( zPath==0
9ec0: 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20   ) zPath = "";. 
9ed0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72   sqlite3_log(err
9ee0: 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f  code,.      "os_
9ef0: 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20  unix.c:%d: (%d) 
9f00: 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20  %s(%s) - %s",.  
9f10: 20 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e      iLine, iErrn
9f20: 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c  o, zFunc, zPath,
9f30: 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65   zErr.  );..  re
9f40: 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a  turn errcode;.}.
9f50: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
9f60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
9f70: 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20  **.** We assume 
9f80: 74 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d  that close() alm
9f90: 6f 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73  ost always works
9fa0: 2c 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e  , since it is on
9fb0: 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20  ly in a.** very 
9fc0: 73 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e  sick application
9fd0: 20 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69   or on a very si
9fe0: 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74  ck platform that
9ff0: 20 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a   it might fail..
a000: 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66 61  ** If it does fa
a010: 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20  il, simply leak 
a020: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
a030: 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20  tor, but do log 
a040: 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a  the.** error..**
a050: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74  .** Note that it
a060: 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
a070: 72 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66  retry close() af
a080: 74 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20  ter EINTR since 
a090: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  the.** file desc
a0a0: 72 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76  riptor might hav
a0b0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
a0c0: 65 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72  eused by another
a0d0: 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77   thread..** So w
a0e0: 65 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79  e don't even try
a0f0: 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d   to recover from
a100: 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74   an EINTR.  Just
a110: 20 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a   log the error.*
a120: 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a  * and move on..*
a130: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f  /.static void ro
a140: 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46  bust_close(unixF
a150: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
a160: 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  h, int lineno){.
a170: 20 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29    if( osClose(h)
a180: 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45   ){.    unixLogE
a190: 72 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54  rrorAtLine(SQLIT
a1a0: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22  E_IOERR_CLOSE, "
a1b0: 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20  close",.        
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
a1d0: 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50  File ? pFile->zP
a1e0: 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29  ath : 0, lineno)
a1f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
a200: 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65  lose all file de
a210: 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75  scriptors accumu
a220: 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78  ated in the unix
a230: 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73  InodeInfo->pUnus
a240: 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61  ed list..*/ .sta
a250: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65  tic void closePe
a260: 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c  ndingFds(unixFil
a270: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69  e *pFile){.  uni
a280: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
a290: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
a2a0: 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  de;.  UnixUnused
a2b0: 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75  Fd *p;.  UnixUnu
a2c0: 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20  sedFd *pNext;.  
a2d0: 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55  for(p=pInode->pU
a2e0: 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78  nused; p; p=pNex
a2f0: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
a300: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f  p->pNext;.    ro
a310: 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
a320: 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , p->fd, __LINE_
a330: 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  _);.    sqlite3_
a340: 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70  free(p);.  }.  p
a350: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d  Inode->pUnused =
a360: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c   0;.}../*.** Rel
a370: 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65  ease a unixInode
a380: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70  Info structure p
a390: 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
a3a0: 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65  ted by findInode
a3b0: 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Info()..**.** Th
a3c0: 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20  e mutex entered 
a3d0: 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e  using the unixEn
a3e0: 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74  terMutex() funct
a3f0: 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ion must be held
a400: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
a410: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
a420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a430: 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
a440: 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  o(unixFile *pFil
a450: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
a460: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
a470: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
a480: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
a490: 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20  Held() );.  if( 
a4a0: 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20 29  ALWAYS(pInode) )
a4b0: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52  {.    pInode->nR
a4c0: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ef--;.    if( pI
a4d0: 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  node->nRef==0 ){
a4e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a4f0: 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d  Inode->pShmNode=
a500: 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  =0 );.      clos
a510: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
a520: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  e);.      if( pI
a530: 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20  node->pPrev ){. 
a540: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a550: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e  Inode->pPrev->pN
a560: 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  ext==pInode );. 
a570: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70         pInode->p
a580: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49  Prev->pNext = pI
a590: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
a5a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a5b0: 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c    assert( inodeL
a5c0: 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  ist==pInode );. 
a5d0: 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74         inodeList
a5e0: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
a5f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a600: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  if( pInode->pNex
a610: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t ){.        ass
a620: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  ert( pInode->pNe
a630: 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64  xt->pPrev==pInod
a640: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  e );.        pIn
a650: 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ode->pNext->pPre
a660: 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  v = pInode->pPre
a670: 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  v;.      }.     
a680: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
a690: 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  node);.    }.  }
a6a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
a6b0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
a6c0: 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e  r, locate the un
a6d0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
a6e0: 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72  ct that.** descr
a6f0: 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64  ibes that file d
a700: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61  escriptor.  Crea
a710: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
a720: 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a  necessary.  The.
a730: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
a740: 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69  might be uniniti
a750: 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72  alized if an err
a760: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  or occurs..**.**
a770: 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72   The mutex enter
a780: 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69  ed using the uni
a790: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75  xEnterMutex() fu
a7a0: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68  nction must be h
a7b0: 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  eld.** when this
a7c0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
a7d0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
a7e0: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
a7f0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
a800: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49  static int findI
a810: 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78  nodeInfo(.  unix
a820: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  File *pFile,    
a830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
a840: 69 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c  ix file with fil
a850: 65 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74  e desc used in t
a860: 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78  he key */.  unix
a870: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e  InodeInfo **ppIn
a880: 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ode        /* Re
a890: 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f  turn the unixIno
a8a0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65  deInfo object he
a8b0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
a8c0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
a8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73            /* Sys
a8e0: 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20  tem call return 
a8f0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64  code */.  int fd
a900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a910: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a920: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
a930: 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73  for pFile */.  s
a940: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
a950: 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a   fileId;      /*
a960: 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20   Lookup key for 
a970: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
a980: 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  o */.  struct st
a990: 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
a9a0: 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76        /* Low-lev
a9b0: 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74  el file informat
a9c0: 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ion */.  unixIno
a9d0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
a9e0: 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69   0;     /* Candi
a9f0: 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e  date unixInodeIn
aa00: 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  fo object */..  
aa10: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
aa20: 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a  xHeld() );..  /*
aa30: 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69   Get low-level i
aa40: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
aa50: 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77   the file that w
aa60: 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20  e can used to.  
aa70: 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  ** create a uniq
aa80: 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ue name for the 
aa90: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20  file..  */.  fd 
aaa0: 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63  = pFile->h;.  rc
aab0: 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26   = osFstat(fd, &
aac0: 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20  statbuf);.  if( 
aad0: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 69  rc!=0 ){.    pFi
aae0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
aaf0: 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45 4f  errno;.#ifdef EO
ab00: 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28 20  VERFLOW.    if( 
ab10: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
ab20: 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65  ==EOVERFLOW ) re
ab30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  turn SQLITE_NOLF
ab40: 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  S;.#endif.    re
ab50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
ab60: 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f  R;.  }..#ifdef _
ab70: 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e  _APPLE__.  /* On
ab80: 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f   OS X on an msdo
ab90: 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68  s filesystem, th
aba0: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69  e inode number i
abb0: 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20  s reported.  ** 
abc0: 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20  incorrectly for 
abd0: 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e  zero-size files.
abe0: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 33 32    See ticket #32
abf0: 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a  60.  To work.  *
ac00: 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  * around this pr
ac10: 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64  oblem (we consid
ac20: 65 72 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f  er it a bug in O
ac30: 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29  S X, not SQLite)
ac40: 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20  .  ** we always 
ac50: 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c  increase the fil
ac60: 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77  e size to 1 by w
ac70: 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20  riting a single 
ac80: 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20  byte.  ** prior 
ac90: 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  to accessing the
aca0: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
acb0: 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69  The one byte wri
acc0: 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20  tten is.  ** an 
acd0: 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61 63  ASCII 'S' charac
ace0: 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68  ter which also h
acf0: 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65  appens to be the
ad00: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a   first byte.  **
ad10: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
ad20: 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 20 64  f every SQLite d
ad30: 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69  atabase.  In thi
ad40: 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a  s way, if there.
ad50: 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63    ** is a race c
ad60: 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68  ondition such th
ad70: 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  at another threa
ad80: 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f  d has already po
ad90: 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65  pulated.  ** the
ada0: 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
adb0: 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20  he database, no 
adc0: 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a  damage is done..
add0: 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62    */.  if( statb
ade0: 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26  uf.st_size==0 &&
adf0: 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73   (pFile->fsFlags
ae00: 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47   & SQLITE_FSFLAG
ae10: 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29  S_IS_MSDOS)!=0 )
ae20: 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f  {.    do{ rc = o
ae30: 73 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20  sWrite(fd, "S", 
ae40: 31 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  1); }while( rc<0
ae50: 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
ae60: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
ae70: 31 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  1 ){.      pFile
ae80: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
ae90: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rno;.      retur
aea0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
aeb0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f      }.    rc = o
aec0: 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74  sFstat(fd, &stat
aed0: 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  buf);.    if( rc
aee0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  !=0 ){.      pFi
aef0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
af00: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  errno;.      ret
af10: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
af20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
af30: 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69  if..  memset(&fi
af40: 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  leId, 0, sizeof(
af50: 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65  fileId));.  file
af60: 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66  Id.dev = statbuf
af70: 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f  .st_dev;.#if OS_
af80: 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64  VXWORKS.  fileId
af90: 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49  .pId = pFile->pI
afa0: 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49  d;.#else.  fileI
afb0: 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e  d.ino = statbuf.
afc0: 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20  st_ino;.#endif. 
afd0: 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
afe0: 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  ist;.  while( pI
aff0: 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26  node && memcmp(&
b000: 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d  fileId, &pInode-
b010: 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  >fileId, sizeof(
b020: 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20  fileId)) ){.    
b030: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
b040: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
b050: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
b060: 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69     pInode = sqli
b070: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
b080: 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20  of(*pInode) );. 
b090: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30     if( pInode==0
b0a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b0b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
b0c0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
b0d0: 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f  pInode, 0, sizeo
b0e0: 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20  f(*pInode));.   
b0f0: 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d   memcpy(&pInode-
b100: 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49 64  >fileId, &fileId
b110: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
b120: 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  );.    pInode->n
b130: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e  Ref = 1;.    pIn
b140: 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f  ode->pNext = ino
b150: 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f  deList;.    pIno
b160: 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  de->pPrev = 0;. 
b170: 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74     if( inodeList
b180: 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50   ) inodeList->pP
b190: 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  rev = pInode;.  
b1a0: 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49    inodeList = pI
b1b0: 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  node;.  }else{. 
b1c0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b     pInode->nRef+
b1d0: 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64  +;.  }.  *ppInod
b1e0: 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65  e = pInode;.  re
b1f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b200: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  }.../*.** Check 
b210: 61 20 75 6e 69 78 46 69 6c 65 20 74 68 61 74 20  a unixFile that 
b220: 69 73 20 61 20 64 61 74 61 62 61 73 65 2e 20 20  is a database.  
b230: 56 65 72 69 66 79 20 74 68 65 20 66 6f 6c 6c 6f  Verify the follo
b240: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 28 31 29 20  wing:.**.** (1) 
b250: 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c 79  There is exactly
b260: 20 6f 6e 65 20 68 61 72 64 20 6c 69 6e 6b 20 6f   one hard link o
b270: 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 28 32  n the file.** (2
b280: 29 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  ) The file is no
b290: 74 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e  t a symbolic lin
b2a0: 6b 0a 2a 2a 20 28 33 29 20 54 68 65 20 66 69 6c  k.** (3) The fil
b2b0: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 72  e has not been r
b2c0: 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b  enamed or unlink
b2d0: 65 64 0a 2a 2a 0a 2a 2a 20 49 73 73 75 65 20 73  ed.**.** Issue s
b2e0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
b2f0: 45 5f 57 41 52 4e 49 4e 47 2c 2e 2e 2e 29 20 6d  E_WARNING,...) m
b300: 65 73 73 61 67 65 73 20 69 66 20 61 6e 79 74 68  essages if anyth
b310: 69 6e 67 20 69 73 20 6e 6f 74 20 72 69 67 68 74  ing is not right
b320: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b330: 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 75 6e   verifyDbFile(un
b340: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
b350: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
b360: 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  f;.  int rc;.  i
b370: 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  f( pFile->ctrlFl
b380: 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 57  ags & UNIXFILE_W
b390: 41 52 4e 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20  ARNED ){.    /* 
b3a0: 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  One or more of t
b3b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 72  he following war
b3c0: 6e 69 6e 67 73 20 68 61 76 65 20 61 6c 72 65 61  nings have alrea
b3d0: 64 79 20 62 65 65 6e 20 69 73 73 75 65 64 2e 20  dy been issued. 
b3e0: 20 44 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 72   Do not.    ** r
b3f0: 65 70 65 61 74 20 74 68 65 6d 20 73 6f 20 61 73  epeat them so as
b400: 20 6e 6f 74 20 74 6f 20 63 6c 75 74 74 65 72 20   not to clutter 
b410: 74 68 65 20 65 72 72 6f 72 20 6c 6f 67 20 2a 2f  the error log */
b420: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
b430: 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28  .  rc = osFstat(
b440: 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b  pFile->h, &buf);
b450: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
b460: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
b470: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20  SQLITE_WARNING, 
b480: 22 63 61 6e 6e 6f 74 20 66 73 74 61 74 20 64 62  "cannot fstat db
b490: 20 66 69 6c 65 20 25 73 22 2c 20 70 46 69 6c 65   file %s", pFile
b4a0: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46  ->zPath);.    pF
b4b0: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
b4c0: 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45  = UNIXFILE_WARNE
b4d0: 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  D;.    return;. 
b4e0: 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f   }.  if( buf.st_
b4f0: 6e 6c 69 6e 6b 3d 3d 30 20 26 26 20 28 70 46 69  nlink==0 && (pFi
b500: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
b510: 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 29  UNIXFILE_DELETE)
b520: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
b530: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
b540: 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 75 6e 6c  RNING, "file unl
b550: 69 6e 6b 65 64 20 77 68 69 6c 65 20 6f 70 65 6e  inked while open
b560: 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  : %s", pFile->zP
b570: 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  ath);.    pFile-
b580: 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
b590: 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20  IXFILE_WARNED;. 
b5a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b5b0: 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e   if( buf.st_nlin
b5c0: 6b 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  k>1 ){.    sqlit
b5d0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
b5e0: 52 4e 49 4e 47 2c 20 22 6d 75 6c 74 69 70 6c 65  RNING, "multiple
b5f0: 20 6c 69 6e 6b 73 20 74 6f 20 66 69 6c 65 3a 20   links to file: 
b600: 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  %s", pFile->zPat
b610: 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63  h);.    pFile->c
b620: 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
b630: 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20  FILE_WARNED;.   
b640: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
b650: 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
b660: 21 3d 30 0a 20 20 20 26 26 20 28 28 72 63 20 3d  !=0.   && ((rc =
b670: 20 6f 73 53 74 61 74 28 70 46 69 6c 65 2d 3e 7a   osStat(pFile->z
b680: 50 61 74 68 2c 20 26 62 75 66 29 29 21 3d 30 0a  Path, &buf))!=0.
b690: 20 20 20 20 20 20 20 7c 7c 20 62 75 66 2e 73 74         || buf.st
b6a0: 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e  _ino!=pFile->pIn
b6b0: 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29  ode->fileId.ino)
b6c0: 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
b6d0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
b6e0: 4e 49 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e 61  NING, "file rena
b6f0: 6d 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20  med while open: 
b700: 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  %s", pFile->zPat
b710: 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63  h);.    pFile->c
b720: 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
b730: 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20  FILE_WARNED;.   
b740: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a   return;.  }.}..
b750: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
b760: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
b770: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
b780: 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
b790: 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
b7a0: 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
b7b0: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
b7c0: 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
b7d0: 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
b7e0: 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
b7f0: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
b800: 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
b810: 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
b820: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
b830: 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
b840: 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
b850: 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
b860: 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
b870: 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
b880: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68  tatic int unixCh
b890: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
b8a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
b8b0: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
b8c0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
b8d0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
b8e0: 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
b8f0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
b900: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
b910: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
b920: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
b930: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
b940: 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61  VEDLOCK; );..  a
b950: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
b960: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
b970: 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
b980: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
b990: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
b9a0: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
b9b0: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
b9c0: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
b9d0: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
b9e0: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
b9f0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
ba00: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
ba10: 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
ba20: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
ba30: 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
ba40: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
ba50: 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
ba60: 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47  */.#ifndef __DJG
ba70: 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65  PP__.  if( !rese
ba80: 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e  rved && !pFile->
ba90: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
baa0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75  Lock ){.    stru
bab0: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
bac0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
bad0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
bae0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
baf0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
bb00: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
bb10: 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  1;.    lock.l_ty
bb20: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
bb30: 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46    if( osFcntl(pF
bb40: 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  ile->h, F_GETLK,
bb50: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
bb60: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
bb70: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
bb80: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c  LOCK;.      pFil
bb90: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
bba0: 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65  rrno;.    } else
bbb0: 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65   if( lock.l_type
bbc0: 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  !=F_UNLCK ){.   
bbd0: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
bbe0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
bbf0: 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  f.  .  unixLeave
bc00: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
bc10: 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
bc20: 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78  K %d %d %d (unix
bc30: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
bc40: 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
bc50: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
bc60: 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
bc70: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   rc;.}../*.** At
bc80: 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73  tempt to set a s
bc90: 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68  ystem-lock on th
bca0: 65 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54  e file pFile.  T
bcb0: 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64  he lock is .** d
bcc0: 65 73 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63  escribed by pLoc
bcd0: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
bce0: 70 46 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64  pFile was opened
bcf0: 20 72 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d   read/write from
bd00: 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e   unix-excl, then
bd10: 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a   the only lock.*
bd20: 2a 20 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20  * ever obtained 
bd30: 69 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  is an exclusive 
bd40: 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20  lock, and it is 
bd50: 6f 62 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79  obtained exactly
bd60: 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72   once.** the fir
bd70: 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b  st time any lock
bd80: 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20   is attempted.  
bd90: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73  All subsequent s
bda0: 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  ystem locking.**
bdb0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f   operations beco
bdc0: 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b  me no-ops.  Lock
bdd0: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73  ing operations s
bde0: 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65  till happen inte
bdf0: 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72  rnally,.** in or
be00: 64 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74  der to coordinat
be10: 65 20 61 63 63 65 73 73 20 62 65 74 77 65 65 6e  e access between
be20: 20 73 65 70 61 72 61 74 65 20 64 61 74 61 62 61   separate databa
be30: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a  se connections.*
be40: 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 70 72  * within this pr
be50: 6f 63 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f  ocess, but all o
be60: 66 20 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65  f that is handle
be70: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20  d in memory and 
be80: 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67  the.** operating
be90: 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74   system does not
bea0: 20 70 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a   participate..**
beb0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
bec0: 6e 20 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f  n is a pass-thro
bed0: 75 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53  ugh to fcntl(F_S
bee0: 45 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69  ETLK) if pFile i
bef0: 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56  s using.** any V
bf00: 46 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75  FS other than "u
bf10: 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20  nix-excl" or if 
bf20: 70 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  pFile is opened 
bf30: 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a  on "unix-excl".*
bf40: 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e  * and is read-on
bf50: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ly..**.** Zero i
bf60: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
bf70: 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73  e call completes
bf80: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f   successfully, o
bf90: 72 20 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a  r -1 if a call.*
bfa0: 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69  * to fcntl() fai
bfb0: 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ls. In this case
bfc0: 2c 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61  , errno is set a
bfd0: 70 70 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79  ppropriately (by
bfe0: 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74   fcntl())..*/.st
bff0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
c000: 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  eLock(unixFile *
c010: 70 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c  pFile, struct fl
c020: 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69  ock *pLock){.  i
c030: 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f  nt rc;.  unixIno
c040: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
c050: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
c060: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
c070: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61  texHeld() );.  a
c080: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30  ssert( pInode!=0
c090: 20 29 3b 0a 20 20 69 66 28 20 28 28 70 46 69 6c   );.  if( ((pFil
c0a0: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
c0b0: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30  NIXFILE_EXCL)!=0
c0c0: 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f   || pInode->bPro
c0d0: 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20  cessLock).   && 
c0e0: 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ((pFile->ctrlFla
c0f0: 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44  gs & UNIXFILE_RD
c100: 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20  ONLY)==0).  ){. 
c110: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62     if( pInode->b
c120: 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
c130: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66  {.      struct f
c140: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20  lock lock;.     
c150: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
c160: 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  >nLock==0 );.   
c170: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
c180: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
c190: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
c1a0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
c1b0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
c1c0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
c1d0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
c1e0: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
c1f0: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
c200: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
c210: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  K, &lock);.     
c220: 20 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75   if( rc<0 ) retu
c230: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e  rn rc;.      pIn
c240: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
c250: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e  k = 1;.      pIn
c260: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
c270: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
c280: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 0;.    }.  }
c290: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f  else{.    rc = o
c2a0: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
c2b0: 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29   F_SETLK, pLock)
c2c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
c2d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
c2e0: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
c2f0: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
c300: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
c310: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
c320: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
c330: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
c340: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
c350: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
c360: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
c370: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
c380: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
c390: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
c3a0: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
c3b0: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
c3c0: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
c3d0: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
c3e0: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
c3f0: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
c400: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
c410: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
c420: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
c430: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
c440: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
c450: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
c460: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
c470: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
c480: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
c490: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
c4a0: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
c4b0: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
c4c0: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
c4d0: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
c4e0: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
c4f0: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
c500: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
c510: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
c520: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
c530: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
c540: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
c550: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
c560: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
c570: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
c580: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
c590: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
c5a0: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
c5b0: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
c5c0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
c5d0: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
c5e0: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
c5f0: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
c600: 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71   int unixLock(sq
c610: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
c620: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
c630: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
c640: 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65  ng describes the
c650: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
c660: 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  of the various l
c670: 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  ocks and.  ** lo
c680: 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69  ck transitions i
c690: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50  n terms of the P
c6a0: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68  OSIX advisory sh
c6b0: 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69  ared and exclusi
c6c0: 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69  ve.  ** lock pri
c6d0: 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20  mitives (called 
c6e0: 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77  read-locks and w
c6f0: 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77  rite-locks below
c700: 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20  , to avoid.  ** 
c710: 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53  confusion with S
c720: 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73  QLite lock names
c730: 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d  ). The algorithm
c740: 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65  s are complicate
c750: 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20  d.  ** slightly 
c760: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
c770: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77  ompatible with w
c780: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73  indows systems s
c790: 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20  imultaneously.  
c7a0: 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  ** accessing the
c7b0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
c7c0: 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61  ile, in case tha
c7d0: 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72  t is ever requir
c7e0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79  ed..  **.  ** Sy
c7f0: 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e  mbols defined in
c800: 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20   os.h indentify 
c810: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
c820: 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65  e' and the 'rese
c830: 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c  rved.  ** byte',
c840: 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74   each single byt
c850: 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e  es at well known
c860: 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68   offsets, and th
c870: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
c880: 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61   ** range', a ra
c890: 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73  nge of 510 bytes
c8a0: 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e   at a well known
c8b0: 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20   offset..  **.  
c8c0: 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53  ** To obtain a S
c8d0: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65  HARED lock, a re
c8e0: 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ad-lock is obtai
c8f0: 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ned on the 'pend
c900: 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20  ing.  ** byte'. 
c910: 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63   If this is succ
c920: 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d  essful, a random
c930: 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27   byte from the '
c940: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
c950: 20 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d   range' is read-
c960: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c  locked and the l
c970: 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ock on the 'pend
c980: 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73  ing byte' releas
c990: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ed..  **.  ** A 
c9a0: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
c9b0: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
c9c0: 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74  ED lock after it
c9d0: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f   has a SHARED lo
c9e0: 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52  ck..  ** A RESER
c9f0: 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c  VED lock is impl
ca00: 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62  emented by grabb
ca10: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
ca20: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65   on the.  ** 're
ca30: 73 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20  served byte'. . 
ca40: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
ca50: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
ca60: 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  in a PENDING loc
ca70: 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f  k after it has o
ca80: 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53  btained a.  ** S
ca90: 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45  HARED lock. A PE
caa0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d  NDING lock is im
cab0: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
cac0: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
cad0: 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
cae0: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20  'pending byte'. 
caf0: 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
cb00: 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20  t no new SHARED 
cb10: 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a  locks can be.  *
cb20: 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20  * obtained, but 
cb30: 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20  existing SHARED 
cb40: 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65  locks are allowe
cb50: 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20  d to persist. A 
cb60: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65  process.  ** doe
cb70: 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62  s not have to ob
cb80: 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
cb90: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20  lock on the way 
cba0: 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  to a PENDING loc
cbb0: 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f  k..  ** This pro
cbc0: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79  perty is used by
cbd0: 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66   the algorithm f
cbe0: 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
cbf0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  a journal file. 
cc00: 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73   ** after a cras
cc10: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  h..  **.  ** An 
cc20: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
cc30: 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61  obtained after a
cc40: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
cc50: 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69   held, is.  ** i
cc60: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62  mplemented by ob
cc70: 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d  taining a write-
cc80: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69  lock on the enti
cc90: 72 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  re 'shared byte.
cca0: 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e    ** range'. Sin
ccb0: 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63  ce all other loc
ccc0: 6b 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61  ks require a rea
ccd0: 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66  d-lock on one of
cce0: 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20   the bytes.  ** 
ccf0: 77 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67  within this rang
cd00: 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  e, this ensures 
cd10: 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f  that no other lo
cd20: 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20  cks are held on 
cd30: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
cd40: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
cd50: 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c  e reason a singl
cd60: 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65  e byte cannot be
cd70: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
cd80: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
cd90: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73  e.  ** range' is
cda0: 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69   that some versi
cdb0: 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64  ons of windows d
cdc0: 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65  o not support re
cdd0: 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a  ad-locks. By.  *
cde0: 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64  * locking a rand
cdf0: 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72  om byte from a r
ce00: 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  ange, concurrent
ce10: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61   SHARED locks ma
ce20: 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65  y exist.  ** eve
ce30: 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  n if the locking
ce40: 20 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20   primitive used 
ce50: 69 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74  is always a writ
ce60: 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  e-lock..  */.  i
ce70: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ce80: 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
ce90: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
cea0: 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
ceb0: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
cec0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
ced0: 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f  ck;.  int tErrno
cee0: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
cef0: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
cf00: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
cf10: 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
cf20: 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c  ) pid=%d (unix)\
cf30: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
cf40: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
cf50: 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c  FileLock), azFil
cf60: 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69  eLock(pFile->eFi
cf70: 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61  leLock),.      a
cf80: 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
cf90: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
cfa0: 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ck), pFile->pIno
cfb0: 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65  de->nShared , ge
cfc0: 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20  tpid()));..  /* 
cfd0: 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
cfe0: 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
cff0: 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
d000: 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
d010: 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65  he.  ** unixFile
d020: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
d030: 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f  n't use the end_
d040: 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
d050: 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74   as.  ** unixEnt
d060: 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
d070: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
d080: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
d090: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65  le->eFileLock>=e
d0a0: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
d0b0: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
d0c0: 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
d0d0: 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29  ady held) (unix)
d0e0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
d0f0: 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
d100: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
d110: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
d120: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
d130: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
d140: 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
d150: 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  ce is correct.. 
d160: 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
d170: 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
d180: 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
d190: 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
d1a0: 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
d1b0: 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
d1c0: 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
d1d0: 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
d1e0: 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
d1f0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
d200: 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
d210: 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
d220: 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
d230: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
d240: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
d250: 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
d260: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d270: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
d280: 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  leLock!=PENDING_
d290: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
d2a0: 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53  ( eFileLock!=RES
d2b0: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
d2c0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
d2d0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
d2e0: 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20    /* This mutex 
d2f0: 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73  is needed becaus
d300: 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
d310: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
d320: 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
d330: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
d340: 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
d350: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f  le->pInode;..  /
d360: 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64  * If some thread
d370: 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
d380: 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61  has a lock via a
d390: 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46   different unixF
d3a0: 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65  ile*.  ** handle
d3b0: 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20   that precludes 
d3c0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
d3d0: 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e  ck, return BUSY.
d3e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69  .  */.  if( (pFi
d3f0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70  le->eFileLock!=p
d400: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
d410: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28   && .          (
d420: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d430: 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
d440: 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  || eFileLock>SHA
d450: 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a  RED_LOCK)).  ){.
d460: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d470: 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65  BUSY;.    goto e
d480: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
d490: 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
d4a0: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
d4b0: 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
d4c0: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
d4d0: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
d4e0: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
d4f0: 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
d500: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
d510: 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
d520: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
d530: 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
d540: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
d550: 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20  ARED_LOCK && .  
d560: 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
d570: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
d580: 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65  OCK || pInode->e
d590: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
d5a0: 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  ED_LOCK) ){.    
d5b0: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
d5c0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
d5d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
d5e0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
d5f0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
d600: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
d610: 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  >0 );.    pFile-
d620: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
d630: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  RED_LOCK;.    pI
d640: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b  node->nShared++;
d650: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  .    pInode->nLo
d660: 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ck++;.    goto e
d670: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20  nd_lock;.  }... 
d680: 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f   /* A PENDING lo
d690: 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66  ck is needed bef
d6a0: 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  ore acquiring a 
d6b0: 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SHARED lock and 
d6c0: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75  before.  ** acqu
d6d0: 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  iring an EXCLUSI
d6e0: 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68  VE lock.  For th
d6f0: 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
d700: 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a  he PENDING will.
d710: 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64    ** be released
d720: 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f  ..  */.  lock.l_
d730: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b  len = 1L;.  lock
d740: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
d750: 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c  _SET;.  if( eFil
d760: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
d770: 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46  CK .      || (eF
d780: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
d790: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
d7a0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44  ->eFileLock<PEND
d7b0: 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20  ING_LOCK).  ){. 
d7c0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
d7d0: 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
d7e0: 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b  RED_LOCK?F_RDLCK
d7f0: 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c  :F_WRLCK);.    l
d800: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
d810: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
d820: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
d830: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29  (pFile, &lock) )
d840: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
d850: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
d860: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
d870: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
d880: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
d890: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
d8a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  f( rc!=SQLITE_BU
d8b0: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  SY ){.        pF
d8c0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
d8d0: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
d8e0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
d8f0: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
d900: 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
d910: 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70  l gets to this p
d920: 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61  oint, then actua
d930: 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64  lly go ahead and
d940: 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61   make.  ** opera
d950: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c  ting system call
d960: 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  s for the specif
d970: 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ied lock..  */. 
d980: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
d990: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
d9a0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
d9b0: 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b  e->nShared==0 );
d9c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
d9d0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
d9e0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
d9f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
da00: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65  ;..    /* Now ge
da10: 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  t the read-lock 
da20: 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  */.    lock.l_st
da30: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
da40: 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ST;.    lock.l_l
da50: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
da60: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
da70: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
da80: 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45  ock) ){.      tE
da90: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
daa0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
dab0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
dac0: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
dad0: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
dae0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f     }..    /* Dro
daf0: 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
db00: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
db10: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
db20: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
db30: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
db40: 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  = 1L;.    lock.l
db50: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
db60: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
db70: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
db80: 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ck) && rc==SQLIT
db90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
dba0: 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70   This could happ
dbb0: 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72  en with a networ
dbc0: 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20  k mount */.     
dbd0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
dbe0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
dbf0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
dc00: 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28   .    }..    if(
dc10: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28   rc ){.      if(
dc20: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
dc30: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
dc40: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
dc50: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
dc60: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f       goto end_lo
dc70: 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ck;.    }else{. 
dc80: 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
dc90: 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
dca0: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  OCK;.      pInod
dcb0: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
dcc0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
dcd0: 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
dce0: 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
dcf0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
dd00: 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK && pInode->nS
dd10: 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f  hared>1 ){.    /
dd20: 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20  * We are trying 
dd30: 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65  for an exclusive
dd40: 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65   lock but anothe
dd50: 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  r thread in this
dd60: 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f  .    ** same pro
dd70: 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
dd80: 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
dd90: 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
dda0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
ddb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
ddc0: 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
ddd0: 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
dde0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
ddf0: 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
de00: 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
de10: 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
de20: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
de30: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
de40: 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
de50: 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70      assert( 0!=p
de60: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
de70: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  );.    lock.l_ty
de80: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20  pe = F_WRLCK;.. 
de90: 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65     assert( eFile
dea0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
deb0: 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
dec0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
ded0: 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c   );.    if( eFil
dee0: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
def0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f  LOCK ){.      lo
df00: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
df10: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
df20: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
df30: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
df40: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
df50: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
df60: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  .      lock.l_le
df70: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
df80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
df90: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
dfa0: 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  le, &lock) ){.  
dfb0: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
dfc0: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
dfd0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
dfe0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
dff0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
e000: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
e010: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
e020: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
e030: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
e040: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
e050: 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65   }.  }.  ..#ifde
e060: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
e070: 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 74   /* Set up the t
e080: 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74  ransaction-count
e090: 65 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69  er change checki
e0a0: 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20  ng flags when.  
e0b0: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  ** transitioning
e0c0: 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74   from a SHARED t
e0d0: 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  o a RESERVED loc
e0e0: 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20  k.  The change. 
e0f0: 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20   ** from SHARED 
e100: 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b  to RESERVED mark
e110: 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  s the beginning 
e120: 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a  of a normal.  **
e130: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
e140: 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72   (not a hot jour
e150: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20  nal rollback).. 
e160: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
e170: 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46  LITE_OK.   && pF
e180: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
e190: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26  SHARED_LOCK.   &
e1a0: 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  & eFileLock==RES
e1b0: 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a  ERVED_LOCK.  ){.
e1c0: 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
e1d0: 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20  CntrChng = 0;.  
e1e0: 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
e1f0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  e = 0;.    pFile
e200: 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
e210: 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 1;.  }.#endif.
e220: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
e230: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
e240: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
e250: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70  eFileLock;.    p
e260: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
e270: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
e280: 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
e290: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
e2a0: 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
e2b0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
e2c0: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
e2d0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
e2e0: 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
e2f0: 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a  ;.  }..end_lock:
e300: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
e310: 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
e320: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
e330: 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  s (unix)\n", pFi
e340: 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
e350: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
e360: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
e370: 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
e380: 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
e390: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
e3a0: 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  d the file descr
e3b0: 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66 69  iptor used by fi
e3c0: 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20  le handle pFile 
e3d0: 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  to the correspon
e3e0: 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20  ding.** pUnused 
e3f0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
e400: 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46  void setPendingF
e410: 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  d(unixFile *pFil
e420: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
e430: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
e440: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55  ile->pInode;.  U
e450: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d  nixUnusedFd *p =
e460: 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b   pFile->pUnused;
e470: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49  .  p->pNext = pI
e480: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20  node->pUnused;. 
e490: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
e4a0: 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68   = p;.  pFile->h
e4b0: 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e   = -1;.  pFile->
e4c0: 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a  pUnused = 0;.}..
e4d0: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
e4e0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
e4f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
e500: 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
e510: 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
e520: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
e530: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
e540: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
e550: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
e560: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
e570: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
e580: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
e590: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
e5a0: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
e5b0: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
e5c0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a  is a no-op..** .
e5d0: 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55  ** If handleNFSU
e5e0: 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74  nlock is true, t
e5f0: 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69  hen on downgradi
e600: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f  ng an EXCLUSIVE_
e610: 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a  LOCK to SHARED.*
e620: 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65  * the byte range
e630: 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   is divided into
e640: 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65   2 parts and the
e650: 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75   first part is u
e660: 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20  nlocked then.** 
e670: 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f  set to a read lo
e680: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68  ck, then the oth
e690: 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c  er part is simpl
e6a0: 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69  y unlocked.  Thi
e6b0: 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75  s works .** arou
e6c0: 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20  nd a bug in BSD 
e6d0: 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20  NFS lockd (also 
e6e0: 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31  seen on MacOSX 1
e6f0: 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73  0.3+) that fails
e700: 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74   to .** remove t
e710: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
e720: 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61   a region when a
e730: 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
e740: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
e750: 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c   posixUnlock(sql
e760: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
e770: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e  nt eFileLock, in
e780: 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  t handleNFSUnloc
e790: 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  k){.  unixFile *
e7a0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
e7b0: 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
e7c0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
e7d0: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
e7e0: 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ock;.  int rc = 
e7f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
e800: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
e810: 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
e820: 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28  K  %d %d was %d(
e830: 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75  %d,%d) pid=%d (u
e840: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
e850: 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
e860: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
e870: 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
e880: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ode->eFileLock, 
e890: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
e8a0: 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 67 65  Shared,.      ge
e8b0: 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73  tpid()));..  ass
e8c0: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
e8d0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
e8e0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
e8f0: 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
e900: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e910: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
e920: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
e930: 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
e940: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
e950: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
e960: 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
e970: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
e980: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
e990: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
e9a0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
e9b0: 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
e9c0: 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  k );..#ifdef SQL
e9d0: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
e9e0: 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61   When reducing a
e9f0: 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20   lock such that 
ea00: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
ea10: 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  can start.    **
ea20: 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
ea30: 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e  abase file again
ea40: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
ea50: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
ea60: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
ea70: 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61  was updated if a
ea80: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ny part of the d
ea90: 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
eaa0: 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66  ile changed.  If
eab0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
eac0: 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20   counter is not 
ead0: 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20  updated,.    ** 
eae0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
eaf0: 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69  s to the same fi
eb00: 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61  le might not rea
eb10: 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  lize that.    **
eb20: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68   the file has ch
eb30: 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20  anged and hence 
eb40: 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74  might not know t
eb50: 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20  o flush their.  
eb60: 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65    ** cache.  The
eb70: 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20   use of a stale 
eb80: 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74  cache can lead t
eb90: 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
eba0: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
ebb0: 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
ebc0: 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64  lWrite = 0;.#end
ebd0: 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67  if..    /* downg
ebe0: 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72  rading to a shar
ebf0: 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69  ed lock on NFS i
ec00: 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67  nvolves clearing
ec10: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a   the write lock.
ec20: 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73      ** before es
ec30: 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72  tablishing the r
ec40: 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f  eadlock - to avo
ec50: 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  id a race condit
ec60: 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65  ion we downgrade
ec70: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
ec80: 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f   in 2 blocks, so
ec90: 20 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68   that part of th
eca0: 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20  e range will be 
ecb0: 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20  covered by a .  
ecc0: 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20    ** write lock 
ecd0: 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69  until the rest i
ece0: 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72  s covered by a r
ecf0: 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a  ead lock:.    **
ed00: 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20    1:   [WWWWW]. 
ed10: 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e     **  2:   [...
ed20: 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20  .W].    **  3:  
ed30: 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20   [RRRRW].    ** 
ed40: 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20   4:   [RRRR.].  
ed50: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69    */.    if( eFi
ed60: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
ed70: 4f 43 4b 20 29 7b 0a 0a 23 69 66 20 21 64 65 66  OCK ){..#if !def
ed80: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
ed90: 7c 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c  || !SQLITE_ENABL
eda0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
edb0: 20 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64        (void)hand
edc0: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20  leNFSUnlock;.   
edd0: 20 20 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c     assert( handl
ede0: 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b  eNFSUnlock==0 );
edf0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
ee00: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
ee10: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
ee20: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
ee30: 20 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46      if( handleNF
ee40: 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  SUnlock ){.     
ee50: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20     int tErrno;  
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ee70: 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
ee80: 73 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f  system call erro
ee90: 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66  rs */.        of
eea0: 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48  f_t divSize = SH
eeb0: 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20  ARED_SIZE - 1;. 
eec0: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
eed0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
eee0: 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  UNLCK;.        l
eef0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
ef00: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
ef10: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
ef20: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
ef30: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
ef40: 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20   = divSize;.    
ef50: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
ef60: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
ef70: 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)==(-1) ){.    
ef80: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
ef90: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
efa0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
efb0: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
efc0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
efd0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
efe0: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
eff0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
f000: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
f010: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
f020: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
f030: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63     }.        loc
f040: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  k.l_type = F_RDL
f050: 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
f060: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
f070: 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
f080: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
f090: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
f0a0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
f0b0: 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
f0c0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
f0d0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d  k(pFile, &lock)=
f0e0: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
f0f0: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
f100: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
f110: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
f120: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
f130: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
f140: 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  _RDLOCK);.      
f150: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
f160: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
f170: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
f180: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
f190: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
f1a0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
f1b0: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
f1c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63     }.        loc
f1d0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
f1e0: 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
f1f0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
f200: 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
f210: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
f220: 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a  RED_FIRST+divSiz
f230: 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  e;.        lock.
f240: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
f250: 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20  IZE-divSize;.   
f260: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
f270: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
f280: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
f290: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
f2a0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
f2b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
f2c0: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
f2d0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
f2e0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
f2f0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
f300: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
f310: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
f320: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
f330: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
f340: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
f350: 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  e.#endif /* defi
f360: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
f370: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
f380: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
f390: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
f3a0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
f3b0: 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _RDLCK;.        
f3c0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
f3d0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
f3e0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
f3f0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
f400: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
f410: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
f420: 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
f430: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
f440: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
f450: 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72       /* In theor
f460: 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75  y, the call to u
f470: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61  nixFileLock() ca
f480: 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73  nnot fail becaus
f490: 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20  e another.      
f4a0: 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69      ** process i
f4b0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63  s holding an inc
f4c0: 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20  ompatible lock. 
f4d0: 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73  If it does, this
f4e0: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
f4f0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
f500: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
f510: 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67  is not following
f520: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20   the locking.   
f530: 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63         ** protoc
f540: 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ol. If this happ
f550: 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ens, return SQLI
f560: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e  TE_IOERR_RDLOCK.
f570: 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20   Returning.     
f580: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42       ** SQLITE_B
f590: 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73  USY would confus
f5a0: 65 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  e the upper laye
f5b0: 72 20 28 69 6e 20 70 72 61 63 74 69 63 65 20 69  r (in practice i
f5c0: 74 20 63 61 75 73 65 73 20 0a 20 20 20 20 20 20  t causes .      
f5d0: 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74      ** an assert
f5e0: 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20   to fail). */ . 
f5f0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
f600: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
f610: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  K;.          pFi
f620: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
f630: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
f640: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
f650: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f660: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f    }.    }.    lo
f670: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
f680: 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  LCK;.    lock.l_
f690: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
f6a0: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
f6b0: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
f6c0: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
f6d0: 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74  en = 2L;  assert
f6e0: 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31  ( PENDING_BYTE+1
f6f0: 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  ==RESERVED_BYTE 
f700: 29 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  );.    if( unixF
f710: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
f720: 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lock)==0 ){.    
f730: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
f740: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
f750: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
f760: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f770: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
f780: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
f790: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
f7a0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
f7b0: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ock;.    }.  }. 
f7c0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
f7d0: 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f  NO_LOCK ){.    /
f7e0: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
f7f0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e  shared lock coun
f800: 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68  ter.  Release th
f810: 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a  e lock using an.
f820: 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f      ** OS call o
f830: 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72  nly when all thr
f840: 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d  eads in this sam
f850: 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72  e process have r
f860: 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74  eleased.    ** t
f870: 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a  he lock..    */.
f880: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
f890: 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  red--;.    if( p
f8a0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
f8b0: 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  0 ){.      lock.
f8c0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
f8d0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
f8e0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
f8f0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
f900: 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65  tart = lock.l_le
f910: 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66  n = 0L;.      if
f920: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
f930: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20  File, &lock)==0 
f940: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
f950: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
f960: 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65  O_LOCK;.      }e
f970: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
f980: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
f990: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  NLOCK;.        p
f9a0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
f9b0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
f9c0: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
f9d0: 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
f9e0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
f9f0: 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
fa00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
fa10: 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
fa20: 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c  t the count of l
fa30: 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69  ocks against thi
fa40: 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68  s same file.  Wh
fa50: 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  en the.    ** co
fa60: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
fa70: 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65  , close any othe
fa80: 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
fa90: 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20  rs whose close. 
faa0: 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72     ** was deferr
fab0: 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75  ed because of ou
fac0: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e  tstanding locks.
fad0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f  .    */.    pIno
fae0: 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20  de->nLock--;.   
faf0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
fb00: 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20  >nLock>=0 );.   
fb10: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f   if( pInode->nLo
fb20: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ck==0 ){.      c
fb30: 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
fb40: 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
fb50: 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20  ..end_unlock:.  
fb60: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
fb70: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
fb80: 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65  TE_OK ) pFile->e
fb90: 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
fba0: 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
fbb0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
fbc0: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
fbd0: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
fbe0: 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
fbf0: 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
fc00: 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
fc10: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
fc20: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
fc30: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
fc40: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
fc50: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
fc60: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
fc70: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
fc80: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
fc90: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
fca0: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
fcb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fcc0: 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  unixUnlock(sqlit
fcd0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
fce0: 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 61   eFileLock){.  a
fcf0: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
fd00: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
fd10: 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64   ((unixFile *)id
fd20: 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  )->nFetchOut==0 
fd30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69  );.  return posi
fd40: 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c  xUnlock(id, eFil
fd50: 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 23 69  eLock, 0);.}..#i
fd60: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
fd70: 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20  P_SIZE>0.static 
fd80: 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  int unixMapfile(
fd90: 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69  unixFile *pFd, i
fda0: 36 34 20 6e 42 79 74 65 29 3b 0a 73 74 61 74 69  64 nByte);.stati
fdb0: 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70  c void unixUnmap
fdc0: 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  file(unixFile *p
fdd0: 46 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  Fd);.#endif../*.
fde0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
fdf0: 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61   performs the pa
fe00: 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73  rts of the "clos
fe10: 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f  e file" operatio
fe20: 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20  n .** common to 
fe30: 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65  all locking sche
fe40: 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74  mes. It closes t
fe50: 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  he directory and
fe60: 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73   file.** handles
fe70: 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61  , if they are va
fe80: 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c  lid, and sets al
fe90: 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  l fields of the 
fea0: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
feb0: 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  cture to 0..**.*
fec0: 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65  * It is *not* ne
fed0: 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20  cessary to hold 
fee0: 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74  the mutex when t
fef0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
ff00: 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f  alled,.** even o
ff10: 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75  n VxWorks.  A mu
ff20: 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75  tex will be acqu
ff30: 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20  ired on VxWorks 
ff40: 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b  by the.** vxwork
ff50: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29  sReleaseFileId()
ff60: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
ff70: 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69  tic int closeUni
ff80: 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69  xFile(sqlite3_fi
ff90: 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46  le *id){.  unixF
ffa0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
ffb0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69 66 20  ixFile*)id;.#if 
ffc0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
ffd0: 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 55 6e 6d  SIZE>0.  unixUnm
ffe0: 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23  apfile(pFile);.#
fff0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c  endif.  if( pFil
10000 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72  e->h>=0 ){.    r
10010 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
10020 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  e, pFile->h, __L
10030 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c  INE__);.    pFil
10040 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23  e->h = -1;.  }.#
10050 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
10060 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29  if( pFile->pId )
10070 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  {.    if( pFile-
10080 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
10090 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a  XFILE_DELETE ){.
100a0 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70        osUnlink(p
100b0 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  File->pId->zCano
100c0 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
100d0 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c  }.    vxworksRel
100e0 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65  easeFileId(pFile
100f0 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69 6c  ->pId);.    pFil
10100 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a  e->pId = 0;.  }.
10110 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45  #endif.  OSTRACE
10120 28 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c  (("CLOSE   %-3d\
10130 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
10140 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
10150 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
10160 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  e(pFile->pUnused
10170 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  );.  memset(pFil
10180 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  e, 0, sizeof(uni
10190 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72  xFile));.  retur
101a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
101b0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
101c0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
101d0 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69  t unixClose(sqli
101e0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
101f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10200 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
10210 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
10220 6c 65 20 2a 29 69 64 3b 0a 20 20 76 65 72 69 66  le *)id;.  verif
10230 79 44 62 46 69 6c 65 28 70 46 69 6c 65 29 3b 0a  yDbFile(pFile);.
10240 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c    unixUnlock(id,
10250 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69   NO_LOCK);.  uni
10260 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a  xEnterMutex();..
10270 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49    /* unixFile.pI
10280 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 76  node is always v
10290 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65 72  alid here. Other
102a0 77 69 73 65 2c 20 61 20 64 69 66 66 65 72 65 6e  wise, a differen
102b0 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75  t close.  ** rou
102c0 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63  tine (e.g. noloc
102d0 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64 20  kClose()) would 
102e0 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61  be called instea
102f0 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
10300 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
10310 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c  >nLock>0 || pFil
10320 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  e->pInode->bProc
10330 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  essLock==0 );.  
10340 69 66 28 20 41 4c 57 41 59 53 28 70 46 69 6c 65  if( ALWAYS(pFile
10350 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70 46 69  ->pInode) && pFi
10360 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
10370 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  k ){.    /* If t
10380 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
10390 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
103a0 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
103b0 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
103c0 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
103d0 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
103e0 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
103f0 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
10400 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64  he file.    ** d
10410 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
10420 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73  ode->pUnused lis
10430 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  t.  It will be a
10440 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
10450 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sed .    ** when
10460 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
10470 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  s cleared..    *
10480 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67  /.    setPending
10490 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  Fd(pFile);.  }. 
104a0 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
104b0 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d  o(pFile);.  rc =
104c0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
104d0 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  d);.  unixLeaveM
104e0 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
104f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   rc;.}../*******
10500 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
10510 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
10520 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  y lock implement
10530 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
10540 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
10550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10590 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
105a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105e0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
105f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10600 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f  ******* No-op Lo
10610 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
10620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10630 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f  ********.**.** O
10640 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
10650 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
10660 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c  tions available,
10670 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72 20   this is by far 
10680 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a  the.** simplest:
10690 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e    locking is ign
106a0 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70  ored.  No attemp
106b0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63  t is made to loc
106c0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  k the database.*
106d0 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  * file for readi
106e0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  ng or writing..*
106f0 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e  *.** This lockin
10700 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70  g mode is approp
10710 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e  riate for use on
10720 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
10730 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74  ases.** (ex: dat
10740 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65 20  abases that are 
10750 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52  burned into CD-R
10760 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  OM, for example.
10770 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73  )  It can.** als
10780 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  o be used if the
10790 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70   application emp
107a0 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e  loys some extern
107b0 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a  al mechanism to.
107c0 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c  ** prevent simul
107d0 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f  taneous access o
107e0 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  f the same datab
107f0 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f  ase by two or mo
10800 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  re.** database c
10810 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74  onnections.  But
10820 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72 69   there is a seri
10830 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61  ous risk of data
10840 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69  base.** corrupti
10850 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69  on if this locki
10860 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
10870 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68  in situations wh
10880 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ere multiple.** 
10890 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
108a0 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73 69  ions are accessi
108b0 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
108c0 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
108d0 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e   same.** time an
108e0 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  d one or more of
108f0 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f   those connectio
10900 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a  ns are writing..
10910 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  */..static int n
10920 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
10930 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
10940 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
10950 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55  t *pResOut){.  U
10960 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
10970 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65  NotUsed);.  *pRe
10980 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  sOut = 0;.  retu
10990 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
109a0 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
109b0 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
109c0 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
109d0 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
109e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
109f0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
10a00 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
10a10 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
10a20 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63   int nolockUnloc
10a30 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10a40 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
10a50 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
10a60 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
10a70 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
10a80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10a90 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
10aa0 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  se the file..*/.
10ab0 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
10ac0 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
10ad0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74  ile *id) {.  ret
10ae0 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
10af0 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  e(id);.}../*****
10b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
10b10 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20  nd of the no-op 
10b20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
10b30 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
10b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
10b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b90 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
10ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
10bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c00 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66  **** Begin dot-f
10c10 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ile Locking ****
10c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
10c40 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63   The dotfile loc
10c50 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
10c60 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78 69  ion uses the exi
10c70 73 74 65 6e 63 65 20 6f 66 20 73 65 70 61 72 61  stence of separa
10c80 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73  te lock.** files
10c90 20 28 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63   (really a direc
10ca0 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c  tory) to control
10cb0 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64   access to the d
10cc0 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 77  atabase.  This w
10cd0 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20  orks.** on just 
10ce0 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65  about every file
10cf0 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c  system imaginabl
10d00 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72  e.  But there ar
10d10 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69  e serious downsi
10d20 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  des:.**.**    (1
10d30 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f  )  There is zero
10d40 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41   concurrency.  A
10d50 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62   single reader b
10d60 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a  locks all other.
10d70 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65  **         conne
10d80 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64  ctions from read
10d90 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
10da0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
10db0 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61 70  **    (2)  An ap
10dc0 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20  plication crash 
10dd0 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61  or power loss ca
10de0 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f  n leave stale lo
10df0 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20  ck files.**     
10e00 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75      sitting arou
10e10 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  nd that need to 
10e20 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61  be cleared manua
10e30 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72  lly..**.** Never
10e40 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f  theless, a dotlo
10e50 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72  ck is an appropr
10e60 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  iate locking mod
10e70 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a  e for use if no.
10e80 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  ** other locking
10e90 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76 61   strategy is ava
10ea0 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f  ilable..**.** Do
10eb0 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f  tfile locking wo
10ec0 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  rks by creating 
10ed0 61 20 73 75 62 64 69 72 65 63 74 6f 72 79 20 69  a subdirectory i
10ee0 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
10ef0 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65 20 64  tory as.** the d
10f00 61 74 61 62 61 73 65 20 61 6e 64 20 77 69 74 68  atabase and with
10f10 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 62   the same name b
10f20 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b  ut with a ".lock
10f30 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64 64 65  " extension adde
10f40 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73 74 65  d..** The existe
10f50 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69  nce of a lock di
10f60 72 65 63 74 6f 72 79 20 69 6d 70 6c 69 65 73 20  rectory implies 
10f70 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
10f80 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a  k.  All other.**
10f90 20 6c 6f 63 6b 20 74 79 70 65 73 20 28 53 48 41   lock types (SHA
10fa0 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 50  RED, RESERVED, P
10fb0 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70 70  ENDING) are mapp
10fc0 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49 56  ed into EXCLUSIV
10fd0 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  E..*/../*.** The
10fe0 20 66 69 6c 65 20 73 75 66 66 69 78 20 61 64 64   file suffix add
10ff0 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20 62  ed to the data b
11000 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  ase filename in 
11010 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20  order to create 
11020 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65  the.** lock dire
11030 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ctory..*/.#defin
11040 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  e DOTLOCK_SUFFIX
11050 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20   ".lock"../*.** 
11060 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
11070 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
11080 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
11090 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
110a0 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
110b0 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
110c0 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
110d0 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
110e0 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
110f0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
11100 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
11110 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
11120 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
11130 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
11140 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
11150 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
11160 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
11170 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
11180 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f  ing..**.** In do
11190 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65  tfile locking, e
111a0 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69  ither a lock exi
111b0 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e  sts or it does n
111c0 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0a  ot.  So in this.
111d0 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20  ** variation of 
111e0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
111f0 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73  k(), *pResOut is
11200 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   set to true if 
11210 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68  any lock.** is h
11220 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  eld on the file 
11230 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65  and false if the
11240 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
11250 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
11260 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73   dotlockCheckRes
11270 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
11280 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
11290 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
112a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
112b0 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
112c0 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
112d0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
112e0 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
112f0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
11300 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
11310 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
11320 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
11330 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
11340 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
11350 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
11360 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
11370 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
11380 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11390 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
113a0 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68      /* Either th
113b0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  is connection or
113c0 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
113d0 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 61  ection in the sa
113e0 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a  me process.    *
113f0 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f  * holds a lock o
11400 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20  n the file.  No 
11410 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 75  need to check fu
11420 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65  rther. */.    re
11430 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65  served = 1;.  }e
11440 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
11450 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69 66 20  lock is held if 
11460 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20  and only if the 
11470 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74 73 20  lockfile exists 
11480 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
11490 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
114a0 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c  const char*)pFil
114b0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
114c0 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  t;.    reserved 
114d0 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b  = osAccess(zLock
114e0 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d  File, 0)==0;.  }
114f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
11500 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
11510 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
11520 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
11530 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52  eserved));.  *pR
11540 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
11550 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11560 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
11570 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
11580 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
11590 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
115a0 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
115b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
115c0 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
115d0 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
115e0 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
115f0 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
11600 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
11610 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
11620 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
11630 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
11640 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
11650 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
11660 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
11670 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
11680 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
11690 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
116a0 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
116b0 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
116c0 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
116d0 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
116e0 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
116f0 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
11700 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
11710 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
11720 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
11730 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
11740 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
11750 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
11760 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
11770 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
11780 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
11790 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
117a0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
117b0 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
117c0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
117d0 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
117e0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
117f0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
11800 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
11810 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
11820 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
11830 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
11840 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
11850 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
11860 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
11870 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
11880 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f  l..**.** With do
11890 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77  tfile locking, w
118a0 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75  e really only su
118b0 70 70 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a  pport state (4):
118c0 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42   EXCLUSIVE..** B
118d0 75 74 20 77 65 20 74 72 61 63 6b 20 74 68 65 20  ut we track the 
118e0 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65  other locking le
118f0 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  vels internally.
11900 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
11910 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74  otlockLock(sqlit
11920 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
11930 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
11940 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11950 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11960 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  .  char *zLockFi
11970 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69  le = (char *)pFi
11980 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
11990 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  xt;.  int rc = S
119a0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a  QLITE_OK;...  /*
119b0 20 49 66 20 77 65 20 68 61 76 65 20 61 6e 79 20   If we have any 
119c0 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c  lock, then the l
119d0 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79  ock file already
119e0 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20 77 65   exists.  All we
119f0 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f   have.  ** to do
11a00 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72 20 69   is adjust our i
11a10 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
11a20 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c  f the lock level
11a30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
11a40 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
11a50 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  NO_LOCK ){.    p
11a60 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
11a70 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
11a80 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74   /* Always updat
11a90 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20  e the timestamp 
11aa0 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20  on the old file 
11ab0 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55  */.#ifdef HAVE_U
11ac0 54 49 4d 45 0a 20 20 20 20 75 74 69 6d 65 28 7a  TIME.    utime(z
11ad0 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  LockFile, NULL);
11ae0 0a 23 65 6c 73 65 0a 20 20 20 20 75 74 69 6d 65  .#else.    utime
11af0 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c  s(zLockFile, NUL
11b00 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  L);.#endif.    r
11b10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11b20 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61  .  }.  .  /* gra
11b30 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
11b40 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73  ock */.  rc = os
11b50 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c  Mkdir(zLockFile,
11b60 20 30 37 37 37 29 3b 0a 20 20 69 66 28 20 72 63   0777);.  if( rc
11b70 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69  <0 ){.    /* fai
11b80 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61  led to open/crea
11b90 74 65 20 74 68 65 20 6c 6f 63 6b 20 64 69 72 65  te the lock dire
11ba0 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74  ctory */.    int
11bb0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
11bc0 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54 20  .    if( EEXIST 
11bd0 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  == tErrno ){.   
11be0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
11bf0 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  USY;.    } else 
11c00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
11c10 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
11c20 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
11c30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
11c40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
11c50 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
11c60 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
11c70 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
11c80 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
11c90 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
11ca0 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 67  ;.  } .  .  /* g
11cb0 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
11cc0 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
11cd0 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46  k */.  pFile->eF
11ce0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
11cf0 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
11d00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
11d10 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
11d20 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
11d30 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
11d40 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
11d50 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
11d60 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
11d70 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
11d80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
11d90 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
11da0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11db0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
11dc0 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
11dd0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
11de0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
11df0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
11e00 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
11e10 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65  locking level re
11e20 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64  aches NO_LOCK, d
11e30 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
11e40 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
11e50 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  nt dotlockUnlock
11e60 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
11e70 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
11e80 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
11e90 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
11ea0 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a  e*)id;.  char *z
11eb0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
11ec0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
11ed0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
11ee0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
11ef0 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
11f00 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
11f10 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
11f20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
11f30 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
11f40 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
11f50 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
11f60 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73  getpid()));.  as
11f70 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
11f80 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
11f90 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
11fa0 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
11fb0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
11fc0 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock==eFileLock )
11fd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
11fe0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
11ff0 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74  * To downgrade t
12000 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79  o shared, simply
12010 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
12020 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74  rnal notion of t
12030 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61  he.  ** lock sta
12040 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  te.  No need to 
12050 6d 65 73 73 20 77 69 74 68 20 74 68 65 20 66 69  mess with the fi
12060 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  le on disk..  */
12070 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
12080 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
12090 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
120a0 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
120b0 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
120c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
120d0 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20   .  /* To fully 
120e0 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
120f0 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ase, delete the 
12100 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61  lock file */.  a
12110 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
12120 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72  ==NO_LOCK );.  r
12130 63 20 3d 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63  c = osRmdir(zLoc
12140 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  kFile);.  if( rc
12150 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f  <0 && errno==ENO
12160 54 44 49 52 20 29 20 72 63 20 3d 20 6f 73 55 6e  TDIR ) rc = osUn
12170 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b  link(zLockFile);
12180 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20  .  if( rc<0 ){. 
12190 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
121a0 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  errno;.    rc = 
121b0 30 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45 4e  0;.    if( ENOEN
121c0 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  T != tErrno ){. 
121d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
121e0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
121f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f     }.    if( IS_
12200 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
12210 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
12220 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
12230 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
12240 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
12250 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
12260 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
12270 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12280 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
12290 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  file.  Make sure
122a0 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
122b0 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f  en released befo
122c0 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73  re closing..*/.s
122d0 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
122e0 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
122f0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
12300 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12310 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
12320 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
12330 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
12340 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c  ;.    dotlockUnl
12350 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
12360 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
12370 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
12380 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72  gContext);.    r
12390 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
123a0 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
123b0 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  urn rc;.}./*****
123c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
123d0 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c  d of the dot-fil
123e0 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
123f0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
12400 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
12410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12450 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
12460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
124a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
124b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
124c0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63  ***** Begin floc
124d0 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  k Locking ******
124e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
124f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
12500 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29   Use the flock()
12510 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
12520 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e  do file locking.
12530 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c  .**.** flock() l
12540 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
12550 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  ot-file locking 
12560 69 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69  in that the vari
12570 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69  ous.** fine-grai
12580 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  n locking levels
12590 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51   supported by SQ
125a0 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73  Lite are collaps
125b0 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ed into.** a sin
125c0 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  gle exclusive lo
125d0 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ck.  In other wo
125e0 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53  rds, SHARED, RES
125f0 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45  ERVED, and.** PE
12600 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20  NDING locks are 
12610 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61  the same thing a
12620 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
12630 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20  ock.  SQLite.** 
12640 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e  still works when
12650 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75   you do this, bu
12660 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73  t concurrency is
12670 20 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a   reduced since.*
12680 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
12690 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72  process can be r
126a0 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
126b0 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a  ase at a time..*
126c0 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73  *.** Omit this s
126d0 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45  ection if SQLITE
126e0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
126f0 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20  STYLE is turned 
12700 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d  off or if.** com
12710 70 69 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52  piling for VXWOR
12720 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  KS..*/.#if SQLIT
12730 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
12740 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
12750 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  WORKS../*.** Ret
12760 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73  ry flock() calls
12770 20 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20   that fail with 
12780 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20  EINTR.*/.#ifdef 
12790 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74  EINTR.static int
127a0 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e   robust_flock(in
127b0 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20  t fd, int op){. 
127c0 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72   int rc;.  do{ r
127d0 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29  c = flock(fd,op)
127e0 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
127f0 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
12800 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12810 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
12820 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62  robust_flock(a,b
12830 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e  ) flock(a,b).#en
12840 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  dif.     ../*.**
12850 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
12860 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
12870 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
12880 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
12890 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
128a0 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
128b0 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
128c0 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
128d0 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
128e0 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
128f0 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
12900 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
12910 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
12920 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
12930 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
12940 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
12950 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
12960 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
12970 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
12980 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  int flockCheckRe
12990 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
129a0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
129b0 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
129c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
129d0 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
129e0 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
129f0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
12a00 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
12a10 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
12a20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
12a30 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
12a40 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
12a50 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
12a60 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
12a70 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
12a80 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
12a90 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
12aa0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
12ab0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
12ac0 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
12ad0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
12ae0 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
12af0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
12b00 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
12b10 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
12b20 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74  ed ){.    /* att
12b30 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  empt to get the 
12b40 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lock */.    int 
12b50 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f  lrc = robust_flo
12b60 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
12b70 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b  K_EX | LOCK_NB);
12b80 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b  .    if( !lrc ){
12b90 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68  .      /* got th
12ba0 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  e lock, unlock i
12bb0 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  t */.      lrc =
12bc0 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46   robust_flock(pF
12bd0 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
12be0 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63  ;.      if ( lrc
12bf0 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74   ) {.        int
12c00 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
12c10 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f  .        /* unlo
12c20 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  ck failed with a
12c30 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
12c40 20 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f     lrc = SQLITE_
12c50 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20  IOERR_UNLOCK; . 
12c60 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
12c70 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
12c80 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
12c90 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
12ca0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
12cb0 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20  rc = lrc;.      
12cc0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12cd0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69  } else {.      i
12ce0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
12cf0 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  o;.      reserve
12d00 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  d = 1;.      /* 
12d10 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67  someone else mig
12d20 68 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72  ht have it reser
12d30 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ved */.      lrc
12d40 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
12d50 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
12d60 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
12d70 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20  R_LOCK); .      
12d80 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
12d90 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
12da0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
12db0 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
12dc0 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
12dd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12de0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
12df0 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
12e00 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %d (flock)\n", p
12e10 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
12e20 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65 66  erved));..#ifdef
12e30 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
12e40 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
12e50 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c  .  if( (rc & SQL
12e60 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
12e70 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
12e80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
12e90 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31  ;.    reserved=1
12ea0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
12eb0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
12ec0 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
12ed0 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  */.  *pResOut = 
12ee0 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
12ef0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12f00 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
12f10 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
12f20 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
12f30 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
12f40 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
12f50 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
12f60 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
12f70 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
12f80 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
12f90 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
12fa0 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
12fb0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
12fc0 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
12fd0 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
12fe0 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
12ff0 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
13000 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
13010 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
13020 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
13030 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
13040 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
13050 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
13060 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
13070 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
13080 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
13090 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
130a0 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
130b0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
130c0 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
130d0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
130e0 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
130f0 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
13100 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
13110 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
13120 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
13130 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
13140 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
13150 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
13160 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
13170 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
13180 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
13190 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
131a0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
131b0 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20  ** flock() only 
131c0 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45  really support E
131d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20  XCLUSIVE locks. 
131e0 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d   We track interm
131f0 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73  ediate.** lock s
13200 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c  tates in the sql
13210 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74  ite3_file struct
13220 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63  ure, but all loc
13230 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20  ks SHARED or.** 
13240 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79  above are really
13250 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
13260 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c   and exclude all
13270 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
13280 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20   from.** access 
13290 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
132a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
132b0 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
132c0 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
132d0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
132e0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
132f0 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
13300 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
13310 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28  c int flockLock(
13320 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13330 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
13340 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
13350 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
13360 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
13370 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  ixFile*)id;..  a
13380 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
13390 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
133a0 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
133b0 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
133c0 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
133d0 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
133e0 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
133f0 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
13400 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e  e->eFileLock > N
13410 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
13420 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
13430 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
13440 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13450 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
13460 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
13470 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20  lock */.  .  if 
13480 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46  (robust_flock(pF
13490 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20  ile->h, LOCK_EX 
134a0 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20  | LOCK_NB)) {.  
134b0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
134c0 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64  rrno;.    /* did
134d0 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65  n't get, must be
134e0 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20   busy */.    rc 
134f0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
13500 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
13510 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
13520 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
13530 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
13540 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
13550 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
13560 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  rrno;.    }.  } 
13570 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f  else {.    /* go
13580 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
13590 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
135a0 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   */.    pFile->e
135b0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
135c0 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  Lock;.  }.  OSTR
135d0 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
135e0 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e   %s %s (flock)\n
135f0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
13600 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
13610 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  k), .           
13620 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
13630 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
13640 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
13650 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
13660 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
13670 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
13680 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
13690 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
136a0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
136b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
136c0 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
136d0 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
136e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
136f0 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
13700 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
13710 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
13720 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
13730 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
13740 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
13750 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
13760 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
13770 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
13780 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
13790 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
137a0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
137b0 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
137c0 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
137d0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
137e0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
137f0 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e  atic int flockUn
13800 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
13810 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
13820 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
13830 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
13840 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
13850 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
13860 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
13870 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
13880 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29  d pid=%d (flock)
13890 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
138a0 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
138b0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
138c0 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29  eLock, getpid())
138d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
138e0 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
138f0 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
13900 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
13910 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
13920 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c  >eFileLock==eFil
13930 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
13940 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13950 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65   }.  .  /* share
13960 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65  d can just be se
13970 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77  t because we alw
13980 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c  ays have an excl
13990 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65  usive */.  if (e
139a0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
139b0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
139c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
139d0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
139e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
139f0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c  .  }.  .  /* no,
13a00 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e   really, unlock.
13a10 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74   */.  if( robust
13a20 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
13a30 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66   LOCK_UN) ){.#if
13a40 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
13a50 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
13a60 4f 52 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ORS.    return S
13a70 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
13a80 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
13a90 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
13aa0 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ORS */.    retur
13ab0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  n SQLITE_IOERR_U
13ac0 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NLOCK;.  }else{.
13ad0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
13ae0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
13af0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13b00 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
13b10 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
13b20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
13b30 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
13b40 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
13b50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13b60 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  OK;.  if( id ){.
13b70 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28      flockUnlock(
13b80 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
13b90 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
13ba0 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  File(id);.  }.  
13bb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
13bc0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
13bd0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
13be0 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
13bf0 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  K */../*********
13c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
13c10 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b  f the flock lock
13c20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c40 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
13c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c90 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
13ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ce0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
13cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
13d00 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61  Begin Named Sema
13d10 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a  phore Locking **
13d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d30 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d  ******.**.** Nam
13d40 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
13d50 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70  king is only sup
13d60 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b  ported on VxWork
13d70 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f  s..**.** Semapho
13d80 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  re locking is li
13d90 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20  ke dot-lock and 
13da0 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74  flock in that it
13db0 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20   really only.** 
13dc0 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49  supports EXCLUSI
13dd0 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c  VE locking.  Onl
13de0 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  y a single proce
13df0 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77  ss can read or w
13e00 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  rite.** the data
13e10 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20 74  base file at a t
13e20 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75 63  ime.  This reduc
13e30 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e  es potential con
13e40 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a  currency, but.**
13e50 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20   makes the lock 
13e60 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
13e70 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23  uch easier..*/.#
13e80 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f  if OS_VXWORKS../
13e90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13ea0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
13eb0 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
13ec0 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
13ed0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
13ee0 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
13ef0 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
13f00 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
13f10 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
13f20 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
13f30 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
13f40 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
13f50 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
13f60 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
13f70 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
13f80 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
13f90 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
13fa0 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
13fb0 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
13fc0 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65 63 6b  tic int semCheck
13fd0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
13fe0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13ff0 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
14000 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14010 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
14020 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
14030 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
14040 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
14050 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
14060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
14070 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
14080 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
14090 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
140a0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
140b0 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
140c0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
140d0 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
140e0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
140f0 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
14100 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
14110 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
14120 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
14130 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
14140 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
14150 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
14160 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a  d ){.    sem_t *
14170 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
14180 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20  node->pSem;.    
14190 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
141a0 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20 73 65  Buf;..    if( se
141b0 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
141c0 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =-1 ){.      int
141d0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
141e0 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41 49  .      if( EAGAI
141f0 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  N != tErrno ){. 
14200 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
14210 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
14220 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
14230 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
14240 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20  RESERVEDLOCK);. 
14250 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
14260 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
14270 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
14280 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65  .        /* some
14290 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68 65  one else has the
142a0 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72   lock when we ar
142b0 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a  e in NO_LOCK */.
142c0 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
142d0 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65   = (pFile->eFile
142e0 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f  Lock < SHARED_LO
142f0 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
14300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
14310 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69   we could have i
14320 74 20 69 66 20 77 65 20 77 61 6e 74 20 69 74 20  t if we want it 
14330 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73  */.      sem_pos
14340 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  t(pSem);.    }. 
14350 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
14360 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
14370 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70  d %d (sem)\n", p
14380 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
14390 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
143a0 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
143b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
143c0 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
143d0 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
143e0 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
143f0 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
14400 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
14410 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
14420 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
14430 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
14440 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
14450 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
14460 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
14470 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
14480 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
14490 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
144a0 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
144b0 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
144c0 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
144d0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
144e0 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
144f0 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
14500 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
14510 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
14520 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
14530 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
14540 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
14550 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
14560 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
14570 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
14580 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
14590 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
145a0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
145b0 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
145c0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
145d0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
145e0 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
145f0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
14600 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
14610 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
14620 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
14630 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
14640 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
14650 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
14660 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
14670 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68  IVE.**.** Semaph
14680 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72  ore locks only r
14690 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
146a0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
146b0 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
146c0 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
146d0 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
146e0 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
146f0 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
14700 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
14710 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
14720 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
14730 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
14740 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
14750 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
14760 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
14770 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
14780 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
14790 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
147a0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
147b0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
147c0 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
147d0 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
147e0 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c   int semLock(sql
147f0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
14800 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
14810 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
14820 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
14830 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 73  d;.  int fd;.  s
14840 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
14850 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
14860 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
14870 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66  ITE_OK;..  /* if
14880 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
14890 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
148a0 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
148b0 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
148c0 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
148d0 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
148e0 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if (pFile->eFile
148f0 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  Lock > NO_LOCK) 
14900 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
14910 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
14920 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ck;.    rc = SQL
14930 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
14940 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
14950 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20   }.  .  /* lock 
14960 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75  semaphore now bu
14970 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20  t bail out when 
14980 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20  already locked. 
14990 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79  */.  if( sem_try
149a0 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  wait(pSem)==-1 )
149b0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
149c0 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
149d0 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
149e0 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c   }..  /* got it,
149f0 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
14a00 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
14a10 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
14a20 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a  k = eFileLock;..
14a30 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20   sem_end_lock:. 
14a40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14a50 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
14a60 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
14a70 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
14a80 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
14a90 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
14aa0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
14ab0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
14ac0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
14ad0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
14ae0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
14af0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
14b00 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
14b10 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
14b20 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
14b30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
14b40 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
14b50 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f  atic int semUnlo
14b60 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
14b70 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
14b80 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
14b90 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
14ba0 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
14bb0 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
14bc0 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20  pInode->pSem;.. 
14bd0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
14be0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d  ;.  assert( pSem
14bf0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
14c00 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
14c10 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d  s %d pid=%d (sem
14c20 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
14c30 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
14c40 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
14c50 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29  leLock, getpid()
14c60 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
14c70 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
14c80 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
14c90 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
14ca0 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
14cb0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
14cc0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
14cd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14ce0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
14cf0 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
14d00 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
14d10 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
14d20 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
14d30 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
14d40 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
14d50 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
14d60 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
14d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14d80 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
14d90 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e  , really unlock.
14da0 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70   */.  if ( sem_p
14db0 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20  ost(pSem)==-1 ) 
14dc0 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45  {.    int rc, tE
14dd0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
14de0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
14df0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
14e00 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
14e10 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
14e20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
14e30 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
14e40 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
14e50 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
14e60 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
14e70 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  ; .  }.  pFile->
14e80 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
14e90 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  OCK;.  return SQ
14ea0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20  LITE_OK;.}../*. 
14eb0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
14ec0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
14ed0 73 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  semClose(sqlite3
14ee0 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
14ef0 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
14f00 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
14f10 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
14f20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20    semUnlock(id, 
14f30 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73  NO_LOCK);.    as
14f40 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
14f50 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
14f60 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  x();.    release
14f70 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
14f80 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
14f90 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73  utex();.    clos
14fa0 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
14fb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
14fc0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
14fd0 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
14fe0 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  /./*.** Named se
14ff0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
15000 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
15010 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  e on VxWorks..**
15020 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
15030 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65   End of the name
15040 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
15050 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
15060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15070 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
15080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
150a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
150b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
150c0 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
150d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
150e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
150f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15110 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
15120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
15130 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67  egin AFP Locking
15140 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
15150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15160 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20  **.**.** AFP is 
15170 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67  the Apple Filing
15180 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20   Protocol.  AFP 
15190 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c  is a network fil
151a0 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a  esystem found.**
151b0 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74   on Apple Macint
151c0 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20  osh computers - 
151d0 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58  both OS9 and OSX
151e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61  ..**.** Third-pa
151f0 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  rty implementati
15200 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65 20 61  ons of AFP are a
15210 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74  vailable.  But t
15220 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  his code here.**
15230 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f   only works on O
15240 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69  SX..*/..#if defi
15250 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
15260 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
15270 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
15280 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69  .** The afpLocki
15290 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  ngContext struct
152a0 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ure contains all
152b0 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66   afp lock specif
152c0 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65  ic state.*/.type
152d0 64 65 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f  def struct afpLo
152e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70  ckingContext afp
152f0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
15300 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
15310 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74  gContext {.  int
15320 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e   reserved;.  con
15330 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b  st char *dbPath;
15340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15350 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Name of the open
15360 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72   file */.};..str
15370 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
15380 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65  kPB2.{.  unsigne
15390 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
153a0 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66  et;        /* of
153b0 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79  fset to first by
153c0 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  te to lock */.  
153d0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
153e0 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20  ng length;      
153f0 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65    /* nbr of byte
15400 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  s to lock */.  u
15410 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
15420 67 20 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b  g retRangeStart;
15430 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62   /* nbr of 1st b
15440 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75  yte locked if su
15450 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e  ccessful */.  un
15460 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f  signed char unLo
15470 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20  ckFlag;         
15480 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30  /* 1 = unlock, 0
15490 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73   = lock */.  uns
154a0 69 67 6e 65 64 20 63 68 61 72 20 73 74 61 72 74  igned char start
154b0 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  EndFlag;       /
154c0 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f  * 1=rel to end o
154d0 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f  f fork, 0=rel to
154e0 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20   start */.  int 
154f0 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15510 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73   file desc to as
15520 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69  soc this lock wi
15530 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e  th */.};..#defin
15540 65 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  e afpfsByteRange
15550 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20  Lock2FSCTL      
15560 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c    _IOWR('z', 23,
15570 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
15580 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a  eLockPB2)../*.**
15590 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69   This is a utili
155a0 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67 20 6f  ty for setting o
155b0 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62 69 74  r clearing a bit
155c0 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61  -range lock on a
155d0 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73 79 73  n.** AFP filesys
155e0 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75  tem..** .** Retu
155f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
15600 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f  success, SQLITE_
15610 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e  BUSY on failure.
15620 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
15630 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e  fpSetLock(.  con
15640 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20  st char *path,  
15650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15660 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
15670 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20  to be locked or 
15680 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  unlocked */.  un
15690 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
156b0 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
156c0 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a  ptor on path */.
156d0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
156e0 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20  long offset,    
156f0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 74   /* First byte t
15700 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  o be locked */. 
15710 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
15720 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20  ong length,     
15730 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
15740 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  es to lock */.  
15750 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  int setLockFlag 
15760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15770 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f  * True to set lo
15780 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c  ck.  False to cl
15790 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  ear lock */.){. 
157a0 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
157b0 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20 69  eLockPB2 pb;.  i
157c0 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e  nt err;.  .  pb.
157d0 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74  unLockFlag = set
157e0 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31  LockFlag ? 0 : 1
157f0 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46  ;.  pb.startEndF
15800 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66  lag = 0;.  pb.of
15810 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20  fset = offset;. 
15820 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e   pb.length = len
15830 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20  gth; .  pb.fd = 
15840 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f  pFile->h;.  .  O
15850 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c  STRACE(("AFPSETL
15860 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64 25  OCK [%s] for %d%
15870 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a  s in range %llx:
15880 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73  %llx\n", .    (s
15890 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a  etLockFlag?"ON":
158a0 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68  "OFF"), pFile->h
158b0 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74  , (pb.fd==-1?"[t
158c0 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a  estval-1]":""),.
158d0 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67      offset, leng
158e0 74 68 29 29 3b 0a 20 20 65 72 72 20 3d 20 66 73  th));.  err = fs
158f0 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42  ctl(path, afpfsB
15900 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
15910 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69  TL, &pb, 0);.  i
15920 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a  f ( err==-1 ) {.
15930 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
15940 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
15950 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  no;.    OSTRACE(
15960 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69  ("AFPSETLOCK fai
15970 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27  led to fsctl() '
15980 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20  %s' %d %s\n",.  
15990 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68 2c             path,
159a0 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f   tErrno, strerro
159b0 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66  r(tErrno)));.#if
159c0 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
159d0 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
159e0 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  S.    rc = SQLIT
159f0 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20  E_BUSY;.#else.  
15a00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
15a10 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
15a20 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  (tErrno,.       
15a30 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
15a40 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54  LockFlag ? SQLIT
15a50 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53  E_IOERR_LOCK : S
15a60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
15a70 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  CK);.#endif /* S
15a80 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
15a90 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
15aa0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
15ab0 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
15ac0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15ad0 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
15ae0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
15af0 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  c;.  } else {.  
15b00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15b10 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
15b20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
15b30 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
15b40 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
15b50 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
15b60 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
15b70 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
15b80 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
15b90 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
15ba0 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
15bb0 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
15bc0 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
15bd0 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
15be0 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
15bf0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
15c00 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
15c10 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
15c20 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
15c30 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
15c40 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
15c50 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73 65  int afpCheckRese
15c60 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
15c70 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
15c80 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
15c90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15ca0 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
15cb0 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
15cc0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
15cd0 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b  e*)id;.  afpLock
15ce0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
15cf0 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61  ext;.  .  Simula
15d00 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
15d10 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
15d20 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
15d30 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
15d40 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 63 6f 6e  ( pFile );.  con
15d50 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
15d60 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
15d70 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
15d80 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65 78  xt;.  if( contex
15d90 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20  t->reserved ){. 
15da0 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b     *pResOut = 1;
15db0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15dc0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
15dd0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
15de0 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
15df0 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
15e00 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
15e10 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63   */.  .  /* Chec
15e20 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
15e30 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
15e40 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
15e50 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
15e60 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
15e70 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
15e80 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
15e90 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
15ea0 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
15eb0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
15ec0 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20  ss holds it..   
15ed0 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
15ee0 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63  ed ){.    /* loc
15ef0 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62  k the RESERVED b
15f00 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  yte */.    int l
15f10 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
15f20 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
15f30 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
15f40 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20  _BYTE, 1,1);  . 
15f50 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
15f60 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  ==lrc ){.      /
15f70 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65  * if we succeede
15f80 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20  d in taking the 
15f90 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75  reserved lock, u
15fa0 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74  nlock it to rest
15fb0 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ore.      ** the
15fc0 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
15fd0 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61  */.      lrc = a
15fe0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
15ff0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16000 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
16010 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c   1, 0);.    } el
16020 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  se {.      /* if
16030 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65   we failed to ge
16040 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20  t the lock then 
16050 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73  someone else mus
16060 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20  t have it */.   
16070 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
16080 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
16090 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
160a0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72  ) ){.      rc=lr
160b0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  c;.    }.  }.  .
160c0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
160d0 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
160e0 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
160f0 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  %d %d (afp)\n", 
16100 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
16110 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a  served));.  .  *
16120 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
16130 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
16140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
16150 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
16160 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
16170 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
16180 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
16190 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
161a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
161b0 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
161c0 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
161d0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
161e0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
161f0 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
16200 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
16210 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
16220 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
16230 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
16240 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
16250 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
16260 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
16270 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
16280 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
16290 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
162a0 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
162b0 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
162c0 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
162d0 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
162e0 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
162f0 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
16300 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
16310 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
16320 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
16330 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
16340 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
16350 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
16360 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
16370 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
16380 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
16390 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
163a0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
163b0 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
163c0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
163d0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
163e0 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
163f0 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
16400 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
16410 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
16420 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
16430 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
16440 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
16450 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
16460 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
16470 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74  nt afpLock(sqlit
16480 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
16490 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69   eFileLock){.  i
164a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
164b0 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
164c0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
164d0 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
164e0 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
164f0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
16500 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
16510 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
16520 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
16530 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
16540 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
16550 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
16560 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
16570 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25  K    %d %s was %
16580 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20  s(%s,%d) pid=%d 
16590 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
165a0 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
165b0 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
165c0 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  ock), azFileLock
165d0 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
165e0 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  k),.           a
165f0 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65  zFileLock(pInode
16600 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49  ->eFileLock), pI
16610 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20  node->nShared , 
16620 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f  getpid()));..  /
16630 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
16640 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
16650 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
16660 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
16670 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
16680 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
16690 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66  Don't use the af
166a0 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  p_end_lock: exit
166b0 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
166c0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
166d0 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
166e0 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
166f0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
16700 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock>=eFileLock )
16710 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
16720 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
16730 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
16740 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
16750 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
16760 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
16770 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75  ock)));.    retu
16780 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16790 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
167a0 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
167b0 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
167c0 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e  t.  **  (1) We n
167d0 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75  ever move from u
167e0 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68  nlocked to anyth
167f0 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20  ing higher than 
16800 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  shared lock..  *
16810 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65  *  (2) SQLite ne
16820 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72  ver explicitly r
16830 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67  equests a pendig
16840 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29   lock..  **  (3)
16850 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69   A shared lock i
16860 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68  s always held wh
16870 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63  en a reserve loc
16880 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  k is requested..
16890 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
168a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
168b0 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  =NO_LOCK || eFil
168c0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
168d0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
168e0 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49  eFileLock!=PENDI
168f0 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
16900 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
16910 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
16920 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16930 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
16940 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d  ;.  .  /* This m
16950 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
16960 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
16970 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
16980 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
16990 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
169a0 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
169b0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
169c0 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
169d0 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
169e0 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
169f0 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
16a00 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68  unixFile*.  ** h
16a10 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c  andle that precl
16a20 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74  udes the request
16a30 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20  ed lock, return 
16a40 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
16a50 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
16a60 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ck!=pInode->eFil
16a70 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20  eLock && .      
16a80 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
16a90 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
16aa0 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
16ab0 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20  HARED_LOCK)).   
16ac0 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
16ad0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
16ae0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
16af0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66  ;.  }.  .  /* If
16b00 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
16b10 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
16b20 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
16b30 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
16b40 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
16b50 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
16b60 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
16b70 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
16b80 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
16b90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16ba0 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
16bb0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16bc0 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70  LOCK && .     (p
16bd0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
16be0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
16bf0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
16c00 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
16c10 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
16c20 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
16c30 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
16c40 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
16c50 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
16c60 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
16c70 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a  e->nShared>0 );.
16c80 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
16c90 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
16ca0 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
16cb0 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70  nShared++;.    p
16cc0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
16cd0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
16ce0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a  _lock;.  }.    .
16cf0 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
16d00 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
16d10 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
16d20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
16d30 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
16d40 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
16d50 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
16d60 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
16d70 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
16d80 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
16d90 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  d..  */.  if( eF
16da0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16db0 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
16dc0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
16dd0 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
16de0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
16df0 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
16e00 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b  .    int failed;
16e10 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66  .    failed = af
16e20 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16e30 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16e40 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
16e50 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61  , 1);.    if (fa
16e60 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63  iled) {.      rc
16e70 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20   = failed;.     
16e80 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16e90 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
16ea0 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
16eb0 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
16ec0 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
16ed0 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
16ee0 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
16ef0 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
16f00 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
16f10 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
16f20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
16f30 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
16f40 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32    int lrc1, lrc2
16f50 2c 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b  , lrc1Errno = 0;
16f60 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61  .    long lk, ma
16f70 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73  sk;.    .    ass
16f80 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
16f90 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ared==0 );.    a
16fa0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
16fb0 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
16fc0 20 20 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b         .    mask
16fd0 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29   = (sizeof(long)
16fe0 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49  ==8) ? LARGEST_I
16ff0 4e 54 36 34 20 3a 20 30 78 37 66 66 66 66 66 66  NT64 : 0x7ffffff
17000 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65  f;.    /* Now ge
17010 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  t the read-lock 
17020 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20  SHARED_LOCK */. 
17030 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20     /* note that 
17040 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74  the quality of t
17050 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f  he randomness do
17060 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61  esn't matter tha
17070 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b  t much */.    lk
17080 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20   = random(); .  
17090 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64    pInode->shared
170a0 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73  Byte = (lk & mas
170b0 6b 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20  k)%(SHARED_SIZE 
170c0 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d  - 1);.    lrc1 =
170d0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
170e0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
170f0 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53  le, .          S
17100 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
17110 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
17120 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49  1, 1);.    if( I
17130 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
17140 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31  1) ){.      lrc1
17150 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c  Errno = pFile->l
17160 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  astErrno;.    }.
17170 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
17180 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
17190 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72  G lock */.    lr
171a0 63 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c2 = afpSetLock(
171b0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
171c0 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
171d0 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
171e0 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43   .    if( IS_LOC
171f0 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20  K_ERROR(lrc1) ) 
17200 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
17210 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45  astErrno = lrc1E
17220 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
17230 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74   lrc1;.      got
17240 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
17250 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49      } else if( I
17260 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
17270 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  2) ){.      rc =
17280 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74   lrc2;.      got
17290 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
172a0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
172b0 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  rc1 != SQLITE_OK
172c0 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20   ) {.      rc = 
172d0 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lrc1;.    } else
172e0 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
172f0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
17300 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
17310 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
17320 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53        pInode->nS
17330 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  hared = 1;.    }
17340 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
17350 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
17360 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65  E_LOCK && pInode
17370 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
17380 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
17390 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
173a0 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
173b0 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
173c0 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d  this.     ** sam
173d0 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
173e0 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
173f0 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
17400 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
17410 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
17420 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
17430 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
17440 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
17450 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
17460 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
17470 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
17480 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
17490 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
174a0 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
174b0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69    */.    int fai
174c0 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  led = 0;.    ass
174d0 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
174e0 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
174f0 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d  if (eFileLock >=
17500 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26   RESERVED_LOCK &
17510 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
17520 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ck < RESERVED_LO
17530 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  CK) {.        /*
17540 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
17550 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  VED lock */.    
17560 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
17570 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17580 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17590 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
175a0 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ,1);.      if( !
175b0 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
175c0 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72    context->reser
175d0 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ved = 1;.      }
175e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
175f0 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65 4c  failed && eFileL
17600 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56 45  ock == EXCLUSIVE
17610 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f  _LOCK) {.      /
17620 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43  * Acquire an EXC
17630 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20  LUSIVE lock */. 
17640 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a         .      /*
17650 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72   Remove the shar
17660 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74  ed lock before t
17670 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e  rying the range.
17680 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20    we'll need to 
17690 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61  .      ** reesta
176a0 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
176b0 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27   lock if we can'
176c0 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55 6e  t get the  afpUn
176d0 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  lock.      */.  
176e0 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65 64      if( !(failed
176f0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
17700 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
17710 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
17720 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  ST +.           
17730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
17740 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
17750 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  , 1, 0)) ){.    
17760 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20      int failed2 
17770 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
17780 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65       /* now atte
17790 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  mmpt to get the 
177a0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72  exclusive lock r
177b0 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ange */.        
177c0 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
177d0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
177e0 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
177f0 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20  ED_FIRST, .     
17800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17810 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
17820 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20  _SIZE, 1);.     
17830 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26     if( failed &&
17840 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53   (failed2 = afpS
17850 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
17860 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
17870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17880 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
17890 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68  RST + pInode->sh
178a0 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29  aredByte, 1, 1))
178b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
178c0 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69   Can't reestabli
178d0 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
178e0 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27  ck.  Sqlite can'
178f0 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a  t deal, this is.
17900 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63            ** a c
17910 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f  ritical I/O erro
17920 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  r.          */. 
17930 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 28           rc = ((
17940 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f  failed & SQLITE_
17950 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
17960 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64  _IOERR) ? failed
17970 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20  2 : .           
17980 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
17990 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  _LOCK;.         
179a0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
179b0 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20  ck;.        } . 
179c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
179d0 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
179e0 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a   .      }.    }.
179f0 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29      if( failed )
17a00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
17a10 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  led;.    }.  }. 
17a20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49   .  if( rc==SQLI
17a30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
17a40 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
17a50 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70  eFileLock;.    p
17a60 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
17a70 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
17a80 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
17a90 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
17aa0 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
17ab0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
17ac0 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
17ad0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
17ae0 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
17af0 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64  ;.  }.  .afp_end
17b00 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  _lock:.  unixLea
17b10 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
17b20 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
17b30 64 20 25 73 20 25 73 20 28 61 66 70 29 5c 6e 22  d %s %s (afp)\n"
17b40 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
17b50 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
17b60 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d  ), .         rc=
17b70 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
17b80 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
17b90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17ba0 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
17bb0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
17bc0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
17bd0 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
17be0 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
17bf0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
17c00 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
17c10 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
17c20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
17c30 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
17c40 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
17c50 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
17c60 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
17c70 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
17c80 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
17c90 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
17ca0 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c  tatic int afpUnl
17cb0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
17cc0 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
17cd0 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  ock) {.  int rc 
17ce0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
17cf0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
17d00 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
17d10 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
17d20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  *pInode;.  afpLo
17d30 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
17d40 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
17d50 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
17d60 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
17d70 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53  ext;.  int skipS
17d80 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65  hared = 0;.#ifde
17d90 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
17da0 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68  int h = pFile->h
17db0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
17dc0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
17dd0 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
17de0 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64   %d %d was %d(%d
17df0 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
17e00 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
17e10 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
17e20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
17e30 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
17e40 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
17e50 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
17e60 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
17e70 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b       getpid()));
17e80 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ..  assert( eFil
17e90 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
17ea0 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  CK );.  if( pFil
17eb0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46  e->eFileLock<=eF
17ec0 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
17ed0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17ee0 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
17ef0 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
17f00 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
17f10 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  e;.  assert( pIn
17f20 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20  ode->nShared!=0 
17f30 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
17f40 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
17f50 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
17f60 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
17f70 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65  leLock==pFile->e
17f80 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
17f90 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
17fa0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69  enign(1);.    Si
17fb0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
17fc0 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75  =(-1) ).    Simu
17fd0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
17fe0 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69 66 64 65  n(0);.    .#ifde
17ff0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
18000 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63     /* When reduc
18010 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20  ing a lock such 
18020 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65  that other proce
18030 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20  sses can start. 
18040 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68     ** reading th
18050 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18060 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65  again, make sure
18070 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
18080 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
18090 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
180a0 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20   if any part of 
180b0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
180c0 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64   ** file changed
180d0 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  .  If the transa
180e0 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73  ction counter is
180f0 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20   not updated,.  
18100 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
18110 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61  ctions to the sa
18120 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f  me file might no
18130 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20  t realize that. 
18140 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68     ** the file h
18150 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68  as changed and h
18160 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b  ence might not k
18170 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65  now to flush the
18180 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  ir.    ** cache.
18190 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73    The use of a s
181a0 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c  tale cache can l
181b0 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
181c0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
181d0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
181e0 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
181f0 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ite==0.         
18200 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70    || pFile->dbUp
18210 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  date==0.        
18220 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61     || pFile->tra
18230 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b  nsCntrChng==1 );
18240 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  .    pFile->inNo
18250 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23  rmalWrite = 0;.#
18260 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69  endif.    .    i
18270 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
18280 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
18290 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OCK ){.      rc 
182a0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
182b0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
182c0 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
182d0 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  T, SHARED_SIZE, 
182e0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
182f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
18300 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
18310 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
18320 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20 29 7b 0a  ->nShared>1) ){.
18330 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20          /* only 
18340 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65  re-establish the
18350 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20   shared lock if 
18360 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
18370 20 20 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c       int sharedL
18380 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
18390 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
183a0 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20  haredByte;.     
183b0 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
183c0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
183d0 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65  th, pFile, share
183e0 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29  dLockByte, 1, 1)
183f0 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
18400 0a 20 20 20 20 20 20 20 20 73 6b 69 70 53 68 61  .        skipSha
18410 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  red = 1;.      }
18420 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
18430 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18440 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18450 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  >=PENDING_LOCK )
18460 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70  {.      rc = afp
18470 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
18480 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
18490 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c  PENDING_BYTE, 1,
184a0 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20   0);.    } .    
184b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
184c0 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
184d0 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
184e0 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d  LOCK && context-
184f0 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  >reserved ){.   
18500 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
18510 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
18520 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
18530 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  VED_BYTE, 1, 0);
18540 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29  .      if( !rc )
18550 7b 20 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65  { .        conte
18560 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30  xt->reserved = 0
18570 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ; .      }.    }
18580 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
18590 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65  ITE_OK && (eFile
185a0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
185b0 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K || pInode->nSh
185c0 61 72 65 64 3e 31 29 29 7b 0a 20 20 20 20 20 20  ared>1)){.      
185d0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
185e0 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
185f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
18600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
18610 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f  & eFileLock==NO_
18620 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  LOCK ){..    /* 
18630 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68  Decrement the sh
18640 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65  ared lock counte
18650 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20  r.  Release the 
18660 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20  lock using an.  
18670 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c    ** OS call onl
18680 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61  y when all threa
18690 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20  ds in this same 
186a0 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c  process have rel
186b0 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65  eased.    ** the
186c0 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
186d0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
186e0 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42  long sharedLockB
186f0 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52  yte = SHARED_FIR
18700 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
18710 64 42 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64  dByte;.    pInod
18720 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20  e->nShared--;.  
18730 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53    if( pInode->nS
18740 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  hared==0 ){.    
18750 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
18760 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
18770 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
18780 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
18790 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
187a0 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
187b0 20 20 69 66 28 20 21 73 6b 69 70 53 68 61 72 65    if( !skipShare
187c0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  d ){.        rc 
187d0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
187e0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
187f0 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42  ile, sharedLockB
18800 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  yte, 1, 0);.    
18810 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72    }.      if( !r
18820 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  c ){.        pIn
18830 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
18840 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
18850 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
18860 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
18870 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
18880 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18890 4b 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  K ){.      pInod
188a0 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20  e->nLock--;.    
188b0 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
188c0 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
188d0 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
188e0 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  nLock==0 ){.    
188f0 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
18900 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
18910 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
18920 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
18930 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  x();.  if( rc==S
18940 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65  QLITE_OK ) pFile
18950 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
18960 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72  ileLock;.  retur
18970 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
18980 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c  lose a file & cl
18990 65 61 6e 75 70 20 41 46 50 20 73 70 65 63 69 66  eanup AFP specif
189a0 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  ic locking conte
189b0 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  xt .*/.static in
189c0 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74  t afpClose(sqlit
189d0 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
189e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
189f0 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b  _OK;.  if( id ){
18a00 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
18a10 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
18a20 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c  *)id;.    afpUnl
18a30 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
18a40 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ;.    unixEnterM
18a50 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20  utex();.    if( 
18a60 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26  pFile->pInode &&
18a70 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
18a80 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  nLock ){.      /
18a90 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
18aa0 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
18ab0 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
18ac0 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
18ad0 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79   just.      ** y
18ae0 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
18af0 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
18b00 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
18b10 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
18b20 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
18b30 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61  tor to pInode->a
18b40 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c  Pending.  It wil
18b50 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
18b60 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20  ly closed when. 
18b70 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74       ** the last
18b80 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64   lock is cleared
18b90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18ba0 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46   setPendingFd(pF
18bb0 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ile);.    }.    
18bc0 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
18bd0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c  (pFile);.    sql
18be0 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
18bf0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
18c00 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65  ;.    rc = close
18c10 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
18c20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
18c30 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
18c40 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   rc;.}..#endif /
18c50 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
18c60 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
18c70 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
18c80 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65  YLE */./*.** The
18c90 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74   code above is t
18ca0 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c  he AFP lock impl
18cb0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
18cc0 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69   code is specifi
18cd0 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61  c.** to MacOSX a
18ce0 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  nd does not work
18cf0 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70   on other unix p
18d00 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c  latforms.  No al
18d10 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20  ternative.** is 
18d20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79  available.  If y
18d30 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65  ou don't compile
18d40 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e   for a mac, then
18d50 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a   the "unix-afp".
18d60 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76  ** VFS is not av
18d70 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ailable..**.****
18d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d90 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50  * End of the AFP
18da0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
18db0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
18dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
18dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
18e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
18e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e80 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
18e90 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  FS Locking *****
18ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69  ***********/..#i
18ec0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
18ed0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
18ee0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
18ef0 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72  YLE./*. ** Lower
18f00 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
18f10 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
18f20 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
18f30 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
18f40 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65  Lock. ** must be
18f50 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
18f60 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
18f70 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c   **. ** If the l
18f80 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
18f90 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
18fa0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
18fb0 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74  t or below. ** t
18fc0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
18fd0 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
18fe0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
18ff0 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  -op.. */.static 
19000 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71  int nfsUnlock(sq
19010 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
19020 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
19030 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e    return posixUn
19040 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f  lock(id, eFileLo
19050 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69  ck, 1);.}..#endi
19060 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
19070 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
19080 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
19090 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20  _STYLE */./*.** 
190a0 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69  The code above i
190b0 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69  s the NFS lock i
190c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
190d0 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63  The code is spec
190e0 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53  ific.** to MacOS
190f0 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77  X and does not w
19100 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69  ork on other uni
19110 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f  x platforms.  No
19120 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
19130 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a  is available.  .
19140 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
19150 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
19160 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
19170 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
19180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19190 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
191a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
191b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
191c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
191d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
191e0 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
191f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19230 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
19240 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67  **** Non-locking
19250 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
19260 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
19270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19280 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ***.**.** The ne
19290 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  xt division cont
192a0 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ains implementat
192b0 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74  ions for all met
192c0 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  hods of the .** 
192d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a  sqlite3_file obj
192e0 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ect other than t
192f0 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  he locking metho
19300 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  ds.  The locking
19310 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65  .** methods were
19320 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69   defined in divi
19330 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65  sions above (one
19340 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
19350 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29  per.** division)
19360 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73  .  Those methods
19370 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e   that are common
19380 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
19390 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74  modes.** are gat
193a0 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74  her together int
193b0 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e  o this division.
193c0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  .*/../*.** Seek 
193d0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61  to the offset pa
193e0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
193f0 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65  nd argument, the
19400 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62  n read cnt .** b
19410 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20  ytes into pBuf. 
19420 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
19430 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
19440 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  lly read..**.** 
19450 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69  NB:  If you defi
19460 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20  ne USE_PREAD or 
19470 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65  USE_PREAD64, the
19480 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a  n it might also.
19490 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
194a0 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
194b0 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30  _SOURCE to be 50
194c0 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20  0.  This varies 
194d0 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74  from.** one syst
194e0 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20  em to another.  
194f0 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65  Since SQLite doe
19500 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45  s not define USE
19510 5f 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e  _PREAD.** any an
19520 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c  y form by defaul
19530 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61  t, we will not a
19540 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65  ttempt to define
19550 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a   _XOPEN_SOURCE..
19560 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23  ** See tickets #
19570 32 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a  2741 and #2681..
19580 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73  **.** To avoid s
19590 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e  tomping the errn
195a0 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69  o value on a fai
195b0 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73  led read the las
195c0 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
195d0 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
195e0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
195f0 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65  ic int seekAndRe
19600 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  ad(unixFile *id,
19610 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
19620 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75  ffset, void *pBu
19630 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
19640 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72  nt got;.  int pr
19650 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21 64  ior = 0;.#if (!d
19660 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
19670 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53  ) && !defined(US
19680 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36  E_PREAD64)).  i6
19690 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e  4 newOffset;.#en
196a0 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  dif.  TIMER_STAR
196b0 54 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  T;.  assert( cnt
196c0 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29 20  ==(cnt&0x1ffff) 
196d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d  );.  assert( id-
196e0 3e 68 3e 32 20 29 3b 0a 20 20 63 6e 74 20 26 3d  >h>2 );.  cnt &=
196f0 20 30 78 31 66 66 66 66 3b 0a 20 20 64 6f 7b 0a   0x1ffff;.  do{.
19700 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
19710 50 52 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d  PREAD).    got =
19720 20 6f 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20   osPread(id->h, 
19730 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
19740 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  t);.    Simulate
19750 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d  IOError( got = -
19760 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  1 );.#elif defin
19770 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
19780 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61      got = osPrea
19790 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  d64(id->h, pBuf,
197a0 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
197b0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
197c0 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a  or( got = -1 );.
197d0 23 65 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66  #else.    newOff
197e0 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
197f0 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
19800 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  SET);.    Simula
19810 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66  teIOError( newOf
19820 66 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66  fset-- );.    if
19830 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66  ( newOffset!=off
19840 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  set ){.      if(
19850 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31   newOffset == -1
19860 20 29 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e   ){.        ((un
19870 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
19880 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
19890 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
198a0 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
198b0 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
198c0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
198d0 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
198e0 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73    }.    got = os
198f0 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66  Read(id->h, pBuf
19900 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20  , cnt);.#endif. 
19910 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20     if( got==cnt 
19920 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
19930 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20 20   got<0 ){.      
19940 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52  if( errno==EINTR
19950 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e   ){ got = 1; con
19960 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20 70  tinue; }.      p
19970 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
19980 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
19990 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
199a0 6e 6f 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  no;.      break;
199b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 67  .    }else if( g
199c0 6f 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 63 6e  ot>0 ){.      cn
199d0 74 20 2d 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20  t -= got;.      
199e0 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20  offset += got;. 
199f0 20 20 20 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f       prior += go
19a00 74 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  t;.      pBuf = 
19a10 28 76 6f 69 64 2a 29 28 67 6f 74 20 2b 20 28 63  (void*)(got + (c
19a20 68 61 72 2a 29 70 42 75 66 29 3b 0a 20 20 20 20  har*)pBuf);.    
19a30 7d 0a 20 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e  }.  }while( got>
19a40 30 20 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44  0 );.  TIMER_END
19a50 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
19a60 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25  AD    %-3d %5d %
19a70 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20  7lld %llu\n",.  
19a80 20 20 20 20 20 20 20 20 20 20 69 64 2d 3e 68 2c            id->h,
19a90 20 67 6f 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73   got+prior, offs
19aa0 65 74 2d 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f  et-prior, TIMER_
19ab0 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74  ELAPSED));.  ret
19ac0 75 72 6e 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d  urn got+prior;.}
19ad0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
19ae0 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e  a from a file in
19af0 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65  to a buffer.  Re
19b00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
19b10 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77  f all.** bytes w
19b20 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73  ere read success
19b30 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45  fully and SQLITE
19b40 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69  _IOERR if anythi
19b50 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
19b60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19b70 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69  unixRead(.  sqli
19b80 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
19b90 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
19ba0 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
19bb0 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a  e3_int64 offset.
19bc0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
19bd0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
19be0 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74   *)id;.  int got
19bf0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
19c00 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
19c10 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  et>=0 );.  asser
19c20 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f  t( amt>0 );..  /
19c30 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
19c40 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
19c50 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73  t a journal, mas
19c60 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ter-journal or t
19c70 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20  emp.  ** file), 
19c80 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
19c90 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73   locking range s
19ca0 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72  hould never be r
19cb0 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20  ead or written. 
19cc0 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
19cd0 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  t( pFile->pUnuse
19ce0 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
19cf0 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
19d00 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
19d10 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
19d20 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
19d30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
19d40 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
19d50 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
19d60 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
19d70 69 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20  is read request 
19d80 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
19d90 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
19da0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65  data from the me
19db0 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69  mory mapping usi
19dc0 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f  ng memcpy().  */
19dd0 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46  .  if( offset<pF
19de0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
19df0 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b  .    if( offset+
19e00 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d  amt <= pFile->mm
19e10 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
19e20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28  memcpy(pBuf, &((
19e30 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
19e40 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
19e50 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72  ], amt);.      r
19e60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19e70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19e80 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46    int nCopy = pF
19e90 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
19ea0 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65  offset;.      me
19eb0 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
19ec0 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
19ed0 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
19ee0 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70   nCopy);.      p
19ef0 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42  Buf = &((u8 *)pB
19f00 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20  uf)[nCopy];.    
19f10 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a    amt -= nCopy;.
19f20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
19f30 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nCopy;.    }.  }
19f40 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d  .#endif..  got =
19f50 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69   seekAndRead(pFi
19f60 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
19f70 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f  , amt);.  if( go
19f80 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65  t==amt ){.    re
19f90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19fa0 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c    }else if( got<
19fb0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74  0 ){.    /* last
19fc0 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
19fd0 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
19fe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
19ff0 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ERR_READ;.  }els
1a000 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e{.    pFile->la
1a010 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20  stErrno = 0; /* 
1a020 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72  not a system err
1a030 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72  or */.    /* Unr
1a040 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65  ead parts of the
1a050 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
1a060 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20  zero-filled */. 
1a070 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61     memset(&((cha
1a080 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30  r*)pBuf)[got], 0
1a090 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20  , amt-got);.    
1a0a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a0b0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
1a0c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74    }.}../*.** Att
1a0d0 65 6d 70 74 20 74 6f 20 73 65 65 6b 20 74 68 65  empt to seek the
1a0e0 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
1a0f0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
1a100 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
1a110 0a 2a 2a 20 61 62 73 6f 6c 75 74 65 20 6f 66 66  .** absolute off
1a120 73 65 74 20 69 4f 66 66 2c 20 74 68 65 6e 20 61  set iOff, then a
1a130 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
1a140 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 64 61  nBuf bytes of da
1a150 74 61 20 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20  ta from.** pBuf 
1a160 74 6f 20 69 74 2e 20 49 66 20 61 6e 20 65 72 72  to it. If an err
1a170 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
1a180 6e 20 2d 31 20 61 6e 64 20 73 65 74 20 2a 70 69  n -1 and set *pi
1a190 45 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65  Errno. Otherwise
1a1a0 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  , .** return the
1a1b0 20 61 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f   actual number o
1a1c0 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20  f bytes written 
1a1d0 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 6c 65  (which may be le
1a1e0 73 73 20 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29  ss than.** nBuf)
1a1f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a200 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 0a  seekAndWriteFd(.
1a210 20 20 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20    int fd,       
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a230 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
1a240 70 74 6f 72 20 74 6f 20 77 72 69 74 65 20 74 6f  ptor to write to
1a250 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 2c 20   */.  i64 iOff, 
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a270 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66        /* File of
1a280 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20 77 72  fset to begin wr
1a290 69 74 69 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f  iting at */.  co
1a2a0 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a2c0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
1a2d0 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 74  this buffer to t
1a2e0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
1a2f0 20 6e 42 75 66 2c 20 20 20 20 20 20 20 20 20 20   nBuf,          
1a300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a310 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
1a320 42 75 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  Buf in bytes */.
1a330 20 20 69 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20    int *piErrno  
1a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a350 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
1a360 6e 75 6d 62 65 72 20 69 66 20 65 72 72 6f 72 20  number if error 
1a370 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69  occurs */.){.  i
1a380 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a3a0 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
1a3b0 20 62 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   by system call 
1a3c0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 42  */..  assert( nB
1a3d0 75 66 3d 3d 28 6e 42 75 66 26 30 78 31 66 66 66  uf==(nBuf&0x1fff
1a3e0 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  f) );.  assert( 
1a3f0 66 64 3e 32 20 29 3b 0a 20 20 6e 42 75 66 20 26  fd>2 );.  nBuf &
1a400 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 54 49 4d  = 0x1ffff;.  TIM
1a410 45 52 5f 53 54 41 52 54 3b 0a 0a 23 69 66 20 64  ER_START;..#if d
1a420 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1a430 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 50  ).  do{ rc = osP
1a440 77 72 69 74 65 28 66 64 2c 20 70 42 75 66 2c 20  write(fd, pBuf, 
1a450 6e 42 75 66 2c 20 69 4f 66 66 29 3b 20 7d 77 68  nBuf, iOff); }wh
1a460 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
1a470 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c  no==EINTR );.#el
1a480 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
1a490 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 72 63  READ64).  do{ rc
1a4a0 20 3d 20 6f 73 50 77 72 69 74 65 36 34 28 66 64   = osPwrite64(fd
1a4b0 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f  , pBuf, nBuf, iO
1a4c0 66 66 29 3b 7d 77 68 69 6c 65 28 20 72 63 3c 30  ff);}while( rc<0
1a4d0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
1a4e0 29 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20  );.#else.  do{. 
1a4f0 20 20 20 69 36 34 20 69 53 65 65 6b 20 3d 20 6c     i64 iSeek = l
1a500 73 65 65 6b 28 66 64 2c 20 69 4f 66 66 2c 20 53  seek(fd, iOff, S
1a510 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69  EEK_SET);.    Si
1a520 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 69  mulateIOError( i
1a530 53 65 65 6b 2d 2d 20 29 3b 0a 0a 20 20 20 20 69  Seek-- );..    i
1a540 66 28 20 69 53 65 65 6b 21 3d 69 4f 66 66 20 29  f( iSeek!=iOff )
1a550 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69 45 72  {.      if( piEr
1a560 72 6e 6f 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d  rno ) *piErrno =
1a570 20 28 69 53 65 65 6b 3d 3d 2d 31 20 3f 20 65 72   (iSeek==-1 ? er
1a580 72 6e 6f 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  rno : 0);.      
1a590 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
1a5a0 0a 20 20 20 20 72 63 20 3d 20 6f 73 57 72 69 74  .    rc = osWrit
1a5b0 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66  e(fd, pBuf, nBuf
1a5c0 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3c  );.  }while( rc<
1a5d0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
1a5e0 52 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54  R );.#endif..  T
1a5f0 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52  IMER_END;.  OSTR
1a600 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25 2d  ACE(("WRITE   %-
1a610 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
1a620 75 5c 6e 22 2c 20 66 64 2c 20 72 63 2c 20 69 4f  u\n", fd, rc, iO
1a630 66 66 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  ff, TIMER_ELAPSE
1a640 44 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3c 30  D));..  if( rc<0
1a650 20 26 26 20 70 69 45 72 72 6e 6f 20 29 20 2a 70   && piErrno ) *p
1a660 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  iErrno = errno;.
1a670 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a680 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
1a690 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d  he offset in id-
1a6a0 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65 61  >offset then rea
1a6b0 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f  d cnt bytes into
1a6c0 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e   pBuf..** Return
1a6d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1a6e0 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
1a6f0 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65 20  ad.  Update the 
1a700 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f  offset..**.** To
1a710 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20   avoid stomping 
1a720 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20  the errno value 
1a730 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69 74  on a failed writ
1a740 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  e the lastErrno 
1a750 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
1a760 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1a770 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a780 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69  seekAndWrite(uni
1a790 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f  xFile *id, i64 o
1a7a0 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69  ffset, const voi
1a7b0 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
1a7c0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 65 65 6b  ){.  return seek
1a7d0 41 6e 64 57 72 69 74 65 46 64 28 69 64 2d 3e 68  AndWriteFd(id->h
1a7e0 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
1a7f0 63 6e 74 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72  cnt, &id->lastEr
1a800 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rno);.}.../*.** 
1a810 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
1a820 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
1a830 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
1a840 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1a850 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
1a860 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
1a870 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
1a880 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69  atic int unixWri
1a890 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
1a8a0 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74  le *id, .  const
1a8b0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
1a8c0 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
1a8d0 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
1a8e0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
1a8f0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1a900 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f  e*)id;.  int wro
1a910 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  te = 0;.  assert
1a920 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ( id );.  assert
1a930 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ( amt>0 );..  /*
1a940 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61   If this is a da
1a950 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
1a960 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74   a journal, mast
1a970 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65  er-journal or te
1a980 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74  mp.  ** file), t
1a990 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
1a9a0 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68  locking range sh
1a9b0 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65  ould never be re
1a9c0 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a  ad or written. *
1a9d0 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
1a9e0 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  ( pFile->pUnused
1a9f0 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  ==0.       || of
1aa00 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59  fset>=PENDING_BY
1aa10 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c  TE+512.       ||
1aa20 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e   offset+amt<=PEN
1aa30 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a  DING_BYTE .  );.
1aa40 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1aa50 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
1aa60 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
1aa70 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20   a normal write 
1aa80 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69  to a database fi
1aa90 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74  le (as opposed t
1aaa0 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68  o.  ** doing a h
1aab0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1aac0 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
1aad0 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
1aae0 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f  r than a.  ** no
1aaf0 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  rmal database fi
1ab00 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64 20  le) then record 
1ab10 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
1ab20 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
1ab30 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49 66  has changed.  If
1ab40 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1ab50 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64 69   counter is modi
1ab60 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68 61  fied, record tha
1ab70 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e  t.  ** fact too.
1ab80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1ab90 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
1aba0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   ){.    pFile->d
1abb0 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a  bUpdate = 1;  /*
1abc0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 68 61   The database ha
1abd0 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  s been modified 
1abe0 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  */.    if( offse
1abf0 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74 2b  t<=24 && offset+
1ac00 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20  amt>=27 ){.     
1ac10 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 63   int rc;.      c
1ac20 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a  har oldCntr[4];.
1ac30 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1ac40 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1ac50 20 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b 41        rc = seekA
1ac60 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32 34  ndRead(pFile, 24
1ac70 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20  , oldCntr, 4);. 
1ac80 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1ac90 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
1aca0 20 20 20 20 20 69 66 28 20 72 63 21 3d 34 20 7c       if( rc!=4 |
1acb0 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72  | memcmp(oldCntr
1acc0 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  , &((char*)pBuf)
1acd0 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21  [24-offset], 4)!
1ace0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
1acf0 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
1ad00 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20  ng = 1;  /* The 
1ad10 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1ad20 74 65 72 20 68 61 73 20 63 68 61 6e 67 65 64 20  ter has changed 
1ad30 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
1ad40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
1ad50 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1ad60 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61  _SIZE>0.  /* Dea
1ad70 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f  l with as much o
1ad80 66 20 74 68 69 73 20 77 72 69 74 65 20 72 65 71  f this write req
1ad90 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65  uest as possible
1ada0 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a   by transfering.
1adb0 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
1adc0 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
1add0 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29  g using memcpy()
1ade0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  .  */.  if( offs
1adf0 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  et<pFile->mmapSi
1ae00 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66  ze ){.    if( of
1ae10 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c  fset+amt <= pFil
1ae20 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
1ae30 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75       memcpy(&((u
1ae40 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
1ae50 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
1ae60 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
1ae70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ae80 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
1ae90 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79  .      int nCopy
1aea0 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69   = pFile->mmapSi
1aeb0 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
1aec0 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20     memcpy(&((u8 
1aed0 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
1aee0 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
1aef0 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  pBuf, nCopy);.  
1af00 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38      pBuf = &((u8
1af10 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b   *)pBuf)[nCopy];
1af20 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43  .      amt -= nC
1af30 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  opy;.      offse
1af40 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t += nCopy;.    
1af50 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1af60 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20  while( amt>0 && 
1af70 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64  (wrote = seekAnd
1af80 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66 66  Write(pFile, off
1af90 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29  set, pBuf, amt))
1afa0 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d  >0 ){.    amt -=
1afb0 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73   wrote;.    offs
1afc0 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20  et += wrote;.   
1afd0 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a   pBuf = &((char*
1afe0 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20  )pBuf)[wrote];. 
1aff0 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45   }.  SimulateIOE
1b000 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31  rror(( wrote=(-1
1b010 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53  ), amt=1 ));.  S
1b020 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
1b030 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20  rror(( wrote=0, 
1b040 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28  amt=1 ));..  if(
1b050 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66   amt>0 ){.    if
1b060 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70 46 69  ( wrote<0 && pFi
1b070 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45  le->lastErrno!=E
1b080 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20 20 2f  NOSPC ){.      /
1b090 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
1b0a0 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20  by seekAndWrite 
1b0b0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1b0c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
1b0d0 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
1b0e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
1b0f0 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f  Errno = 0; /* no
1b100 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
1b110 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1b120 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1b130 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1b140 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b150 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1b160 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ST./*.** Count t
1b170 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c  he number of ful
1b180 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61  lsyncs and norma
1b190 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69  l syncs.  This i
1b1a0 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a  s used to test.*
1b1b0 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64  * that syncs and
1b1c0 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f   fullsyncs are o
1b1d0 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65 20  ccurring at the 
1b1e0 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
1b1f0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
1b200 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
1b210 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
1b220 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
1b230 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20  if../*.** We do 
1b240 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65 6d  not trust system
1b250 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77  s to provide a w
1b260 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63  orking fdatasync
1b270 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a  ().  Some do..**
1b280 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20   Others do no.  
1b290 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20 77  To be safe, we w
1b2a0 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74  ill stick with t
1b2b0 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f  he (slightly slo
1b2c0 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e  wer).** fsync().
1b2d0 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61   If you know tha
1b2e0 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f  t your system do
1b2f0 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61  es support fdata
1b300 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79  sync() correctly
1b310 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79  ,.** then simply
1b320 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44   compile with -D
1b330 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73  fdatasync=fdatas
1b340 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ync.*/.#if !defi
1b350 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 0a 23  ned(fdatasync).#
1b360 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e   define fdatasyn
1b370 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a  c fsync.#endif..
1b380 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56  /*.** Define HAV
1b390 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30  E_FULLFSYNC to 0
1b3a0 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20   or 1 depending 
1b3b0 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
1b3c0 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46  t.** the F_FULLF
1b3d0 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65  SYNC macro is de
1b3e0 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53  fined.  F_FULLFS
1b3f0 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79  YNC is currently
1b400 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  .** only availab
1b410 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20  le on Mac OS X. 
1b420 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20   But that could 
1b430 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  change..*/.#ifde
1b440 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20  f F_FULLFSYNC.# 
1b450 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  define HAVE_FULL
1b460 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20  FSYNC 1.#else.# 
1b470 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  define HAVE_FULL
1b480 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a  FSYNC 0.#endif..
1b490 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63  ./*.** The fsync
1b4a0 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64  () system call d
1b4b0 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20  oes not work as 
1b4c0 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61  advertised on ma
1b4d0 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65  ny.** unix syste
1b4e0 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ms.  The followi
1b4f0 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  ng procedure is 
1b500 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61  an attempt to ma
1b510 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65  ke.** it work be
1b520 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tter..**.** The 
1b530 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d  SQLITE_NO_SYNC m
1b540 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c  acro disables al
1b550 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69  l fsync()s.  Thi
1b560 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66  s is useful.** f
1b570 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20  or testing when 
1b580 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74  we want to run t
1b590 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74 20  hrough the test 
1b5a0 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a  suite quickly..*
1b5b0 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67  * You are strong
1b5c0 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a  ly advised *not*
1b5d0 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20   to deploy with 
1b5e0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a  SQLITE_NO_SYNC.*
1b5f0 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76  * enabled, howev
1b600 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53  er, since with S
1b610 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e  QLITE_NO_SYNC en
1b620 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61  abled, an OS cra
1b630 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  sh.** or power f
1b640 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65  ailure will like
1b650 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
1b660 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1b670 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20  .** SQLite sets 
1b680 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61  the dataOnly fla
1b690 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66  g if the size of
1b6a0 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63   the file is unc
1b6b0 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69  hanged..** The i
1b6c0 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f  dea behind dataO
1b6d0 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20 73  nly is that it s
1b6e0 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65  hould only write
1b6f0 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e   the file conten
1b700 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f  t.** to disk, no
1b710 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65  t the inode.  We
1b720 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e   only set dataOn
1b730 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ly if the file s
1b740 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61  ize is .** uncha
1b750 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20 66  nged since the f
1b760 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72 74  ile size is part
1b770 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20   of the inode.  
1b780 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64  However, .** Ted
1b790 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74   Ts'o tells us t
1b7a0 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  hat fdatasync() 
1b7b0 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20  will also write 
1b7c0 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65  the inode if the
1b7d0 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61  .** file size ha
1b7e0 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20  s changed.  The 
1b7f0 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72  only real differ
1b800 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64 61  ence between fda
1b810 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20  tasync().** and 
1b820 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c  fsync(), Ted tel
1b830 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20 66  ls us, is that f
1b840 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
1b850 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a  not flush the.**
1b860 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74   inode if the mt
1b870 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20  ime or owner or 
1b880 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72  other inode attr
1b890 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61 6e  ibutes have chan
1b8a0 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20  ged..** We only 
1b8b0 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 66  care about the f
1b8c0 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68  ile size, not th
1b8d0 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74  e other file att
1b8e0 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61  ributes, so.** a
1b8f0 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65 20  s far as SQLite 
1b900 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e  is concerned, an
1b910 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73 20   fdatasync() is 
1b920 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65 2e  always adequate.
1b930 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79  .** So, we alway
1b940 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63 28  s use fdatasync(
1b950 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c  ) if it is avail
1b960 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73  able, regardless
1b970 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   of.** the value
1b980 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79   of the dataOnly
1b990 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   flag..*/.static
1b9a0 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28   int full_fsync(
1b9b0 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c  int fd, int full
1b9c0 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e  Sync, int dataOn
1b9d0 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ly){.  int rc;..
1b9e0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1b9f0 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65  ng "ifdef/elif/e
1ba00 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20  lse/" block has 
1ba10 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74 75  the same structu
1ba20 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f  re as.  ** the o
1ba30 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20  ne below. It is 
1ba40 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65 20  replicated here 
1ba50 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20  solely to avoid 
1ba60 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a  cluttering .  **
1ba70 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64   up the real cod
1ba80 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53 45  e with the UNUSE
1ba90 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61  D_PARAMETER() ma
1baa0 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  cros..  */.#ifde
1bab0 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
1bac0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1bad0 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45  TER(fd);.  UNUSE
1bae0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
1baf0 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
1bb00 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1bb10 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f  ly);.#elif HAVE_
1bb20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53  FULLFSYNC.  UNUS
1bb30 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1bb40 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20  aOnly);.#else.  
1bb50 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1bb60 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e  (fullSync);.  UN
1bb70 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
1bb80 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66  ataOnly);.#endif
1bb90 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  ..  /* Record th
1bba0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
1bbb0 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e  s that we do a n
1bbc0 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e  ormal fsync() an
1bbd0 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43  d .  ** FULLSYNC
1bbe0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
1bbf0 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74  during testing t
1bc00 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
1bc10 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  is procedure.  *
1bc20 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69  * gets called wi
1bc30 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 61  th the correct a
1bc40 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23  rguments..  */.#
1bc50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1bc60 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  T.  if( fullSync
1bc70 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73   ) sqlite3_fulls
1bc80 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73  ync_count++;.  s
1bc90 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
1bca0 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  t++;.#endif..  /
1bcb0 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64  * If we compiled
1bcc0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
1bcd0 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74  _NO_SYNC flag, t
1bce0 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61  hen syncing is a
1bcf0 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f  .  ** no-op.  */
1bd00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
1bd10 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51  O_SYNC.  rc = SQ
1bd20 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48  LITE_OK;.#elif H
1bd30 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  AVE_FULLFSYNC.  
1bd40 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  if( fullSync ){.
1bd50 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
1bd60 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43  (fd, F_FULLFSYNC
1bd70 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
1bd80 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
1bd90 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46   /* If the FULLF
1bda0 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c  SYNC failed, fal
1bdb0 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70  l back to attemp
1bdc0 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e  ting an fsync().
1bdd0 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e  .  ** It shouldn
1bde0 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66  't be possible f
1bdf0 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20  or fullfsync to 
1be00 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  fail on the loca
1be10 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73  l .  ** file sys
1be20 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f  tem (on OSX), so
1be30 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74   failure indicat
1be40 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e  es that FULLFSYN
1be50 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70  C.  ** isn't sup
1be60 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20  ported for this 
1be70 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c  file system. So,
1be80 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e   attempt an fsyn
1be90 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72  c .  ** and (for
1bea0 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65   now) ignore the
1beb0 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73   overhead of a s
1bec0 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c  uperfluous fcntl
1bed0 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74   call.  .  ** It
1bee0 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20  'd be better to 
1bef0 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63  detect fullfsync
1bf00 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e   support once an
1bf10 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68  d avoid .  ** th
1bf20 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65  e fcntl call eve
1bf30 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20  ry time sync is 
1bf40 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  called..  */.  i
1bf50 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79  f( rc ) rc = fsy
1bf60 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64  nc(fd);..#elif d
1bf70 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1bf80 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63  ).  /* fdatasync
1bf90 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e  () on HFS+ doesn
1bfa0 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68 65  't yet flush the
1bfb0 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74   file size if it
1bfc0 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74   changed correct
1bfd0 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65  ly.  ** so curre
1bfe0 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20  ntly we default 
1bff0 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61  to the macro tha
1c000 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61 74  t redefines fdat
1c010 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20  async to fsync. 
1c020 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63   */.  rc = fsync
1c030 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72  (fd);.#else .  r
1c040 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64  c = fdatasync(fd
1c050 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  );.#if OS_VXWORK
1c060 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26  S.  if( rc==-1 &
1c070 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50  & errno==ENOTSUP
1c080 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79   ){.    rc = fsy
1c090 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  nc(fd);.  }.#end
1c0a0 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
1c0b0 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66   */.#endif /* if
1c0c0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
1c0d0 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  NC elif HAVE_FUL
1c0e0 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28  LFSYNC */..  if(
1c0f0 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72   OS_VXWORKS && r
1c100 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63  c!= -1 ){.    rc
1c110 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1c120 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c130 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  Open a file desc
1c140 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69  riptor to the di
1c150 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
1c160 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d  ng file zFilenam
1c170 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  e..** If success
1c180 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74  ful, *pFd is set
1c190 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66   to the opened f
1c1a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
1c1b0 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
1c1c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1c1d0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1c1e0 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e   either SQLITE_N
1c1f0 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  OMEM.** or SQLIT
1c200 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65  E_CANTOPEN is re
1c210 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20  turned and *pFd 
1c220 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64  is set to an und
1c230 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e  efined.** value.
1c240 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65 63  .**.** The direc
1c250 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
1c260 70 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72  ptor is used for
1c270 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20   only one thing 
1c280 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20  - to.** fsync() 
1c290 61 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 6d  a directory to m
1c2a0 61 6b 65 20 73 75 72 65 20 66 69 6c 65 20 63 72  ake sure file cr
1c2b0 65 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74  eation and delet
1c2c0 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72  ion events.** ar
1c2d0 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73  e flushed to dis
1c2e0 6b 2e 20 20 53 75 63 68 20 66 73 79 6e 63 73 20  k.  Such fsyncs 
1c2f0 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f  are not needed o
1c300 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e  n newer.** journ
1c310 61 6c 69 6e 67 20 66 69 6c 65 73 79 73 74 65 6d  aling filesystem
1c320 73 2c 20 62 75 74 20 61 72 65 20 72 65 71 75 69  s, but are requi
1c330 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c  red on older fil
1c340 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20  esystems..**.** 
1c350 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
1c360 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75   be overridden u
1c370 73 69 6e 67 20 74 68 65 20 78 53 65 74 53 79 73  sing the xSetSys
1c380 43 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a  Call interface..
1c390 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20 74  ** The ability t
1c3a0 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20  o override this 
1c3b0 72 6f 75 74 69 6e 65 20 77 61 73 20 61 64 64 65  routine was adde
1c3c0 64 20 69 6e 20 73 75 70 70 6f 72 74 20 6f 66 20  d in support of 
1c3d0 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20  the.** chromium 
1c3e0 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e  sandbox.  Openin
1c3f0 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 73  g a directory is
1c400 20 61 20 73 65 63 75 72 69 74 79 20 72 69 73 6b   a security risk
1c410 20 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64   (we are.** told
1c420 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f  ) so making it o
1c430 76 65 72 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f  verrideable allo
1c440 77 73 20 74 68 65 20 63 68 72 6f 6d 69 75 6d 20  ws the chromium 
1c450 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65  sandbox to.** re
1c460 70 6c 61 63 65 20 74 68 69 73 20 72 6f 75 74 69  place this routi
1c470 6e 65 20 77 69 74 68 20 61 20 68 61 72 6d 6c 65  ne with a harmle
1c480 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61  ss no-op.  To ma
1c490 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ke this routine.
1c4a0 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c  ** a no-op, repl
1c4b0 61 63 65 20 69 74 20 77 69 74 68 20 61 20 73 74  ace it with a st
1c4c0 75 62 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ub that returns 
1c4d0 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
1c4e0 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74  aves.** *pFd set
1c4f0 20 74 6f 20 61 20 6e 65 67 61 74 69 76 65 20 6e   to a negative n
1c500 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  umber..**.** If 
1c510 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1c520 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65  urned, the calle
1c530 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
1c540 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20   for closing.** 
1c550 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1c560 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63  tor *pFd using c
1c570 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lose()..*/.stati
1c580 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74  c int openDirect
1c590 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ory(const char *
1c5a0 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a  zFilename, int *
1c5b0 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a  pFd){.  int ii;.
1c5c0 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
1c5d0 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d   char zDirname[M
1c5e0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a  AX_PATHNAME+1];.
1c5f0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1c600 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ntf(MAX_PATHNAME
1c610 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22  , zDirname, "%s"
1c620 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
1c630 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c  for(ii=(int)strl
1c640 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69  en(zDirname); ii
1c650 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69  >1 && zDirname[i
1c660 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a  i]!='/'; ii--);.
1c670 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20    if( ii>0 ){.  
1c680 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d    zDirname[ii] =
1c690 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20   '\0';.    fd = 
1c6a0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72  robust_open(zDir
1c6b0 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f  name, O_RDONLY|O
1c6c0 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20  _BINARY, 0);.   
1c6d0 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20   if( fd>=0 ){.  
1c6e0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
1c6f0 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22  ENDIR %-3d %s\n"
1c700 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29  , fd, zDirname))
1c710 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
1c720 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72  Fd = fd;.  retur
1c730 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f  n (fd>=0?SQLITE_
1c740 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  OK:unixLogError(
1c750 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
1c760 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 44  BKPT, "open", zD
1c770 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a  irname));.}../*.
1c780 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** Make sure all
1c790 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72   writes to a par
1c7a0 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65  ticular file are
1c7b0 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
1c7c0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  sk..**.** If dat
1c7d0 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f  aOnly==0 then bo
1c7e0 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65  th the file itse
1c7f0 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64  lf and its metad
1c800 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a  ata (file.** siz
1c810 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20  e, access time, 
1c820 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e  etc) are synced.
1c830 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30    If dataOnly!=0
1c840 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a   then only the.*
1c850 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73  * file data is s
1c860 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64  ynced..**.** Und
1c870 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61  er Unix, also ma
1c880 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1c890 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
1c8a0 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a   for the file.**
1c8b0 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
1c8c0 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74  d by fsync-ing t
1c8d0 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
1c8e0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66  t contains the f
1c8f0 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f  ile..** If we do
1c900 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64   not do this and
1c910 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20   we encounter a 
1c920 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
1c930 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
1c940 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
1c950 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
1c960 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72  exist after we r
1c970 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74  eboot.  The next
1c980 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63  .** SQLite to ac
1c990 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69  cess the file wi
1c9a0 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74  ll not know that
1c9b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69   the journal exi
1c9c0 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  sts (because.** 
1c9d0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
1c9e0 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
1c9f0 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72  nal was never cr
1ca00 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74  eated) and the t
1ca10 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69  ransaction.** wi
1ca20 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b  ll not roll back
1ca30 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64   - possibly lead
1ca40 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20  ing to database 
1ca50 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
1ca60 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79  tatic int unixSy
1ca70 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nc(sqlite3_file 
1ca80 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  *id, int flags){
1ca90 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
1caa0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1cab0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
1cac0 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20   int isDataOnly 
1cad0 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  = (flags&SQLITE_
1cae0 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a  SYNC_DATAONLY);.
1caf0 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63    int isFullsync
1cb00 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d   = (flags&0x0F)=
1cb10 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1cb20 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  L;..  /* Check t
1cb30 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  hat one of SQLIT
1cb40 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  E_SYNC_NORMAL or
1cb50 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64   FULL was passed
1cb60 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c   */.  assert((fl
1cb70 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
1cb80 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20  E_SYNC_NORMAL.  
1cb90 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78      || (flags&0x
1cba0 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
1cbb0 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a  _FULL.  );..  /*
1cbc0 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75   Unix cannot, bu
1cbd0 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d  t some systems m
1cbe0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
1cbf0 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e  _FULL from here.
1cc00 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20   This.  ** line 
1cc10 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  is to test that 
1cc20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f  doing so does no
1cc30 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  t cause any prob
1cc40 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  lems..  */.  Sim
1cc50 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
1cc60 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1cc70 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73  E_FULL );..  ass
1cc80 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
1cc90 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 20  OSTRACE(("SYNC  
1cca0 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
1ccb0 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75  ->h));.  rc = fu
1ccc0 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e  ll_fsync(pFile->
1ccd0 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69  h, isFullsync, i
1cce0 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69  sDataOnly);.  Si
1ccf0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1cd00 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20  c=1 );.  if( rc 
1cd10 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
1cd20 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1cd30 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
1cd40 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1cd50 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 66 75  IOERR_FSYNC, "fu
1cd60 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c 65  ll_fsync", pFile
1cd70 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20  ->zPath);.  }.. 
1cd80 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63 20 74   /* Also fsync t
1cd90 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
1cda0 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6c 65  taining the file
1cdb0 20 69 66 20 74 68 65 20 44 49 52 53 59 4e 43 20   if the DIRSYNC 
1cdc0 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74  flag.  ** is set
1cdd0 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f 6e 65  .  This is a one
1cde0 2d 74 69 6d 65 20 6f 63 63 75 72 72 65 6e 63 65  -time occurrence
1cdf0 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d 73 20  .  Many systems 
1ce00 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58 29 0a  (examples: AIX).
1ce10 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c 65 20    ** are unable 
1ce20 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72 65 63  to fsync a direc
1ce30 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72 65 20  tory, so ignore 
1ce40 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20 66 73  errors on the fs
1ce50 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ync..  */.  if( 
1ce60 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1ce70 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53   & UNIXFILE_DIRS
1ce80 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 64  YNC ){.    int d
1ce90 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52 41 43  irfd;.    OSTRAC
1cea0 45 28 28 22 44 49 52 53 59 4e 43 20 25 73 20 28  E(("DIRSYNC %s (
1ceb0 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25  have_fullfsync=%
1cec0 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e  d fullsync=%d)\n
1ced0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  ", pFile->zPath,
1cee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56  .            HAV
1cef0 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46  E_FULLFSYNC, isF
1cf00 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20 20 72  ullsync));.    r
1cf10 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74  c = osOpenDirect
1cf20 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ory(pFile->zPath
1cf30 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69  , &dirfd);.    i
1cf40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cf50 20 26 26 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a   && dirfd>=0 ){.
1cf60 20 20 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63        full_fsync
1cf70 28 64 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a 20  (dirfd, 0, 0);. 
1cf80 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
1cf90 65 28 70 46 69 6c 65 2c 20 64 69 72 66 64 2c 20  e(pFile, dirfd, 
1cfa0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
1cfb0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
1cfc0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
1cfd0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1cfe0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1cff0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1d000 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49   &= ~UNIXFILE_DI
1d010 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 72 65 74  RSYNC;.  }.  ret
1d020 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d030 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65   Truncate an ope
1d040 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63  n file to a spec
1d050 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74  ified size.*/.st
1d060 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75  atic int unixTru
1d070 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
1d080 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74  le *id, i64 nByt
1d090 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  e){.  unixFile *
1d0a0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1d0b0 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  e *)id;.  int rc
1d0c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
1d0d0 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
1d0e0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
1d0f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1d100 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  CATE );..  /* If
1d110 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f   the user has co
1d120 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b  nfigured a chunk
1d130 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66  -size for this f
1d140 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68  ile, truncate th
1d150 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74  e.  ** file so t
1d160 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20  hat it consists 
1d170 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  of an integer nu
1d180 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28  mber of chunks (
1d190 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63  i.e. the.  ** ac
1d1a0 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61  tual file size a
1d1b0 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69  fter the operati
1d1c0 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72  on may be larger
1d1d0 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
1d1e0 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a  ted.  ** size)..
1d1f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
1d200 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
1d210 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79     nByte = ((nBy
1d220 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68  te + pFile->szCh
1d230 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e  unk - 1)/pFile->
1d240 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65  szChunk) * pFile
1d250 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a  ->szChunk;.  }..
1d260 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 74    rc = robust_ft
1d270 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  runcate(pFile->h
1d280 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b  , (off_t)nByte);
1d290 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1d2a0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1d2b0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
1d2c0 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
1d2d0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1d2e0 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e  TRUNCATE, "ftrun
1d2f0 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  cate", pFile->zP
1d300 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23  ath);.  }else{.#
1d310 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1d320 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  UG.    /* If we 
1d330 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d  are doing a norm
1d340 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61  al write to a da
1d350 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
1d360 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a  opposed to.    *
1d370 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  * doing a hot-jo
1d380 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
1d390 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d  r a write to som
1d3a0 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61  e file other tha
1d3b0 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61  n a.    ** norma
1d3c0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
1d3d0 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65   and we truncate
1d3e0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
1d3f0 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a  o length,.    **
1d400 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65 6c   that effectivel
1d410 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68  y updates the ch
1d420 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54  ange counter.  T
1d430 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
1d440 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73  .    ** when res
1d450 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61 73  toring a databas
1d460 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b  e using the back
1d470 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65  up API from a ze
1d480 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a  ro-length.    **
1d490 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a   source..    */.
1d4a0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69      if( pFile->i
1d4b0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20  nNormalWrite && 
1d4c0 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
1d4d0 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
1d4e0 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20  trChng = 1;.    
1d4f0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
1d500 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1d510 5a 45 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74  ZE>0.    /* If t
1d520 68 65 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  he file was just
1d530 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20   truncated to a 
1d540 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  size smaller tha
1d550 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a  n the currently.
1d560 20 20 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65      ** mapped re
1d570 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65  gion, reduce the
1d580 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70 69   effective mappi
1d590 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e  ng size as well.
1d5a0 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20   SQLite will.   
1d5b0 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20 61   ** use read() a
1d5c0 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61 63  nd write() to ac
1d5d0 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64  cess data beyond
1d5e0 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d   this point from
1d5f0 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a   now on.  .    *
1d600 2f 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c  /.    if( nByte<
1d610 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1d620 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1d630 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65  mmapSize = nByte
1d640 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1d650 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d660 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
1d670 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
1d680 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1d690 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
1d6a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1d6b0 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  nixFileSize(sqli
1d6c0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36  te3_file *id, i6
1d6d0 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  4 *pSize){.  int
1d6e0 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74   rc;.  struct st
1d6f0 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74  at buf;.  assert
1d700 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f  ( id );.  rc = o
1d710 73 46 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c  sFstat(((unixFil
1d720 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29  e*)id)->h, &buf)
1d730 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1d740 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
1d750 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1d760 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1d770 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1d780 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  no;.    return S
1d790 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1d7a0 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
1d7b0 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
1d7c0 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
1d7d0 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
1d7e0 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
1d7f0 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63  InodeInfo() proc
1d800 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
1d810 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
1d820 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
1d830 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
1d840 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
1d850 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
1d860 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
1d870 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
1d880 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
1d890 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
1d8a0 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
1d8b0 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
1d8c0 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
1d8d0 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
1d8e0 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
1d8f0 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
1d900 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
1d910 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
1d920 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
1d930 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
1d940 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1d950 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1d960 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1d970 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
1d980 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
1d990 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
1d9a0 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
1d9b0 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
1d9c0 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
1d9d0 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
1d9e0 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
1d9f0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
1da00 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
1da10 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
1da20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1da30 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
1da40 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
1da50 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
1da60 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
1da70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67  eration.  Enlarg
1da80 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
1da90 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65  o nBytes in size
1daa0 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20  .** (rounded up 
1dab0 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e  to the next chun
1dac0 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65  k-size).  If the
1dad0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
1dae0 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f  eady.** nBytes o
1daf0 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72  r larger, this r
1db00 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1db10 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
1db20 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75   fcntlSizeHint(u
1db30 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
1db40 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  i64 nByte){.  if
1db50 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1db60 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53  >0 ){.    i64 nS
1db70 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1db80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
1db90 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
1dba0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1dbb0 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
1dbc0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f     /* Used to ho
1dbd0 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ld return values
1dbe0 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20   of fstat() */. 
1dbf0 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74    .    if( osFst
1dc00 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
1dc10 66 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  f) ) return SQLI
1dc20 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
1dc30 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e  .    nSize = ((n
1dc40 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68  Byte+pFile->szCh
1dc50 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e  unk-1) / pFile->
1dc60 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65  szChunk) * pFile
1dc70 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69  ->szChunk;.    i
1dc80 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62 75  f( nSize>(i64)bu
1dc90 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69  f.st_size ){..#i
1dca0 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50  f defined(HAVE_P
1dcb0 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20  OSIX_FALLOCATE) 
1dcc0 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  && HAVE_POSIX_FA
1dcd0 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f 2a  LLOCATE.      /*
1dce0 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20   The code below 
1dcf0 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20  is handling the 
1dd00 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
1dd10 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20  osFallocate() . 
1dd20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c       ** correctl
1dd30 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  y. posix_falloca
1dd40 74 65 28 29 20 69 73 20 64 65 66 69 6e 65 64 20  te() is defined 
1dd50 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72 6f  to "returns zero
1dd60 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20 20   on success, .  
1dd70 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72      ** or an err
1dd80 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61  or number on  fa
1dd90 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65 20  ilure". See the 
1dda0 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74 61  manpage for deta
1ddb0 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ils. */.      in
1ddc0 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b  t err;.      do{
1ddd0 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d 20 6f  .        err = o
1dde0 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65  sFallocate(pFile
1ddf0 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65  ->h, buf.st_size
1de00 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73  , nSize-buf.st_s
1de10 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ize);.      }whi
1de20 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20 29  le( err==EINTR )
1de30 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 20  ;.      if( err 
1de40 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1de50 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c  IOERR_WRITE;.#el
1de60 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  se.      /* If t
1de70 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68  he OS does not h
1de80 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ave posix_falloc
1de90 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20  ate(), fake it. 
1dea0 46 69 72 73 74 20 75 73 65 0a 20 20 20 20 20 20  First use.      
1deb0 2a 2a 20 66 74 72 75 6e 63 61 74 65 28 29 20 74  ** ftruncate() t
1dec0 6f 20 73 65 74 20 74 68 65 20 66 69 6c 65 20 73  o set the file s
1ded0 69 7a 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  ize, then write 
1dee0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
1def0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  .      ** the la
1df00 73 74 20 62 79 74 65 20 69 6e 20 65 61 63 68 20  st byte in each 
1df10 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74 68 65  block within the
1df20 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e   extended region
1df30 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  . This.      ** 
1df40 69 73 20 74 68 65 20 73 61 6d 65 20 74 65 63 68  is the same tech
1df50 6e 69 71 75 65 20 75 73 65 64 20 62 79 20 67 6c  nique used by gl
1df60 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ibc to implement
1df70 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
1df80 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 73  ().      ** on s
1df90 79 73 74 65 6d 73 20 74 68 61 74 20 64 6f 20 6e  ystems that do n
1dfa0 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20 66  ot have a real f
1dfb0 61 6c 6c 6f 63 61 74 65 28 29 20 73 79 73 74 65  allocate() syste
1dfc0 6d 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f  m call..      */
1dfd0 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20  .      int nBlk 
1dfe0 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65  = buf.st_blksize
1dff0 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65  ;  /* File-syste
1e000 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a  m block size */.
1e010 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74 65        i64 iWrite
1e020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e030 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74    /* Next offset
1e040 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1e050 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73  .      if( robus
1e060 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c  t_ftruncate(pFil
1e070 65 2d 3e 68 2c 20 6e 53 69 7a 65 29 20 29 7b 0a  e->h, nSize) ){.
1e080 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
1e090 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1e0a0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1e0b0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1e0c0 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1e0d0 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  ATE, "ftruncate"
1e0e0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1e0f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1e100 57 72 69 74 65 20 3d 20 28 28 62 75 66 2e 73 74  Write = ((buf.st
1e110 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d  _size + 2*nBlk -
1e120 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31   1)/nBlk)*nBlk-1
1e130 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  ;.      while( i
1e140 57 72 69 74 65 3c 6e 53 69 7a 65 20 29 7b 0a 20  Write<nSize ){. 
1e150 20 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74         int nWrit
1e160 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1e170 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20  (pFile, iWrite, 
1e180 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  "", 1);.        
1e190 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20  if( nWrite!=1 ) 
1e1a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1e1b0 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20  ERR_WRITE;.     
1e1c0 20 20 20 69 57 72 69 74 65 20 2b 3d 20 6e 42 6c     iWrite += nBl
1e1d0 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
1e1e0 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  f.    }.  }..#if
1e1f0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1e200 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46  _SIZE>0.  if( pF
1e210 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
1e220 3e 30 20 26 26 20 6e 42 79 74 65 3e 70 46 69 6c  >0 && nByte>pFil
1e230 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
1e240 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
1e250 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
1e260 6b 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  k<=0 ){.      if
1e270 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  ( robust_ftrunca
1e280 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79  te(pFile->h, nBy
1e290 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  te) ){.        p
1e2a0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1e2b0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
1e2c0 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1e2d0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1e2e0 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72  R_TRUNCATE, "ftr
1e2f0 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e  uncate", pFile->
1e300 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zPath);.      }.
1e310 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
1e320 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c  unixMapfile(pFil
1e330 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 72  e, nByte);.    r
1e340 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
1e350 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53  ndif..  return S
1e360 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1e370 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69  ** If *pArg is i
1e380 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67 61 74  nititially negat
1e390 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73  ive then this is
1e3a0 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a   a query.  Set *
1e3b0 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20  pArg to.** 1 or 
1e3c0 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  0 depending on w
1e3d0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69  hether or not bi
1e3e0 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d  t mask of pFile-
1e3f0 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65  >ctrlFlags is se
1e400 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  t..**.** If *pAr
1e410 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65  g is 0 or 1, the
1e420 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74  n clear or set t
1e430 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70  he mask bit of p
1e440 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e  File->ctrlFlags.
1e450 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e460 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69 78  unixModeBit(unix
1e470 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73  File *pFile, uns
1e480 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c  igned char mask,
1e490 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69   int *pArg){.  i
1e4a0 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20  f( *pArg<0 ){.  
1e4b0 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65    *pArg = (pFile
1e4c0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61  ->ctrlFlags & ma
1e4d0 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20  sk)!=0;.  }else 
1e4e0 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29  if( (*pArg)==0 )
1e4f0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
1e500 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  lFlags &= ~mask;
1e510 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
1e520 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
1e530 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = mask;.  }.}../
1e540 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
1e550 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
1e560 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e  int unixGetTempn
1e570 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  ame(int nBuf, ch
1e580 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a  ar *zBuf);../*.*
1e590 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e  * Information an
1e5a0 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20  d control of an 
1e5b0 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65  open file handle
1e5c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e5d0 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  unixFileControl(
1e5e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1e5f0 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
1e600 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c  pArg){.  unixFil
1e610 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1e620 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74  File*)id;.  swit
1e630 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1e640 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1e650 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
1e660 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1e670 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1e680 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  k;.      return 
1e690 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1e6a0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e6b0 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20  _LAST_ERRNO: {. 
1e6c0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
1e6d0 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
1e6e0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rno;.      retur
1e6f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1e700 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1e710 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  TE_FCNTL_CHUNK_S
1e720 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69  IZE: {.      pFi
1e730 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28  le->szChunk = *(
1e740 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  int *)pArg;.    
1e750 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e760 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1e770 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1e780 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20  SIZE_HINT: {.   
1e790 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
1e7a0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1e7b0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
1e7c0 20 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48   rc = fcntlSizeH
1e7d0 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69 36 34  int(pFile, *(i64
1e7e0 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20   *)pArg);.      
1e7f0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1e800 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
1e810 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1e820 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e830 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57  _FCNTL_PERSIST_W
1e840 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  AL: {.      unix
1e850 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55  ModeBit(pFile, U
1e860 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  NIXFILE_PERSIST_
1e870 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  WAL, (int*)pArg)
1e880 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1e890 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1e8a0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e8b0 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f  FCNTL_POWERSAFE_
1e8c0 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20  OVERWRITE: {.   
1e8d0 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70     unixModeBit(p
1e8e0 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50  File, UNIXFILE_P
1e8f0 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  SOW, (int*)pArg)
1e900 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1e910 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1e920 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e930 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b  FCNTL_VFSNAME: {
1e940 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29  .      *(char**)
1e950 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pArg = sqlite3_m
1e960 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69  printf("%s", pFi
1e970 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29  le->pVfs->zName)
1e980 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1e990 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1e9a0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e9b0 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41  FCNTL_TEMPFILENA
1e9c0 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  ME: {.      char
1e9d0 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69 74   *zTFile = sqlit
1e9e0 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 46 69 6c 65  e3_malloc( pFile
1e9f0 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1ea00 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  me );.      if( 
1ea10 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  zTFile ){.      
1ea20 20 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d    unixGetTempnam
1ea30 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d  e(pFile->pVfs->m
1ea40 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46 69 6c  xPathname, zTFil
1ea50 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 63 68  e);.        *(ch
1ea60 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69  ar**)pArg = zTFi
1ea70 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  le;.      }.    
1ea80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ea90 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51  OK;.    }.#if SQ
1eaa0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1eab0 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51  ZE>0.    case SQ
1eac0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
1ead0 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36  SIZE: {.      i6
1eae0 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69  4 newLimit = *(i
1eaf0 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  64*)pArg;.      
1eb00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1eb10 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  OK;.      if( ne
1eb20 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c  wLimit>sqlite3Gl
1eb30 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
1eb40 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77  p ){.        new
1eb50 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47  Limit = sqlite3G
1eb60 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d  lobalConfig.mxMm
1eb70 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ap;.      }.    
1eb80 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20    *(i64*)pArg = 
1eb90 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1eba0 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ax;.      if( ne
1ebb0 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77  wLimit>=0 && new
1ebc0 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d  Limit!=pFile->mm
1ebd0 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69  apSizeMax && pFi
1ebe0 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  le->nFetchOut==0
1ebf0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
1ec00 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  e->mmapSizeMax =
1ec10 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20   newLimit;.     
1ec20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d     if( pFile->mm
1ec30 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  apSize>0 ){.    
1ec40 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66        unixUnmapf
1ec50 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ile(pFile);.    
1ec60 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d        rc = unixM
1ec70 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31  apfile(pFile, -1
1ec80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1ec90 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1eca0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  n rc;.    }.#end
1ecb0 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1ecc0 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
1ecd0 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68  e pager calls th
1ece0 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67  is method to sig
1ecf0 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61 73 20  nal that it has 
1ed00 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f  done.    ** a ro
1ed10 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  llback and that 
1ed20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1ed30 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e  therefore unchan
1ed40 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69  ged and.    ** i
1ed50 74 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b  t hence it is OK
1ed60 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63   for the transac
1ed70 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e  tion change coun
1ed80 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  ter to be.    **
1ed90 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20   unchanged..    
1eda0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1edb0 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1edc0 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28  ANGED: {.      (
1edd0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1ede0 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  dbUpdate = 0;.  
1edf0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ee00 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  E_OK;.    }.#end
1ee10 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
1ee20 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1ee30 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
1ee40 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73  APPLE__).    cas
1ee50 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  e SQLITE_SET_LOC
1ee60 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20  KPROXYFILE:.    
1ee70 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f  case SQLITE_GET_
1ee80 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
1ee90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72  .      return pr
1eea0 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69  oxyFileControl(i
1eeb0 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20  d,op,pArg);.    
1eec0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1eed0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1eee0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
1eef0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f  ed(__APPLE__) */
1ef00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1ef10 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d  LITE_NOTFOUND;.}
1ef20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1ef30 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
1ef40 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75  n bytes of the u
1ef50 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20  nderlying block 
1ef60 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68  device for.** th
1ef70 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
1ef80 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74  . This is almost
1ef90 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
1efa0 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a  s, but may be.**
1efb0 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65   larger for some
1efc0 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   devices..**.** 
1efd0 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75  SQLite code assu
1efe0 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  mes this functio
1eff0 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49  n cannot fail. I
1f000 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  t also assumes t
1f010 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69  hat.** if two fi
1f020 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
1f030 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  in the same file
1f040 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72  -system director
1f050 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74  y (i.e..** a dat
1f060 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f  abase and its jo
1f070 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74  urnal file) that
1f080 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1f090 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20   will be the.** 
1f0a0 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a  same for both..*
1f0b0 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e  /.#ifndef __QNXN
1f0c0 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69 6e 74  TO__ .static int
1f0d0 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
1f0e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
1f0f0 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
1f100 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
1f110 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ed);.  return SQ
1f120 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
1f130 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64  TOR_SIZE;.}.#end
1f140 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1f150 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f 6e 20  llowing version 
1f160 6f 66 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  of unixSectorSiz
1f170 65 28 29 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  e() is optimized
1f180 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66   for QNX..*/.#if
1f190 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23  def __QNXNTO__.#
1f1a0 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d  include <sys/dcm
1f1b0 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64  d_blk.h>.#includ
1f1c0 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68  e <sys/statvfs.h
1f1d0 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  >.static int uni
1f1e0 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  xSectorSize(sqli
1f1f0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
1f200 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1f210 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1f220 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  ;.  if( pFile->s
1f230 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20 29  ectorSize == 0 )
1f240 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
1f250 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  tvfs fsInfo;.   
1f260 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20      .    /* Set 
1f270 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f 6e  defaults for non
1f280 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65 73  -supported files
1f290 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70 46  ystems */.    pF
1f2a0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1f2b0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
1f2c0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
1f2d0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1f2e0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1f2f0 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73 74 61   0;.    if( fsta
1f300 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20 26  tvfs(pFile->h, &
1f310 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20  fsInfo) == -1 ) 
1f320 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1f330 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f340 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1f350 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
1f360 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70  f_basetype, "tmp
1f370 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ") ) {.      pFi
1f380 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1f390 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
1f3a0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1f3b0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1f3c0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
1f3d0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1f3e0 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41  C4K |       /* A
1f3f0 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  ll ram filesyste
1f400 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  m writes are ato
1f410 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
1f420 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1f430 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
1f440 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
1f450 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
1f460 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
1f470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f480 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1f490 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
1f4a0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
1f4b0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
1f4c0 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
1f4d0 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
1f4e0 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
1f4f0 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
1f500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f510 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
1f520 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
1f530 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
1f540 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74   }else if( strst
1f550 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  r(fsInfo.f_baset
1f560 79 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a  ype, "etfs") ){.
1f570 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
1f580 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
1f590 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
1f5a0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1f5b0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
1f5c0 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63         /* etfs c
1f5d0 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72 69 74  luster size writ
1f5e0 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  es are atomic */
1f5f0 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d  .        (pFile-
1f600 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
1f610 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
1f620 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20  _ATOMIC512) |.  
1f630 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1f640 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
1f650 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
1f660 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1f670 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
1f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6a0 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
1f6b0 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
1f6c0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1f6d0 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
1f6e0 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
1f6f0 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
1f700 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f730 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
1f740 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
1f750 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1f760 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  ( !strcmp(fsInfo
1f770 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e  .f_basetype, "qn
1f780 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  x6") ){.      pF
1f790 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1f7a0 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
1f7b0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
1f7c0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1f7d0 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
1f7e0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
1f7f0 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20  IC |         /* 
1f800 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77  All filesystem w
1f810 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
1f820 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
1f830 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
1f840 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
1f850 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
1f860 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
1f870 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
1f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f890 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
1f8a0 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
1f8b0 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
1f8c0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f8d0 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
1f8e0 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
1f8f0 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
1f900 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
1f910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f920 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
1f930 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
1f940 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
1f950 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28  lse if( !strcmp(
1f960 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
1f970 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20  e, "qnx4") ){.  
1f980 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1f990 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
1f9a0 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
1f9b0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1f9c0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
1f9d0 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74       /* full bit
1f9e0 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66  set of atomics f
1f9f0 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73  rom max sector s
1fa00 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20  ize and smaller 
1fa10 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69  */.        ((pFi
1fa20 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
1fa30 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
1fa40 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c  CAP_ATOMIC512) <
1fa50 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20  < 1) - 2 |.     
1fa60 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1fa70 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
1fa80 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
1fa90 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
1faa0 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fad0 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
1fae0 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
1faf0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1fb00 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66   strstr(fsInfo.f
1fb10 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22  _basetype, "dos"
1fb20 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1fb30 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
1fb40 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
1fb50 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
1fb60 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1fb70 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66  s =.        /* f
1fb80 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74  ull bitset of at
1fb90 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73  omics from max s
1fba0 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73  ector size and s
1fbb0 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20  maller */.      
1fbc0 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f    ((pFile->secto
1fbd0 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
1fbe0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1fbf0 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20  C512) << 1) - 2 
1fc00 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
1fc10 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1fc20 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
1fc30 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
1fc40 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
1fc50 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc70 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
1fc80 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
1fc90 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
1fca0 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
1fcb0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1fcc0 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
1fcd0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
1fce0 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20  TOMIC512 |      
1fcf0 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74  /* blocks are at
1fd00 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
1fd10 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1fd20 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
1fd30 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
1fd40 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
1fd50 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1fd80 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
1fd90 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ds */.        0;
1fda0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
1fdb0 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65 72 69  Last chance veri
1fdc0 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  fication.  If th
1fdd0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
1fde0 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  n't a multiple o
1fdf0 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20  f 512.  ** then 
1fe00 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a  it isn't valid.*
1fe10 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
1fe20 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20  ectorSize % 512 
1fe30 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  != 0 ){.    pFil
1fe40 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1fe50 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20  eristics = 0;.  
1fe60 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1fe70 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
1fe80 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1fe90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1fea0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1feb0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f  ;.}.#endif /* __
1fec0 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a  QNXNTO__ */../*.
1fed0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
1fee0 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
1fef0 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c  tics for the fil
1ff00 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46  e..**.** This VF
1ff10 53 20 69 73 20 73 65 74 20 75 70 20 74 6f 20 72  S is set up to r
1ff20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43  eturn SQLITE_IOC
1ff30 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
1ff40 52 57 52 49 54 45 20 62 79 20 64 65 66 61 75 6c  RWRITE by defaul
1ff50 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74  t..** However, t
1ff60 68 61 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f  hat choice is co
1ff70 6e 74 72 61 76 65 72 73 69 61 6c 20 73 69 6e 63  ntraversial sinc
1ff80 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  e technically th
1ff90 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
1ffa0 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73  file system does
1ffb0 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76   not always prov
1ffc0 69 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76  ide powersafe ov
1ffd0 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f  erwrites.  (In o
1ffe0 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
1fff0 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73  fter a power-los
20000 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f  s event, parts o
20010 66 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  f the file that 
20020 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72  were never.** wr
20030 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20  itten might end 
20040 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64  up being altered
20050 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e  .)  However, non
20060 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69  -PSOW behavior i
20070 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20  s very,.** very 
20080 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72  rare.  And asser
20090 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20  ting PSOW makes 
200a0 61 20 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f  a large reductio
200b0 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a  n in the amount.
200c0 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20 49  ** of required I
200d0 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e  /O for journalin
200e0 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f  g, since a lot o
200f0 66 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69  f padding is eli
20100 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e  minated..**  Hen
20110 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53  ce, while POWERS
20120 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73  AFE_OVERWRITE is
20130 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20   on by default, 
20140 74 68 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d  there is a file-
20150 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c  control.** avail
20160 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20  able to turn it 
20170 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75 65 72  off and URI quer
20180 79 20 70 61 72 61 6d 65 74 65 72 20 61 76 61 69  y parameter avai
20190 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74  lable to turn it
201a0 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
201b0 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
201c0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
201d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
201e0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
201f0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
20200 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69    int rc = 0;.#i
20210 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a  fdef __QNXNTO__.
20220 20 20 69 66 28 20 70 2d 3e 73 65 63 74 6f 72 53    if( p->sectorS
20230 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53 65 63  ize==0 ) unixSec
20240 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20 20 72  torSize(id);.  r
20250 63 20 3d 20 70 2d 3e 64 65 76 69 63 65 43 68 61  c = p->deviceCha
20260 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a 23 65  racteristics;.#e
20270 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 63 74  ndif.  if( p->ct
20280 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
20290 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20 72  LE_PSOW ){.    r
202a0 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41  c |= SQLITE_IOCA
202b0 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
202c0 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72 65 74  WRITE;.  }.  ret
202d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
202e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
202f0 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  AL.../*.** Objec
20300 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  t used to repres
20310 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d 65  ent an shared me
20320 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0a 2a  mory buffer.  .*
20330 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70  *.** When multip
20340 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72  le threads all r
20350 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d  eference the sam
20360 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63  e wal-index, eac
20370 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61 73 20  h thread.** has 
20380 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20  its own unixShm 
20390 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79  object, but they
203a0 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20   all point to a 
203b0 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a  single instance.
203c0 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69 78 53  ** of this unixS
203d0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20  hmNode object.  
203e0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
203f0 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78 20 69  each wal-index i
20400 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79  s opened.** only
20410 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73   once per proces
20420 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e  s..**.** Each un
20430 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
20440 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
20450 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e   a single unixIn
20460 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  odeInfo object..
20470 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c  ** We could coal
20480 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65 63 74  esce this object
20490 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49   into unixInodeI
204a0 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20 77 6f  nfo, but that wo
204b0 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72  uld mean.** ever
204c0 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68 61 74  y open file that
204d0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 68   does not use sh
204e0 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20  ared memory (in 
204f0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73  other words, mos
20500 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29  t.** open files)
20510 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 63   would have to c
20520 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68 69 73  arry around this
20530 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
20540 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75  on.  So.** the u
20550 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
20560 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ect contains a p
20570 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 75  ointer to this u
20580 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
20590 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e 69  t.** and the uni
205a0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
205b0 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c 79 20  is created only 
205c0 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  when needed..**.
205d0 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  ** unixMutexHeld
205e0 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
205f0 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72  when creating or
20600 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74   destroying.** t
20610 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68  his object or wh
20620 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77  ile reading or w
20630 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  riting the follo
20640 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a  wing fields:.**.
20650 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a  **      nRef.**.
20660 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
20670 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
20680 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
20690 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
206a0 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66  d:.** .**      f
206b0 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  id.**      zFile
206c0 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
206d0 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75  r unixShmNode.mu
206e0 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
206f0 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e   or unixShmNode.
20700 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75  nRef==0 and.** u
20710 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69  nixMutexHeld() i
20720 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64  s true when read
20730 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ing or writing a
20740 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a  ny other field.*
20750 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  * in this struct
20760 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  ure..*/.struct u
20770 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75  nixShmNode {.  u
20780 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
20790 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69  node;     /* uni
207a0 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20  xInodeInfo that 
207b0 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f  owns this SHM no
207c0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
207d0 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20  mutex *mutex;   
207e0 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61     /* Mutex to a
207f0 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63  ccess this objec
20800 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  t */.  char *zFi
20810 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
20820 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
20830 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
20840 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20  .  int h;       
20850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20860 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
20870 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73  iptor */.  int s
20880 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  zRegion;        
20890 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
208a0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
208b0 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20  egions */.  u16 
208c0 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  nRegion;        
208d0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
208e0 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e  f array apRegion
208f0 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61 64 6f   */.  u8 isReado
20900 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
20910 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64   /* True if read
20920 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72 20  -only */.  char 
20930 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20  **apRegion;     
20940 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
20950 66 20 6d 61 70 70 65 64 20 73 68 61 72 65 64 2d  f mapped shared-
20960 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a  memory regions *
20970 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20990 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78  * Number of unix
209a0 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
209b0 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
209c0 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73    unixShm *pFirs
209d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
209e0 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  All unixShm obje
209f0 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
20a00 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  this */.#ifdef S
20a10 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38  QLITE_DEBUG.  u8
20a20 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
20a30 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
20a40 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   of exclusive lo
20a50 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38  cks held */.  u8
20a60 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20   sharedMask;    
20a70 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
20a80 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73   of shared locks
20a90 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65   held */.  u8 ne
20aa0 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20  xtShmId;        
20ab0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76        /* Next av
20ac0 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e  ailable unixShm.
20ad0 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64  id value */.#end
20ae0 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72  if.};../*.** Str
20af0 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65  ucture used inte
20b00 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56  rnally by this V
20b10 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  FS to record the
20b20 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20   state of an.** 
20b30 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  open shared memo
20b40 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ry connection..*
20b50 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
20b60 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e  ng fields are in
20b70 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74  itialized when t
20b80 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72  his object is cr
20b90 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65  eated and.** are
20ba0 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65   read-only there
20bb0 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  after:.**.**    
20bc0 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a  unixShm.pFile.**
20bd0 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a      unixShm.id.*
20be0 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66  *.** All other f
20bf0 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77  ields are read/w
20c00 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53  rite.  The unixS
20c10 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20  hm.pFile->mutex 
20c20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
20c30 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20  while accessing 
20c40 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66  any read/write f
20c50 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  ields..*/.struct
20c60 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69   unixShm {.  uni
20c70 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
20c80 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75  de;     /* The u
20c90 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68  nderlying unixSh
20ca0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  mNode object */.
20cb0 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74    unixShm *pNext
20cc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
20cd0 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74  Next unixShm wit
20ce0 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53  h the same unixS
20cf0 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68  hmNode */.  u8 h
20d00 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20  asMutex;        
20d10 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
20d20 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e  f holding the un
20d30 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20  ixShmNode mutex 
20d40 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20  */.  u8 id;     
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d60 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f  /* Id of this co
20d70 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20  nnection within 
20d80 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  its unixShmNode 
20d90 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d  */.  u16 sharedM
20da0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
20db0 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
20dc0 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
20dd0 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20    u16 exclMask; 
20de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20df0 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
20e00 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
20e10 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61  };../*.** Consta
20e20 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  nts used for loc
20e30 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  king.*/.#define 
20e40 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20  UNIX_SHM_BASE   
20e50 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  ((22+SQLITE_SHM_
20e60 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20  NLOCK)*4)       
20e70 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20    /* first lock 
20e80 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  byte */.#define 
20e90 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20  UNIX_SHM_DMS    
20ea0 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53  (UNIX_SHM_BASE+S
20eb0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
20ec0 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69    /* deadman swi
20ed0 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70  tch */../*.** Ap
20ee0 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73 6f  ply posix adviso
20ef0 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c  ry locks for all
20f00 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73 74   bytes from ofst
20f10 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d   through ofst+n-
20f20 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62  1..**.** Locks b
20f30 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b  lock if the mask
20f40 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58   is exactly UNIX
20f50 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e  _SHM_C and are n
20f60 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f  on-blocking.** o
20f70 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
20f80 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53  tic int unixShmS
20f90 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69  ystemLock(.  uni
20fa0 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
20fb0 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63  de, /* Apply loc
20fc0 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20  ks to this open 
20fd0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
20fe0 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  gment */.  int l
20ff0 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20  ockType,        
21000 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f    /* F_UNLCK, F_
21010 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43  RDLCK, or F_WRLC
21020 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  K */.  int ofst,
21030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21040 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
21050 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65  he locking range
21060 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20   */.  int n     
21070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21080 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
21090 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  to lock */.){.  
210a0 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20  struct flock f; 
210b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73        /* The pos
210c0 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
210d0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ing structure */
210e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
210f0 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65 73 75  TE_OK;   /* Resu
21100 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e  lt code form fcn
21110 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63  tl() */..  /* Ac
21120 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78  cess to the unix
21130 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
21140 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20  s serialized by 
21150 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20  the caller */.  
21160 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21170 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e  mutex_held(pShmN
21180 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70  ode->mutex) || p
21190 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
211a0 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64   );..  /* Shared
211b0 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73 70 61   locks never spa
211c0 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  n more than one 
211d0 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  byte */.  assert
211e0 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79  ( n==1 || lockTy
211f0 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a  pe!=F_RDLCK );..
21200 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77    /* Locks are w
21210 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20  ithin range */. 
21220 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 26 26   assert( n>=1 &&
21230 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c   n<SQLITE_SHM_NL
21240 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  OCK );..  if( pS
21250 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a  hmNode->h>=0 ){.
21260 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
21270 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  e the locking pa
21280 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20  rameters */.    
21290 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73 69  memset(&f, 0, si
212a0 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20 20 66 2e  zeof(f));.    f.
212b0 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70  l_type = lockTyp
212c0 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63  e;.    f.l_whenc
212d0 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
212e0 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66    f.l_start = of
212f0 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20  st;.    f.l_len 
21300 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f  = n;..    rc = o
21310 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d  sFcntl(pShmNode-
21320 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29  >h, F_SETLK, &f)
21330 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63 21 3d  ;.    rc = (rc!=
21340 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f  (-1)) ? SQLITE_O
21350 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  K : SQLITE_BUSY;
21360 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
21370 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63  e the global loc
21380 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64  k state and do d
21390 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a  ebug tracing */.
213a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
213b0 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b  BUG.  { u16 mask
213c0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
213d0 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61  M-LOCK "));.  ma
213e0 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e  sk = (1<<(ofst+n
213f0 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a  )) - (1<<ofst);.
21400 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21410 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c  _OK ){.    if( l
21420 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  ockType==F_UNLCK
21430 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
21440 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b  E(("unlock %d ok
21450 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20  ", ofst));.     
21460 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d   pShmNode->exclM
21470 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
21480 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
21490 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
214a0 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  k;.    }else if(
214b0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c   lockType==F_RDL
214c0 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
214d0 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20  ACE(("read-lock 
214e0 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
214f0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21500 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
21510 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
21520 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  e->sharedMask |=
21530 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65   mask;.    }else
21540 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21550 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43  lockType==F_WRLC
21560 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  K );.      OSTRA
21570 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20  CE(("write-lock 
21580 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
21590 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
215a0 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
215b0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
215c0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
215d0 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ~mask;.    }.  }
215e0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f  else{.    if( lo
215f0 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  ckType==F_UNLCK 
21600 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
21610 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69  (("unlock %d fai
21620 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20  led", ofst));.  
21630 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
21640 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  Type==F_RDLCK ){
21650 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
21660 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65  "read-lock faile
21670 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  d"));.    }else{
21680 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c  .      assert( l
21690 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  ockType==F_WRLCK
216a0 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   );.      OSTRAC
216b0 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25  E(("write-lock %
216c0 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29  d failed", ofst)
216d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f  );.    }.  }.  O
216e0 53 54 52 41 43 45 28 28 22 20 2d 20 61 66 74 65  STRACE((" - afte
216f0 72 77 61 72 64 73 20 25 30 33 78 2c 25 30 33 78  rwards %03x,%03x
21700 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
21710 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
21720 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  Mask, pShmNode->
21730 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a  exclMask));.  }.
21740 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
21750 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a   rc;        .}..
21760 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  ./*.** Purge the
21770 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74   unixShmNodeList
21780 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74   list of all ent
21790 72 69 65 73 20 77 69 74 68 20 75 6e 69 78 53 68  ries with unixSh
217a0 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a  mNode.nRef==0..*
217b0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
217c0 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65   a VFS shared-me
217d0 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20  mory method; it 
217e0 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e  is a utility fun
217f0 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20  ction called.** 
21800 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65  by VFS shared-me
21810 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f  mory methods..*/
21820 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
21830 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69  xShmPurge(unixFi
21840 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78  le *pFd){.  unix
21850 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64  ShmNode *p = pFd
21860 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
21870 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  de;.  assert( un
21880 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
21890 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e  .  if( p && p->n
218a0 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Ref==0 ){.    in
218b0 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t i;.    assert(
218c0 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d   p->pInode==pFd-
218d0 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73  >pInode );.    s
218e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
218f0 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  e(p->mutex);.   
21900 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
21910 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Region; i++){.  
21920 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20      if( p->h>=0 
21930 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e  ){.        osMun
21940 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  map(p->apRegion[
21950 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29  i], p->szRegion)
21960 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21970 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
21980 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  ree(p->apRegion[
21990 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
219a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
219b0 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29  ree(p->apRegion)
219c0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d  ;.    if( p->h>=
219d0 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73  0 ){.      robus
219e0 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e  t_close(pFd, p->
219f0 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
21a00 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20      p->h = -1;. 
21a10 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f     }.    p->pIno
21a20 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30  de->pShmNode = 0
21a30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
21a40 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
21a50 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65  .** Open a share
21a60 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
21a70 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f 70  sociated with op
21a80 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
21a90 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69   pDbFd.  .** Thi
21aa0 73 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70  s particular imp
21ab0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
21ac0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a   mmapped files..
21ad0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75  **.** The file u
21ae0 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
21af0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69   shared-memory i
21b00 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  s in the same di
21b10 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68  rectory.** as th
21b20 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
21b30 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65  file and has the
21b40 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
21b50 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a  e open database.
21b60 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  ** file with the
21b70 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61   "-shm" suffix a
21b80 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70  dded.  For examp
21b90 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  le, if the datab
21ba0 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22  ase file.** is "
21bb0 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
21bc0 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20  ig.db" then the 
21bd0 66 69 6c 65 20 74 68 61 74 20 69 73 20 63 72 65  file that is cre
21be0 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64  ated and mmapped
21bf0 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d  .** for shared m
21c00 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61  emory will be ca
21c10 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72  lled "/home/user
21c20 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22  1/config.db-shm"
21c30 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65  .  .**.** Anothe
21c40 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73  r approach to is
21c50 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e   to use files in
21c60 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65   /dev/shm or /de
21c70 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73  v/tmp or an.** s
21c80 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20  ome other tmpfs 
21c90 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20  mount. But if a 
21ca0 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72  file in a differ
21cb0 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  ent directory.**
21cc0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
21cd0 73 65 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c  se file is used,
21ce0 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20   then differing 
21cf0 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
21d00 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f  ns.** or a chroo
21d10 74 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20  t() might cause 
21d20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72  two different pr
21d30 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73  ocesses on the s
21d40 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ame.** database 
21d50 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20  to end up using 
21d60 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20  different files 
21d70 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  for shared memor
21d80 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20  y - .** meaning 
21d90 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72  that their memor
21da0 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c  y would not real
21db0 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 72  ly be shared - r
21dc0 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64  esulting.** in d
21dd0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
21de0 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  on.  Nevertheles
21df0 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66 69  s, this tmpfs fi
21e00 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20  le usage.** can 
21e10 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  be enabled at co
21e20 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67  mpile-time using
21e30 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49   -DSQLITE_SHM_DI
21e40 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68  RECTORY="/dev/sh
21e50 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75  m".** or the equ
21e60 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73  ivalent.  The us
21e70 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
21e80 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f  SHM_DIRECTORY co
21e90 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70  mpile-time.** op
21ea0 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20  tion results in 
21eb0 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
21ec0 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b  build of SQLite;
21ed0 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69    builds of SQLi
21ee0 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20  te.** that with 
21ef0 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45  differing SQLITE
21f00 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73  _SHM_DIRECTORY s
21f10 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20  ettings attempt 
21f20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61  to use the.** sa
21f30 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
21f40 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
21f50 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  e, database corr
21f60 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65  uption will like
21f70 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68  ly.** result. Th
21f80 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
21f90 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
21fa0 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f  ime option is co
21fb0 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73  nsidered.** "uns
21fc0 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61  upported" and ma
21fd0 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66  y go away in a f
21fe0 75 74 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c  uture SQLite rel
21ff0 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ease..**.** When
22000 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
22010 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
22020 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
22030 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
22040 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
22050 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
22060 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
22070 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
22080 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
22090 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
220a0 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
220b0 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
220c0 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
220d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
220e0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
220f0 20 66 69 6c 65 20 28 70 44 62 46 64 29 20 69 73   file (pDbFd) is
22100 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78   using the "unix
22110 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68  -excl" VFS.** th
22120 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e  at means that an
22130 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
22140 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
22150 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
22160 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  .** that no othe
22170 72 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 20  r processes are 
22180 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20  able to read or 
22190 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61  write the databa
221a0 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20  se.  In.** that 
221b0 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20  case, we do not 
221c0 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72  really need shar
221d0 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73  ed memory.  No s
221e0 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20  hared memory.** 
221f0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e  file is created.
22200 20 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d    The shared mem
22210 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75  ory will be simu
22220 6c 61 74 65 64 20 77 69 74 68 20 68 65 61 70 20  lated with heap 
22230 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
22240 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68  c int unixOpenSh
22250 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46  aredMemory(unixF
22260 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
22270 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70  truct unixShm *p
22280 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
22290 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
222a0 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
222b0 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  .  struct unixSh
222c0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
222d0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
222e0 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c  ying mmapped fil
222f0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
22300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22310 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
22320 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49   code */.  unixI
22330 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
22340 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
22350 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f  e inode of fd */
22360 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c  .  char *zShmFil
22370 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
22380 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
22390 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
223a0 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68  SHM */.  int nSh
223b0 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  mFilename;      
223c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
223d0 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65   of the SHM file
223e0 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  name in bytes */
223f0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
22400 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
22410 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  w unixShm object
22420 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74  . */.  p = sqlit
22430 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
22440 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
22450 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
22460 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
22470 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
22480 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74 28  (*p));.  assert(
22490 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
224a0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
224b0 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69 78 53  o see if a unixS
224c0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c  hmNode object al
224d0 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 52 65  ready exists. Re
224e0 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
224f0 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65 73    ** one if pres
22500 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e 65  ent. Create a ne
22510 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
22520 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ry..  */.  unixE
22530 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
22540 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
22550 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64  Inode;.  pShmNod
22560 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  e = pInode->pShm
22570 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d  Node;.  if( pShm
22580 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Node==0 ){.    s
22590 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
225a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
225b0 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e 66    /* fstat() inf
225c0 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66  o for database f
225d0 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43  ile */..    /* C
225e0 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66  all fstat() to f
225f0 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65  igure out the pe
22600 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
22610 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
22620 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20  If.    ** a new 
22630 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72  *-shm file is cr
22640 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70  eated, an attemp
22650 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  t will be made t
22660 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20  o create it.    
22670 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ** with the same
22680 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20   permissions..  
22690 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46    */.    if( osF
226a0 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26  stat(pDbFd->h, &
226b0 73 53 74 61 74 29 20 26 26 20 70 49 6e 6f 64 65  sStat) && pInode
226c0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
226d0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
226e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
226f0 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  AT;.      goto s
22700 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
22710 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
22720 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
22730 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65      nShmFilename
22740 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45   = sizeof(SQLITE
22750 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20  _SHM_DIRECTORY) 
22760 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20  + 31;.#else.    
22770 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36  nShmFilename = 6
22780 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70   + (int)strlen(p
22790 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65  DbFd->zPath);.#e
227a0 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
227b0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
227c0 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  oc( sizeof(*pShm
227d0 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65  Node) + nShmFile
227e0 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20  name );.    if( 
227f0 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20  pShmNode==0 ){. 
22800 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22810 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
22820 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
22830 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
22840 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73  t(pShmNode, 0, s
22850 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
22860 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a  +nShmFilename);.
22870 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65      zShmFilename
22880 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
22890 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
228a0 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69  &pShmNode[1];.#i
228b0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
228c0 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71  DIRECTORY.    sq
228d0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
228e0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
228f0 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20  mFilename, .    
22900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22910 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
22920 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73  CTORY "/sqlite-s
22930 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20  hm-%x-%x",.     
22940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22950 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e  (u32)sStat.st_in
22960 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74  o, (u32)sStat.st
22970 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20  _dev);.#else.   
22980 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
22990 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  f(nShmFilename, 
229a0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25  zShmFilename, "%
229b0 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  s-shm", pDbFd->z
229c0 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
229d0 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44  e3FileSuffix3(pD
229e0 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d  bFd->zPath, zShm
229f0 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69  Filename);.#endi
22a00 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  f.    pShmNode->
22a10 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46  h = -1;.    pDbF
22a20 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
22a30 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
22a40 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49      pShmNode->pI
22a50 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49  node = pDbFd->pI
22a60 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  node;.    pShmNo
22a70 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  de->mutex = sqli
22a80 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
22a90 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
22aa0 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
22ab0 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  Node->mutex==0 )
22ac0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
22ad0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
22ae0 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
22af0 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rr;.    }..    i
22b00 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
22b10 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
22b20 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67      int openFlag
22b30 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
22b40 52 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28 20  REAT;.      if( 
22b50 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
22b60 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ean(pDbFd->zPath
22b70 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22  , "readonly_shm"
22b80 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
22b90 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
22ba0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70 53  ONLY;.        pS
22bb0 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
22bc0 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ly = 1;.      }.
22bd0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
22be0 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  h = robust_open(
22bf0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70  zShmFilename, op
22c00 65 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74 2e  enFlags, (sStat.
22c10 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a  st_mode&0777));.
22c20 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
22c30 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20  de->h<0 ){.     
22c40 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
22c50 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
22c60 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
22c70 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  ", zShmFilename)
22c80 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
22c90 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
22ca0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
22cb0 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  f this process i
22cc0 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f  s running as roo
22cd0 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  t, make sure tha
22ce0 74 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a 20  t the SHM file. 
22cf0 20 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64       ** is owned
22d00 20 62 79 20 74 68 65 20 73 61 6d 65 20 75 73 65   by the same use
22d10 72 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65 20  r that owns the 
22d20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
22d30 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  e.  Otherwise,. 
22d40 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
22d50 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20  inal owner will 
22d60 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 63  not be able to c
22d70 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f  onnect..      */
22d80 0a 20 20 20 20 20 20 6f 73 46 63 68 6f 77 6e 28  .      osFchown(
22d90 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74  pShmNode->h, sSt
22da0 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74 61 74  at.st_uid, sStat
22db0 2e 73 74 5f 67 69 64 29 3b 0a 20 20 0a 20 20 20  .st_gid);.  .   
22dc0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
22dd0 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72  ee if another pr
22de0 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
22df0 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77   the dead-man sw
22e00 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49  itch..      ** I
22e10 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
22e20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
22e30 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 20 20   length. .      
22e40 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
22e50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
22e60 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d  f( unixShmSystem
22e70 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
22e80 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _WRLCK, UNIX_SHM
22e90 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
22ea0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
22eb0 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
22ec0 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ate(pShmNode->h,
22ed0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
22ee0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
22ef0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
22f00 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63  SHMOPEN, "ftrunc
22f10 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  ate", zShmFilena
22f20 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
22f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
22f40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22f50 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
22f60 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
22f70 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c  (pShmNode, F_RDL
22f80 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  CK, UNIX_SHM_DMS
22f90 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
22fa0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
22fb0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
22fc0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
22fd0 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e  Make the new con
22fe0 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20  nection a child 
22ff0 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  of the unixShmNo
23000 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e  de */.  p->pShmN
23010 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
23020 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
23030 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53  BUG.  p->id = pS
23040 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49  hmNode->nextShmI
23050 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53  d++;.#endif.  pS
23060 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  hmNode->nRef++;.
23070 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
23080 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  p;.  unixLeaveMu
23090 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  tex();..  /* The
230a0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
230b0 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73   on pShmNode has
230c0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
230d0 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a  cremented under.
230e0 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f    ** the cover o
230f0 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  f the unixEnterM
23100 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64  utex() mutex and
23110 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f   the pointer fro
23120 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28  m the.  ** new (
23130 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20  struct unixShm) 
23140 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53  object to the pS
23150 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20  hmNode has been 
23160 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73  set. All that is
23170 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f  .  ** left to do
23180 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20   is to link the 
23190 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  new object into 
231a0 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
231b0 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74  starting.  ** at
231c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
231d0 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20  t. This must be 
231e0 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69  done while holdi
231f0 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d  ng the pShmNode-
23200 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74  >mutex .  ** mut
23210 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ex..  */.  sqlit
23220 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
23230 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
23240 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53  .  p->pNext = pS
23250 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a  hmNode->pFirst;.
23260 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72    pShmNode->pFir
23270 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65  st = p;.  sqlite
23280 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
23290 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
232a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
232b0 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
232c0 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72  ere on any error
232d0 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72   */.shm_open_err
232e0 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65  :.  unixShmPurge
232f0 28 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f  (pDbFd);       /
23300 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65  * This call free
23310 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65  s pShmNode if re
23320 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69  quired */.  sqli
23330 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75  te3_free(p);.  u
23340 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
23350 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23360 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
23370 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
23380 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74  o obtain a point
23390 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65  er to region iRe
233a0 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  gion of the .** 
233b0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73  shared-memory as
233c0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
233d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
233e0 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72  fd. Shared-memor
233f0 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72  y regions .** ar
23400 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74  e numbered start
23410 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45  ing from zero. E
23420 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ach shared-memor
23430 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65  y region is szRe
23440 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69  gion .** bytes i
23450 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  n size..**.** If
23460 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
23470 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
23480 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
23490 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
234a0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  LL..**.** Otherw
234b0 69 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74  ise, if the bExt
234c0 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  end parameter is
234d0 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65   0 and the reque
234e0 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
234f0 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73  ry.** region has
23500 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
23510 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65  ted (by any clie
23520 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e  nt, including on
23530 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a  e running in a.*
23540 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
23550 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73  ss), then *pp is
23560 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
23570 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
23580 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74  ned. If .** bExt
23590 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  end is non-zero 
235a0 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
235b0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
235c0 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  region has not y
235d0 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  et .** been allo
235e0 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c  cated, it is all
235f0 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
23600 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
23610 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
23620 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61  ory region has a
23630 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
23640 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f  cated or is allo
23650 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  cated by.** this
23660 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62   call as describ
23670 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69  ed above, then i
23680 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f  t is mapped into
23690 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
236a0 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63  .** address spac
236b0 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
236c0 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73  already), *pp is
236d0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
236e0 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20   the mapped .** 
236f0 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
23700 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
23710 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
23720 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  xShmMap(.  sqlit
23730 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
23740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
23750 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
23760 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
23770 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
23780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23790 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
237a0 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
237b0 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
237c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
237d0 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
237e0 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20  .  int bExtend, 
237f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23800 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
23810 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
23820 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
23830 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
23840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
23850 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
23860 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  y */.){.  unixFi
23870 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69  le *pDbFd = (uni
23880 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69  xFile*)fd;.  uni
23890 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53  xShm *p;.  unixS
238a0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
238b0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
238c0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
238d0 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
238e0 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  ry file has not 
238f0 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
23900 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f   open it now. */
23910 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53  .  if( pDbFd->pS
23920 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  hm==0 ){.    rc 
23930 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64  = unixOpenShared
23940 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20  Memory(pDbFd);. 
23950 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23960 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
23970 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62  ;.  }..  p = pDb
23980 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d  Fd->pShm;.  pShm
23990 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
239a0 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  de;.  sqlite3_mu
239b0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
239c0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
239d0 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
239e0 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
239f0 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
23a00 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  nRegion==0 );.  
23a10 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
23a20 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
23a30 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73  >pInode );.  ass
23a40 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
23a50 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
23a60 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
23a70 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
23a80 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
23a90 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
23aa0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
23ab0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  =0 );..  if( pSh
23ac0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
23ad0 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63  iRegion ){.    c
23ae0 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20  har **apNew;    
23af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b00 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f    /* New apRegio
23b10 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
23b20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
23b30 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
23b40 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
23b50 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
23b60 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
23b70 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
23b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
23b90 73 65 64 20 62 79 20 66 73 74 61 74 28 29 20 2a  sed by fstat() *
23ba0 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  /..    pShmNode-
23bb0 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65  >szRegion = szRe
23bc0 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70  gion;..    if( p
23bd0 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b  ShmNode->h>=0 ){
23be0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65  .      /* The re
23bf0 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69  quested region i
23c00 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74  s not mapped int
23c10 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
23c20 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a   address space..
23c30 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74        ** Check t
23c40 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20  o see if it has 
23c50 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
23c60 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d  i.e. if the wal-
23c70 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20  index file is.  
23c80 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f      ** large eno
23c90 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ugh to contain t
23ca0 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
23cb0 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ion)..      */. 
23cc0 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74       if( osFstat
23cd0 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73  (pShmNode->h, &s
23ce0 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Stat) ){.       
23cf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
23d00 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20  RR_SHMSIZE;.    
23d10 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
23d20 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
23d30 0a 20 20 20 20 20 20 69 66 28 20 73 53 74 61 74  .      if( sStat
23d40 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29  .st_size<nByte )
23d50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
23d60 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
23d70 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f  y region does no
23d80 74 20 65 78 69 73 74 2e 20 49 66 20 62 45 78 74  t exist. If bExt
23d90 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20 20  end is set to.  
23da0 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20        ** false, 
23db0 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
23dc0 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
23dd0 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
23de0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
23df0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
23e00 66 28 20 21 62 45 78 74 65 6e 64 20 29 7b 0a 20  f( !bExtend ){. 
23e10 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
23e20 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
23e30 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
23e40 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20   Alternatively, 
23e50 69 66 20 62 45 78 74 65 6e 64 20 69 73 20 74 72  if bExtend is tr
23e60 75 65 2c 20 65 78 74 65 6e 64 20 74 68 65 20 66  ue, extend the f
23e70 69 6c 65 2e 20 44 6f 20 74 68 69 73 20 62 79 0a  ile. Do this by.
23e80 20 20 20 20 20 20 20 20 2a 2a 20 77 72 69 74 69          ** writi
23e90 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  ng a single byte
23ea0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 65   to the end of e
23eb0 61 63 68 20 28 4f 53 29 20 70 61 67 65 20 62 65  ach (OS) page be
23ec0 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
23ed0 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78 74 65  llocated or exte
23ee0 6e 64 65 64 2e 20 54 65 63 68 6e 69 63 61 6c 6c  nded. Technicall
23ef0 79 2c 20 77 65 20 6e 65 65 64 20 6f 6e 6c 79 20  y, we need only 
23f00 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20 20 20  write to the.   
23f10 20 20 20 20 20 2a 2a 20 6c 61 73 74 20 70 61 67       ** last pag
23f20 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 65 78  e in order to ex
23f30 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e 20 42  tend the file. B
23f40 75 74 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6c  ut writing to al
23f50 6c 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a 2a  l new.        **
23f60 20 70 61 67 65 73 20 66 6f 72 63 65 73 20 74 68   pages forces th
23f70 65 20 4f 53 20 74 6f 20 61 6c 6c 6f 63 61 74 65  e OS to allocate
23f80 20 74 68 65 6d 20 69 6d 6d 65 64 69 61 74 65 6c   them immediatel
23f90 79 2c 20 77 68 69 63 68 20 72 65 64 75 63 65 73  y, which reduces
23fa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
23fb0 63 68 61 6e 63 65 73 20 6f 66 20 53 49 47 42 55  chances of SIGBU
23fc0 53 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  S while accessin
23fd0 67 20 74 68 65 20 6d 61 70 70 65 64 20 72 65 67  g the mapped reg
23fe0 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20  ion later on..  
23ff0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
24000 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20   else{.         
24010 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
24020 74 20 70 67 73 7a 20 3d 20 34 30 39 36 3b 0a 20  t pgsz = 4096;. 
24030 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 67           int iPg
24040 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
24050 57 72 69 74 65 20 74 6f 20 74 68 65 20 6c 61 73  Write to the las
24060 74 20 62 79 74 65 20 6f 66 20 65 61 63 68 20 6e  t byte of each n
24070 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f  ewly allocated o
24080 72 20 65 78 74 65 6e 64 65 64 20 70 61 67 65 20  r extended page 
24090 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
240a0 65 72 74 28 20 28 6e 42 79 74 65 20 25 20 70 67  ert( (nByte % pg
240b0 73 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sz)==0 );.      
240c0 20 20 20 20 66 6f 72 28 69 50 67 3d 28 73 53 74      for(iPg=(sSt
240d0 61 74 2e 73 74 5f 73 69 7a 65 2f 70 67 73 7a 29  at.st_size/pgsz)
240e0 3b 20 69 50 67 3c 28 6e 42 79 74 65 2f 70 67 73  ; iPg<(nByte/pgs
240f0 7a 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20  z); iPg++){.    
24100 20 20 20 20 20 20 20 20 69 66 28 20 73 65 65 6b          if( seek
24110 41 6e 64 57 72 69 74 65 46 64 28 70 53 68 6d 4e  AndWriteFd(pShmN
24120 6f 64 65 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a  ode->h, iPg*pgsz
24130 20 2b 20 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31   + pgsz-1, "", 1
24140 2c 20 30 29 21 3d 31 20 29 7b 0a 20 20 20 20 20  , 0)!=1 ){.     
24150 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
24160 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68  har *zFile = pSh
24170 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
24180 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24190 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
241a0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
241b0 48 4d 53 49 5a 45 2c 20 22 77 72 69 74 65 22 2c  HMSIZE, "write",
241c0 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20   zFile);.       
241d0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
241e0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  age_out;.       
241f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24200 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
24210 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
24220 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65  /* Map the reque
24230 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
24240 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  on into this pro
24250 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
24260 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e  pace. */.    apN
24270 65 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71  ew = (char **)sq
24280 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
24290 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
242a0 3e 61 70 52 65 67 69 6f 6e 2c 20 28 69 52 65 67  >apRegion, (iReg
242b0 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 63 68  ion+1)*sizeof(ch
242c0 61 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20  ar *).    );.   
242d0 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20   if( !apNew ){. 
242e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
242f0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
24300 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
24310 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
24320 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
24330 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20  on = apNew;.    
24340 77 68 69 6c 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  while(pShmNode->
24350 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e  nRegion<=iRegion
24360 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
24370 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Mem;.      if( p
24380 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b  ShmNode->h>=0 ){
24390 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
243a0 6f 73 4d 6d 61 70 28 30 2c 20 73 7a 52 65 67 69  osMmap(0, szRegi
243b0 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
243c0 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
243d0 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41 44  only ? PROT_READ
243e0 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f   : PROT_READ|PRO
243f0 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20  T_WRITE, .      
24400 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44        MAP_SHARED
24410 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73  , pShmNode->h, s
24420 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29 70 53 68  zRegion*(i64)pSh
24430 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20  mNode->nRegion. 
24440 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
24450 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f    if( pMem==MAP_
24460 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
24470 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
24480 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
24490 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70  RR_SHMMAP, "mmap
244a0 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  ", pShmNode->zFi
244b0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
244c0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
244d0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
244e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
244f0 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74      pMem = sqlit
24500 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69  e3_malloc(szRegi
24510 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  on);.        if(
24520 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20   pMem==0 ){.    
24530 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
24540 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
24550 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
24560 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
24570 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d         memset(pM
24580 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29  em, 0, szRegion)
24590 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
245a0 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
245b0 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
245c0 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20  gion] = pMem;.  
245d0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52      pShmNode->nR
245e0 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  egion++;.    }. 
245f0 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a   }..shmpage_out:
24600 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
24610 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e  >nRegion>iRegion
24620 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53   ){.    *pp = pS
24630 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
24640 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c  [iRegion];.  }el
24650 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  se{.    *pp = 0;
24660 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e  .  }.  if( pShmN
24670 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
24680 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
24690 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52   ) rc = SQLITE_R
246a0 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74  EADONLY;.  sqlit
246b0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
246c0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
246d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
246e0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
246f0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72  e lock state for
24700 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
24710 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   segment..**.** 
24720 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72 65  Note that the re
24730 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65  lationship betwe
24740 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45 58  en SHAREd and EX
24750 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73  CLUSIVE locks is
24760 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66   a little.** dif
24770 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e  ferent here than
24780 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78   in posix.  In x
24790 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63  ShmLock(), one c
247a0 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63  an go from unloc
247b0 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64  ked.** to shared
247c0 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f   and back or fro
247d0 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78  m unlocked to ex
247e0 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b  clusive and back
247f0 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a  .  But one may.*
24800 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68  * not go from sh
24810 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  ared to exclusiv
24820 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73  e or from exclus
24830 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a  ive to shared..*
24840 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
24850 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  xShmLock(.  sqli
24860 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
24870 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
24880 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
24890 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
248a0 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
248b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248c0 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
248d0 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
248e0 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
248f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24900 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
24910 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
24920 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
24930 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
24940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24950 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
24960 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
24970 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
24980 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
24990 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  fd;      /* Conn
249a0 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
249b0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
249c0 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70    unixShm *p = p
249d0 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20  DbFd->pShm;     
249e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
249f0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
24a00 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  ng locked */.  u
24a10 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20  nixShm *pX;     
24a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a30 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
24a40 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
24a50 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53  lings */.  unixS
24a60 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
24a70 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20   = p->pShmNode; 
24a80 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
24a90 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f  ng file iNode */
24aa0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24ab0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
24ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
24ad0 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  lt code */.  u16
24ae0 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
24af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b00 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f     /* Mask of lo
24b10 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72  cks to take or r
24b20 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  elease */..  ass
24b30 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70  ert( pShmNode==p
24b40 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
24b50 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  hmNode );.  asse
24b60 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
24b70 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
24b80 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
24b90 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74   ofst>=0 && ofst
24ba0 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  +n<=SQLITE_SHM_N
24bb0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
24bc0 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ( n>=1 );.  asse
24bd0 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49  rt( flags==(SQLI
24be0 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
24bf0 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
24c00 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
24c10 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
24c20 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
24c30 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20  EXCLUSIVE).     
24c40 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
24c50 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
24c60 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
24c70 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
24c80 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
24c90 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
24ca0 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20  _SHM_EXCLUSIVE) 
24cb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  );.  assert( n==
24cc0 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  1 || (flags & SQ
24cd0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
24ce0 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  VE)!=0 );.  asse
24cf0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  rt( pShmNode->h>
24d00 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  =0 || pDbFd->pIn
24d10 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
24d20 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
24d30 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
24d40 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
24d50 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
24d60 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
24d70 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  1<<(ofst+n)) - (
24d80 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65  1<<ofst);.  asse
24d90 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
24da0 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
24db0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
24dc0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
24dd0 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
24de0 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
24df0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
24e00 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
24e10 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
24e20 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
24e30 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
24e40 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
24e50 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
24e60 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
24e70 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
24e80 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
24e90 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
24ea0 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
24eb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
24ec0 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
24ed0 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
24ee0 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
24ef0 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
24f00 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
24f10 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
24f20 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
24f30 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
24f40 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
24f50 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
24f60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
24f70 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
24f80 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b  ShmNode, F_UNLCK
24f90 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
24fa0 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  BASE, n);.    }e
24fb0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
24fc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
24fd0 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68  ..    /* Undo th
24fe0 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f  e local locks */
24ff0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25010 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  p->exclMask &= ~
25020 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73  mask;.      p->s
25030 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
25040 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c  sk;.    } .  }el
25050 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
25060 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
25070 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53   ){.    u16 allS
25080 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55  hared = 0;  /* U
25090 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65  nion of locks he
250a0 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
250b0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22  s other than "p"
250c0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   */..    /* Find
250d0 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 65   out which share
250e0 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65  d locks are alre
250f0 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c  ady held by sibl
25100 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ing connections.
25110 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73  .    ** If any s
25120 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68  ibling already h
25130 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
25140 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64  e lock, go ahead
25150 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
25160 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  ** SQLITE_BUSY..
25170 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
25180 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
25190 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
251a0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
251b0 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
251c0 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
251d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
251e0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
251f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
25200 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d      allShared |=
25210 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
25220 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
25230 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  et shared locks 
25240 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
25250 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72  vel, if necessar
25260 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  y */.    if( rc=
25270 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25280 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72      if( (allShar
25290 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  ed & mask)==0 ){
252a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
252b0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
252c0 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43  pShmNode, F_RDLC
252d0 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
252e0 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
252f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25300 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25310 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
25320 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f     /* Get the lo
25330 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cal shared locks
25340 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
25350 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25360 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
25370 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a   |= mask;.    }.
25380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
25390 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62  Make sure no sib
253a0 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
253b0 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74   hold locks that
253c0 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73   will block this
253d0 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49  .    ** lock.  I
253e0 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e  f any do, return
253f0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67   SQLITE_BUSY rig
25400 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a  ht away..    */.
25410 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
25420 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
25430 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
25440 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
25450 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
25460 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65  =0 || (pX->share
25470 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  dMask & mask)!=0
25480 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
25490 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
254a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
254b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
254c0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63    /* Get the exc
254d0 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20  lusive locks at 
254e0 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
254f0 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65  .  Then if succe
25500 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73  ssful.    ** als
25510 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c  o mark the local
25520 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62   connection as b
25530 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20  eing locked..   
25540 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
25550 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25560 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
25570 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
25580 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73  de, F_WRLCK, ofs
25590 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
255a0 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   n);.      if( r
255b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
255c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
255d0 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  (p->sharedMask &
255e0 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20   mask)==0 );.   
255f0 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
25600 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
25610 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
25620 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
25630 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
25640 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
25650 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25  SHM-LOCK shmid-%
25660 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30  d, pid-%d got %0
25670 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  3x,%03x\n",.    
25680 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67 65         p->id, ge
25690 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61 72 65  tpid(), p->share
256a0 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61  dMask, p->exclMa
256b0 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  sk));.  return r
256c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
256d0 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62  ement a memory b
256e0 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79  arrier or memory
256f0 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64   fence on shared
25700 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a   memory.  .**.**
25710 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73   All loads and s
25720 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f  tores begun befo
25730 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d  re the barrier m
25740 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66  ust complete bef
25750 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20  ore.** any load 
25760 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61  or store begun a
25770 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72  fter the barrier
25780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25790 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28   unixShmBarrier(
257a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
257b0 2a 66 64 20 20 20 20 20 20 20 20 20 20 20 20 20  *fd             
257c0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
257d0 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
257e0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
257f0 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
25800 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 75 6e  AMETER(fd);.  un
25810 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
25820 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
25830 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ();.}../*.** Clo
25840 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  se a connection 
25850 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  to shared-memory
25860 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e  .  Delete the un
25870 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f  derlying .** sto
25880 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c  rage if deleteFl
25890 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  ag is true..**.*
258a0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
258b0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   shared memory a
258c0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
258d0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68  he connection th
258e0 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  en this.** routi
258f0 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  ne is a harmless
25900 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
25910 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d  c int unixShmUnm
25920 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
25930 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
25940 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
25950 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
25960 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64   file */.  int d
25970 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20  eleteFlag       
25980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
25990 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f  lete shared-memo
259a0 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  ry if true */.){
259b0 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20  .  unixShm *p;  
259c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259d0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
259e0 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
259f0 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  d */.  unixShmNo
25a00 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
25a10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
25a20 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
25a30 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
25a40 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20   unixShm **pp;  
25a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a60 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
25a70 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e  over sibling con
25a80 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e  nections */.  un
25a90 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20  ixFile *pDbFd;  
25aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25ab0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
25ac0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
25ad0 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69  ..  pDbFd = (uni
25ae0 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  xFile*)fd;.  p =
25af0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
25b00 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
25b10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
25b20 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
25b30 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74  mNode;..  assert
25b40 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
25b50 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
25b60 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
25b70 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
25b80 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
25b90 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65   );..  /* Remove
25ba0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
25bb0 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
25bc0 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
25bd0 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70  ated.  ** with p
25be0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ShmNode */.  sql
25bf0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
25c00 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
25c10 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
25c20 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
25c30 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
25c40 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
25c50 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
25c60 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
25c70 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
25c80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
25c90 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
25ca0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
25cb0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
25cc0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
25cd0 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
25ce0 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
25cf0 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
25d00 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
25d10 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
25d20 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
25d30 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
25d40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
25d50 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b  mNode->nRef>0 );
25d60 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
25d70 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  f--;.  if( pShmN
25d80 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
25d90 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
25da0 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e  ag && pShmNode->
25db0 68 3e 3d 30 20 29 20 6f 73 55 6e 6c 69 6e 6b 28  h>=0 ) osUnlink(
25dc0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
25dd0 61 6d 65 29 3b 0a 20 20 20 20 75 6e 69 78 53 68  ame);.    unixSh
25de0 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20  mPurge(pDbFd);. 
25df0 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
25e00 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e  tex();..  return
25e10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
25e20 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75  #else.# define u
25e30 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30 0a  nixShmMap     0.
25e40 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
25e50 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69  Lock    0.# defi
25e60 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65  ne unixShmBarrie
25e70 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  r 0.# define uni
25e80 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65  xShmUnmap   0.#e
25e90 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
25ea0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
25eb0 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  */..#if SQLITE_M
25ec0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f  AX_MMAP_SIZE>0./
25ed0 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 63 75  *.** If it is cu
25ee0 72 72 65 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d  rrently memory m
25ef0 61 70 70 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c  apped, unmap fil
25f00 65 20 70 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pFd..*/.static
25f10 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66   void unixUnmapf
25f20 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
25f30 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46  d){.  assert( pF
25f40 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  d->nFetchOut==0 
25f50 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 4d  );.  if( pFd->pM
25f60 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  apRegion ){.    
25f70 6f 73 4d 75 6e 6d 61 70 28 70 46 64 2d 3e 70 4d  osMunmap(pFd->pM
25f80 61 70 52 65 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d  apRegion, pFd->m
25f90 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 29 3b 0a  mapSizeActual);.
25fa0 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67      pFd->pMapReg
25fb0 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 64  ion = 0;.    pFd
25fc0 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a  ->mmapSize = 0;.
25fd0 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
25fe0 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d  eActual = 0;.  }
25ff0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
26000 20 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65   the system page
26010 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
26020 20 69 6e 74 20 75 6e 69 78 47 65 74 50 61 67 65   int unixGetPage
26030 73 69 7a 65 28 76 6f 69 64 29 7b 0a 23 69 66 20  size(void){.#if 
26040 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 72 65  HAVE_MREMAP.  re
26050 74 75 72 6e 20 35 31 32 3b 0a 23 65 6c 69 66 20  turn 512;.#elif 
26060 64 65 66 69 6e 65 64 28 5f 42 53 44 5f 53 4f 55  defined(_BSD_SOU
26070 52 43 45 29 0a 20 20 72 65 74 75 72 6e 20 67 65  RCE).  return ge
26080 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c  tpagesize();.#el
26090 73 65 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74  se.  return (int
260a0 29 73 79 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47  )sysconf(_SC_PAG
260b0 45 53 49 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d  ESIZE);.#endif.}
260c0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
260d0 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65 20  to set the size 
260e0 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  of the memory ma
260f0 70 70 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64  pping maintained
26100 20 62 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73   by file .** des
26110 63 72 69 70 74 6f 72 20 70 46 64 20 74 6f 20 6e  criptor pFd to n
26120 4e 65 77 20 62 79 74 65 73 2e 20 41 6e 79 20 65  New bytes. Any e
26130 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
26140 69 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a  is discarded..**
26150 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
26160 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  l, this function
26170 20 73 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77   sets the follow
26180 69 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a  ing variables:.*
26190 2a 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46  *.**       unixF
261a0 69 6c 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a  ile.pMapRegion.*
261b0 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  *       unixFile
261c0 2e 6d 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20  .mmapSize.**    
261d0 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70     unixFile.mmap
261e0 53 69 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a  SizeActual.**.**
261f0 20 49 66 20 75 6e 73 75 63 63 65 73 73 66 75 6c   If unsuccessful
26200 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
26210 67 65 20 69 73 20 6c 6f 67 67 65 64 20 76 69 61  ge is logged via
26220 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61   sqlite3_log() a
26230 6e 64 0a 2a 2a 20 74 68 65 20 74 68 72 65 65 20  nd.** the three 
26240 76 61 72 69 61 62 6c 65 73 20 61 62 6f 76 65 20  variables above 
26250 61 72 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74  are zeroed. In t
26260 68 69 73 20 63 61 73 65 20 53 51 4c 69 74 65 20  his case SQLite 
26270 73 68 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e  should.** contin
26280 75 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  ue accessing the
26290 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
262a0 74 68 65 20 78 52 65 61 64 28 29 20 61 6e 64 20  the xRead() and 
262b0 78 57 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68  xWrite().** meth
262c0 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
262d0 6f 69 64 20 75 6e 69 78 52 65 6d 61 70 66 69 6c  oid unixRemapfil
262e0 65 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  e(.  unixFile *p
262f0 46 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Fd,             
26300 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
26310 63 72 69 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a  criptor object *
26320 2f 0a 20 20 69 36 34 20 6e 4e 65 77 20 20 20 20  /.  i64 nNew    
26330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26340 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
26350 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a  mapping size */.
26360 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
26370 2a 7a 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a  *zErr = "mmap";.
26380 20 20 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68    int h = pFd->h
26390 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
263a0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
263b0 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f  escriptor open o
263c0 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75  n db file */.  u
263d0 38 20 2a 70 4f 72 69 67 20 3d 20 28 75 38 20 2a  8 *pOrig = (u8 *
263e0 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
263f0 3b 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ;   /* Pointer t
26400 6f 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20 6d  o current file m
26410 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20  apping */.  i64 
26420 6e 4f 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61  nOrig = pFd->mma
26430 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20  pSizeActual;    
26440 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72 69   /* Size of pOri
26450 67 20 72 65 67 69 6f 6e 20 69 6e 20 62 79 74 65  g region in byte
26460 73 20 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20  s */.  u8 *pNew 
26470 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
26480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
26490 6f 63 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d  ocation of new m
264a0 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  apping */.  int 
264b0 66 6c 61 67 73 20 3d 20 50 52 4f 54 5f 52 45 41  flags = PROT_REA
264c0 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D;              
264d0 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73   /* Flags to pas
264e0 73 20 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a  s to mmap() */..
264f0 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e    assert( pFd->n
26500 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20  FetchOut==0 );. 
26510 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 70 46   assert( nNew>pF
26520 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20  d->mmapSize );. 
26530 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70   assert( nNew<=p
26540 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  Fd->mmapSizeMax 
26550 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
26560 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  w>0 );.  assert(
26570 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
26580 74 75 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53  tual>=pFd->mmapS
26590 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
265a0 20 4d 41 50 5f 46 41 49 4c 45 44 21 3d 30 20 29   MAP_FAILED!=0 )
265b0 3b 0a 0a 20 20 69 66 28 20 28 70 46 64 2d 3e 63  ;..  if( (pFd->c
265c0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
265d0 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29  ILE_RDONLY)==0 )
265e0 20 66 6c 61 67 73 20 7c 3d 20 50 52 4f 54 5f 57   flags |= PROT_W
265f0 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 70 4f 72  RITE;..  if( pOr
26600 69 67 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ig ){.    const 
26610 69 6e 74 20 73 7a 53 79 73 70 61 67 65 20 3d 20  int szSyspage = 
26620 75 6e 69 78 47 65 74 50 61 67 65 73 69 7a 65 28  unixGetPagesize(
26630 29 3b 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73  );.    i64 nReus
26640 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69  e = (pFd->mmapSi
26650 7a 65 20 26 20 7e 28 73 7a 53 79 73 70 61 67 65  ze & ~(szSyspage
26660 2d 31 29 29 3b 0a 20 20 20 20 75 38 20 2a 70 52  -1));.    u8 *pR
26670 65 71 20 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75  eq = &pOrig[nReu
26680 73 65 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d  se];..    /* Unm
26690 61 70 20 61 6e 79 20 70 61 67 65 73 20 6f 66 20  ap any pages of 
266a0 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70  the existing map
266b0 70 69 6e 67 20 74 68 61 74 20 63 61 6e 6e 6f 74  ping that cannot
266c0 20 62 65 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20   be reused. */. 
266d0 20 20 20 69 66 28 20 6e 52 65 75 73 65 21 3d 6e     if( nReuse!=n
266e0 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 6f 73  Orig ){.      os
266f0 4d 75 6e 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72  Munmap(pReq, nOr
26700 69 67 2d 6e 52 65 75 73 65 29 3b 0a 20 20 20 20  ig-nReuse);.    
26710 7d 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d  }..#if HAVE_MREM
26720 41 50 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  AP.    pNew = os
26730 4d 72 65 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52  Mremap(pOrig, nR
26740 65 75 73 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d  euse, nNew, MREM
26750 41 50 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20  AP_MAYMOVE);.   
26760 20 7a 45 72 72 20 3d 20 22 6d 72 65 6d 61 70 22   zErr = "mremap"
26770 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77  ;.#else.    pNew
26780 20 3d 20 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20   = osMmap(pReq, 
26790 6e 4e 65 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61  nNew-nReuse, fla
267a0 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20  gs, MAP_SHARED, 
267b0 68 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20  h, nReuse);.    
267c0 69 66 28 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41  if( pNew!=MAP_FA
267d0 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66  ILED ){.      if
267e0 28 20 70 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a  ( pNew!=pReq ){.
267f0 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70          osMunmap
26800 28 70 4e 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52  (pNew, nNew - nR
26810 65 75 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70  euse);.        p
26820 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  New = 0;.      }
26830 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e  else{.        pN
26840 65 77 20 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20  ew = pOrig;.    
26850 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
26860 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74 74  ..    /* The att
26870 65 6d 70 74 20 74 6f 20 65 78 74 65 6e 64 20 74  empt to extend t
26880 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  he existing mapp
26890 69 6e 67 20 66 61 69 6c 65 64 2e 20 46 72 65 65  ing failed. Free
268a0 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
268b0 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44  pNew==MAP_FAILED
268c0 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20   || pNew==0 ){. 
268d0 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f       osMunmap(pO
268e0 72 69 67 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20  rig, nReuse);.  
268f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
26900 20 70 4e 65 77 20 69 73 20 73 74 69 6c 6c 20 4e   pNew is still N
26910 55 4c 4c 2c 20 74 72 79 20 74 6f 20 63 72 65 61  ULL, try to crea
26920 74 65 20 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e  te an entirely n
26930 65 77 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20  ew mapping. */. 
26940 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
26950 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61      pNew = osMma
26960 70 28 30 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73  p(0, nNew, flags
26970 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c  , MAP_SHARED, h,
26980 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   0);.  }..  if( 
26990 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44  pNew==MAP_FAILED
269a0 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30   ){.    pNew = 0
269b0 3b 0a 20 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a  ;.    nNew = 0;.
269c0 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
269d0 28 53 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72  (SQLITE_OK, zErr
269e0 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a  , pFd->zPath);..
269f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d      /* If the mm
26a00 61 70 28 29 20 61 62 6f 76 65 20 66 61 69 6c 65  ap() above faile
26a10 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 61  d, assume that a
26a20 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 6d 6d  ll subsequent mm
26a30 61 70 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a  ap() calls.    *
26a40 2a 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  * will probably 
26a50 66 61 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62  fail too. Fall b
26a60 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 78 52 65  ack to using xRe
26a70 61 64 2f 78 57 72 69 74 65 20 65 78 63 6c 75 73  ad/xWrite exclus
26a80 69 76 65 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20  ively.    ** in 
26a90 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
26aa0 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
26ab0 4d 61 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  Max = 0;.  }.  p
26ac0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  Fd->pMapRegion =
26ad0 20 28 76 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20   (void *)pNew;. 
26ae0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d   pFd->mmapSize =
26af0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
26b00 74 75 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a  tual = nNew;.}..
26b10 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70  /*.** Memory map
26b20 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66 69   or remap the fi
26b30 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c  le opened by fil
26b40 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46 64  e-descriptor pFd
26b50 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a   (if the file.**
26b60 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70   is already mapp
26b70 65 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67  ed, the existing
26b80 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c   mapping is repl
26b90 61 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 29  aced by the new)
26ba0 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65  . Or, if .** the
26bb0 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  re already exist
26bc0 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20  s a mapping for 
26bd0 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74  this file, and t
26be0 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a  here are still .
26bf0 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78  ** outstanding x
26c00 46 65 74 63 68 28 29 20 72 65 66 65 72 65 6e 63  Fetch() referenc
26c10 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66  es to it, this f
26c20 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
26c30 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  op..**.** If par
26c40 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73 20  ameter nByte is 
26c50 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68  non-negative, th
26c60 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 65 71  en it is the req
26c70 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a  uested size of .
26c80 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74  ** the mapping t
26c90 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77  o create. Otherw
26ca0 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73  ise, if nByte is
26cb0 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
26cc0 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65   then the .** re
26cd0 71 75 65 73 74 65 64 20 73 69 7a 65 20 69 73 20  quested size is 
26ce0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
26cf0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68  file on disk. Th
26d00 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
26d10 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20   the.** created 
26d20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74 68 65  mapping is eithe
26d30 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  r the requested 
26d40 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75  size or the valu
26d50 65 20 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a  e configured .**
26d60 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43   using SQLITE_FC
26d70 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20  NTL_MMAP_LIMIT, 
26d80 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
26d90 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  ller..**.** SQLI
26da0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
26db0 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  d if no error oc
26dc0 63 75 72 73 20 28 65 76 65 6e 20 69 66 20 74 68  curs (even if th
26dd0 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74  e mapping is not
26de0 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61 73  .** recreated as
26df0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74   a result of out
26e00 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
26e10 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74  ces) or an SQLit
26e20 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
26e30 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
26e40 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70  atic int unixMap
26e50 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  file(unixFile *p
26e60 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  Fd, i64 nByte){.
26e70 20 20 69 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79    i64 nMap = nBy
26e80 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  te;.  int rc;.. 
26e90 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30   assert( nMap>=0
26ea0 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f   || pFd->nFetchO
26eb0 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ut==0 );.  if( p
26ec0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20  Fd->nFetchOut>0 
26ed0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
26ee0 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c  OK;..  if( nMap<
26ef0 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
26f00 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20  stat statbuf;   
26f10 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65         /* Low-le
26f20 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61  vel file informa
26f30 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  tion */.    rc =
26f40 20 6f 73 46 73 74 61 74 28 70 46 64 2d 3e 68 2c   osFstat(pFd->h,
26f50 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20   &statbuf);.    
26f60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26f70 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
26f80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
26f90 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  STAT;.    }.    
26fa0 6e 4d 61 70 20 3d 20 73 74 61 74 62 75 66 2e 73  nMap = statbuf.s
26fb0 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66  t_size;.  }.  if
26fc0 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70  ( nMap>pFd->mmap
26fd0 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e  SizeMax ){.    n
26fe0 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  Map = pFd->mmapS
26ff0 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20 69  izeMax;.  }..  i
27000 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d  f( nMap!=pFd->mm
27010 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
27020 28 20 6e 4d 61 70 3e 30 20 29 7b 0a 20 20 20 20  ( nMap>0 ){.    
27030 20 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28    unixRemapfile(
27040 70 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20 20 20  pFd, nMap);.    
27050 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 69  }else{.      uni
27060 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  xUnmapfile(pFd);
27070 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
27080 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27090 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
270a0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
270b0 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  >0 */../*.** If 
270c0 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e  possible, return
270d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
270e0 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20  mapping of file 
270f0 66 64 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f  fd starting at o
27100 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54  ffset.** iOff. T
27110 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20  he mapping must 
27120 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20  be valid for at 
27130 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73  least nAmt bytes
27140 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
27150 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65  a pointer can be
27160 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65   obtained, store
27170 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72   it in *pp and r
27180 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
27190 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63  .** Or, if one c
271a0 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72  annot but no err
271b0 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a  or occurs, set *
271c0 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75  pp to 0 and retu
271d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
271e0 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20   Finally, if an 
271f0 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
27200 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
27210 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  te error code. T
27220 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75  he final.** valu
27230 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65  e of *pp is unde
27240 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
27250 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  se..**.** If thi
27260 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
27270 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
27280 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  , the caller mus
27290 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a  t eventually .**
272a0 20 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   release the ref
272b0 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e  erence by callin
272c0 67 20 75 6e 69 78 55 6e 66 65 74 63 68 28 29 2e  g unixUnfetch().
272d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
272e0 6e 69 78 46 65 74 63 68 28 73 71 6c 69 74 65 33  nixFetch(sqlite3
272f0 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69  _file *fd, i64 i
27300 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76  Off, int nAmt, v
27310 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53  oid **pp){.#if S
27320 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
27330 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65  IZE>0.  unixFile
27340 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c   *pFd = (unixFil
27350 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65  e *)fd;   /* The
27360 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
27370 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e  base file */.#en
27380 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a  dif.  *pp = 0;..
27390 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
273a0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28  MAP_SIZE>0.  if(
273b0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
273c0 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  x>0 ){.    if( p
273d0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d  Fd->pMapRegion==
273e0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  0 ){.      int r
273f0 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  c = unixMapfile(
27400 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  pFd, -1);.      
27410 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27420 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
27430 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64     }.    if( pFd
27440 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f  ->mmapSize >= iO
27450 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20  ff+nAmt ){.     
27460 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70   *pp = &((u8 *)p
27470 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b  Fd->pMapRegion)[
27480 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64  iOff];.      pFd
27490 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20  ->nFetchOut++;. 
274a0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
274b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
274c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  OK;.}../*.** If 
274d0 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
274e0 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  nt is non-NULL, 
274f0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
27500 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a  on releases a .*
27510 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61  * reference obta
27520 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ined by an earli
27530 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46  er call to unixF
27540 65 74 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f  etch(). The seco
27550 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70  nd.** argument p
27560 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
27570 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74  nction must be t
27580 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 63  he same as the c
27590 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
275a0 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61  argument that wa
275b0 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
275c0 75 6e 69 78 46 65 74 63 68 28 29 20 69 6e 76 6f  unixFetch() invo
275d0 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f  cation. .**.** O
275e0 72 2c 20 69 66 20 74 68 65 20 74 68 69 72 64 20  r, if the third 
275f0 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c  argument is NULL
27600 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
27610 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61  tion is being ca
27620 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f  lled .** to info
27630 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  rm the VFS layer
27640 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67   that, according
27650 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65   to POSIX, any e
27660 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
27670 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69  .** may now be i
27680 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c  nvalid and shoul
27690 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a  d be unmapped..*
276a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
276b0 78 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33  xUnfetch(sqlite3
276c0 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69  _file *fd, i64 i
276d0 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20  Off, void *p){. 
276e0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d   unixFile *pFd =
276f0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b   (unixFile *)fd;
27700 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
27710 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
27720 6c 65 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  le */.  UNUSED_P
27730 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a  ARAMETER(iOff);.
27740 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
27750 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
27760 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20   If p==0 (unmap 
27770 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29  the entire file)
27780 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
27790 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69   be no outstandi
277a0 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20  ng .  ** xFetch 
277b0 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20  references. Or, 
277c0 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67  if p!=0 (meaning
277d0 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63 68   it is an xFetch
277e0 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a   reference),.  *
277f0 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  * then there mus
27800 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
27810 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20  e outstanding.  
27820 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d  */.  assert( (p=
27830 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63  =0)==(pFd->nFetc
27840 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  hOut==0) );..  /
27850 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75  * If p!=0, it mu
27860 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66  st match the iOf
27870 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73  f value. */.  as
27880 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d  sert( p==0 || p=
27890 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d  =&((u8 *)pFd->pM
278a0 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20  apRegion)[iOff] 
278b0 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  );..  if( p ){. 
278c0 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75     pFd->nFetchOu
278d0 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t--;.  }else{.  
278e0 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28    unixUnmapfile(
278f0 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  pFd);.  }..  ass
27900 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68  ert( pFd->nFetch
27910 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6e 64 69 66  Out>=0 );.#endif
27920 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27930 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65  _OK;.}../*.** He
27940 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c  re ends the impl
27950 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c  ementation of al
27960 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  l sqlite3_file m
27970 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ethods..**.*****
27980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27990 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69  * End sqlite3_fi
279a0 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  le Methods *****
279b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
279c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
279d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
279e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
279f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
27a20 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
27a30 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
27a40 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  ions of sqlite3_
27a50 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
27a60 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65  ts that.** imple
27a70 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c  ment various fil
27a80 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  e locking strate
27a90 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63  gies.  It also c
27aa0 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69  ontains definiti
27ab0 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65  ons.** of "finde
27ac0 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41  r" functions.  A
27ad0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
27ae0 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61   is used to loca
27af0 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  te the appropria
27b00 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f  te.** sqlite3_io
27b10 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
27b20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
27b30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
27b40 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a   The pAppData.**
27b50 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71   field of the sq
27b60 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62  lite3_vfs VFS ob
27b70 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69 61  jects are initia
27b80 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e  lized to be poin
27b90 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63  ters to.** the c
27ba0 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75  orrect finder-fu
27bb0 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20  nction for that 
27bc0 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20  VFS..**.** Most 
27bd0 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  finder functions
27be0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
27bf0 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c  r to a fixed sql
27c00 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
27c10 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20  ** object.  The 
27c20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67  only interesting
27c30 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
27c40 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69   is autolockIoFi
27c50 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c  nder, which.** l
27c60 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65  ooks at the file
27c70 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20  system type and 
27c80 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20 74  tries to guess t
27c90 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a  he best locking.
27ca0 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d  ** strategy from
27cb0 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   that..**.** For
27cc0 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e 20   finder-funtion 
27cd0 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61  F, two objects a
27ce0 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a  re created:.**.*
27cf0 2a 20 20 20 20 28 31 29 20 54 68 65 20 72 65 61  *    (1) The rea
27d00 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  l finder-functio
27d10 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29  n named "FImpt()
27d20 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  "..**.**    (2) 
27d30 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74  A constant point
27d40 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  er to this funct
27d50 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22  ion named just "
27d60 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70  F"..**.**.** A p
27d70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20  ointer to the F 
27d80 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64 20  pointer is used 
27d90 61 73 20 74 68 65 20 70 41 70 70 44 61 74 61 20  as the pAppData 
27da0 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a  value for VFS.**
27db0 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61   objects.  We ha
27dc0 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e  ve to do this in
27dd0 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67  stead of letting
27de0 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a   pAppData point.
27df0 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20 74  ** directly at t
27e00 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  he finder-functi
27e10 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c  on since C90 rul
27e20 65 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69  es prevent a voi
27e30 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61  d*.** from be ca
27e40 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69  st into a functi
27e50 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  on pointer..**.*
27e60 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e  *.** Each instan
27e70 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  ce of this macro
27e80 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f   generates two o
27e90 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  bjects:.**.**   
27ea0 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71  *  A constant sq
27eb0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
27ec0 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54   object call MET
27ed0 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63  HOD that has loc
27ee0 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74  king.**      met
27ef0 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b  hods CLOSE, LOCK
27f00 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c  , UNLOCK, CKRESL
27f10 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  OCK..**.**   *  
27f20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69  An I/O method fi
27f30 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  nder function ca
27f40 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61 74  lled FINDER that
27f50 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
27f60 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  er.**      to th
27f70 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20  e METHOD object 
27f80 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
27f90 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69  bullet..*/.#defi
27fa0 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e  ne IOMETHODS(FIN
27fb0 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45 52  DER, METHOD, VER
27fc0 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43  SION, CLOSE, LOC
27fd0 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43  K, UNLOCK, CKLOC
27fe0 4b 29 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63  K)      \.static
27ff0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
28000 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44  o_methods METHOD
28010 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20 20   = {            
28020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28030 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53         \.   VERS
28040 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ION,            
28050 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
28060 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ion */          
28070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28080 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45        \.   CLOSE
28090 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
280a0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
280b0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
280c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280d0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65       \.   unixRe
280e0 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
280f0 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a        /* xRead *
28100 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28120 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69      \.   unixWri
28130 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
28140 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
28150 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28170 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e     \.   unixTrun
28180 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
28190 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
281a0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
281b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281c0 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c    \.   unixSync,
281d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281e0 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20     /* xSync */  
281f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28210 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69   \.   unixFileSi
28220 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
28230 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
28240 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28260 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20  \.   LOCK,      
28270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28280 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20   /* xLock */    
28290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
282b0 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20  .   UNLOCK,     
282c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282d0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20  /* xUnlock */   
282e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28300 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20     CKLOCK,      
28310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28320 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
28330 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
28340 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28350 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f    unixFileContro
28360 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l,            /*
28370 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f   xFileControl */
28380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28390 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
283a0 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c   unixSectorSize,
283b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
283c0 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20  xSectorSize */  
283d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283e0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
283f0 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
28400 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78  teristics,  /* x
28410 44 65 76 69 63 65 43 61 70 61 62 69 6c 69 74 69  DeviceCapabiliti
28420 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  es */           
28430 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
28440 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20 20 20 20  nixShmMap,      
28450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
28460 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20  hmMap */        
28470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28480 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28490 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20  ixShmLock,      
284a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
284b0 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  mLock */        
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284d0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
284e0 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20  xShmBarrier,    
284f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
28500 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20  Barrier */      
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28520 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28530 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20  ShmUnmap,       
28540 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
28550 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20  nmap */         
28560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28570 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
28580 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20  etch,           
28590 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
285a0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
285b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285c0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e       \.   unixUn
285d0 66 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20  fetch,          
285e0 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63        /* xUnfetc
285f0 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  h */            
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28610 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20      \.};        
28620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28660 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
28670 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
28680 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d  hods *FINDER##Im
28690 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pl(const char *z
286a0 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20  , unixFile *p){ 
286b0 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52    \.  UNUSED_PAR
286c0 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45  AMETER(z); UNUSE
286d0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20  D_PARAMETER(p); 
286e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28700 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54   \.  return &MET
28710 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20 20  HOD;            
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 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28750 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  \.}             
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
287a0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
287b0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
287c0 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52   *(*const FINDER
287d0 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
287e0 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a  ixFile *p)    \.
287f0 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d      = FINDER##Im
28800 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  pl;../*.** Here 
28810 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  are all of the s
28820 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
28830 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61  s objects for ea
28840 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  ch of the.** loc
28850 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e  king strategies.
28860 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74    Functions that
28870 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73   return pointers
28880 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64   to these method
28890 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72  s.** are also cr
288a0 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48  eated..*/.IOMETH
288b0 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69  ODS(.  posixIoFi
288c0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
288d0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
288e0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f  ion name */.  po
288f0 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  sixIoMethods,   
28900 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
28910 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
28920 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33  ject name */.  3
28930 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28940 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
28950 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d  ed memory and mm
28960 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a  ap are enabled *
28970 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
28980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28990 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
289a0 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20  /.  unixLock,   
289b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
289c0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
289d0 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20  .  unixUnlock,  
289e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
289f0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
28a00 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
28a10 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a  ervedLock     /*
28a20 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
28a30 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
28a40 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c  IOMETHODS(.  nol
28a50 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
28a60 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
28a70 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
28a80 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  /.  nolockIoMeth
28a90 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ods,          /*
28aa0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
28ab0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
28ac0 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28ae0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
28af0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
28b00 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20   nolockClose,   
28b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
28b20 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
28b30 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20   nolockLock,    
28b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
28b50 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
28b60 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  nolockUnlock,   
28b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
28b80 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
28b90 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
28ba0 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43  rvedLock   /* xC
28bb0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
28bc0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
28bd0 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63  ETHODS(.  dotloc
28be0 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
28bf0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
28c00 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
28c10 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   dotlockIoMethod
28c20 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  s,         /* sq
28c30 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
28c40 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
28c50 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
28c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
28c70 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
28c80 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f  disabled */.  do
28c90 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  tlockClose,     
28ca0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
28cb0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  e method */.  do
28cc0 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  tlockLock,      
28cd0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
28ce0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
28cf0 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
28d00 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
28d10 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
28d20 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
28d30 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63  edLock  /* xChec
28d40 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
28d50 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53  thod */.)..#if S
28d60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
28d70 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
28d80 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
28d90 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69  ODS(.  flockIoFi
28da0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
28db0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
28dc0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c  ion name */.  fl
28dd0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
28de0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
28df0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
28e00 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
28e10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28e20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
28e30 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
28e40 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  abled */.  flock
28e50 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
28e60 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
28e70 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
28e80 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
28e90 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
28ea0 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55  thod */.  flockU
28eb0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
28ec0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
28ed0 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
28ee0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
28ef0 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k    /* xCheckRe
28f00 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
28f10 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
28f20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f  if OS_VXWORKS.IO
28f30 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f  METHODS(.  semIo
28f40 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
28f50 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
28f60 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
28f70 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20    semIoMethods, 
28f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
28f90 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
28fa0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
28fb0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
28fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28fd0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
28fe0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73   disabled */.  s
28ff0 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  emClose,        
29000 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
29010 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  se method */.  s
29020 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  emLock,         
29030 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
29040 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  k method */.  se
29050 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  mUnlock,        
29060 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
29070 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  ck method */.  s
29080 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  emCheckReservedL
29090 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
290a0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
290b0 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
290c0 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
290d0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
290e0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
290f0 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f  NG_STYLE.IOMETHO
29100 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65  DS(.  afpIoFinde
29110 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
29120 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
29130 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70  on name */.  afp
29140 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
29150 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
29160 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
29170 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29190 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
291a0 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
291b0 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f  bled */.  afpClo
291c0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
291d0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
291e0 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63  thod */.  afpLoc
291f0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
29200 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
29210 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f  hod */.  afpUnlo
29220 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
29230 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
29240 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65  thod */.  afpChe
29250 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
29260 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
29270 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
29280 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
29290 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
292a0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20  cking method is 
292b0 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22  a "super-method"
292c0 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68   in the sense th
292d0 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73  at it.** opens s
292e0 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65  econdary file de
292f0 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68  scriptors for th
29300 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b  e conch and lock
29310 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74   files and.** it
29320 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74   uses proxy, dot
29330 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20  -file, AFP, and 
29340 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20  flock() locking 
29350 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65  methods on those
29360 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69  .** secondary fi
29370 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72  les.  For this r
29380 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
29390 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
293a0 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63  nts.** proxy loc
293b0 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20  king is located 
293c0 6d 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77  much further dow
293d0 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  n in the file.  
293e0 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74  But we need.** t
293f0 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64  o go ahead and d
29400 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65  efine the sqlite
29410 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64  3_io_methods and
29420 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
29430 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  .** for proxy lo
29440 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20  cking here.  So 
29450 77 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61  we forward decla
29460 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f  re the I/O metho
29470 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ds..*/.#if defin
29480 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
29490 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
294a0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61  OCKING_STYLE.sta
294b0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f  tic int proxyClo
294c0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  se(sqlite3_file*
294d0 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
294e0 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  oxyLock(sqlite3_
294f0 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
29500 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c  tic int proxyUnl
29510 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
29520 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
29530 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65  int proxyCheckRe
29540 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
29550 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b  e3_file*, int*);
29560 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72  .IOMETHODS(.  pr
29570 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  oxyIoFinder,    
29580 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
29590 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
295a0 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68  */.  proxyIoMeth
295b0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
295c0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
295d0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
295e0 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
295f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29600 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
29610 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
29620 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20    proxyClose,   
29630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29640 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
29650 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20    proxyLock,    
29660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29670 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
29680 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20   proxyUnlock,   
29690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
296a0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
296b0 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65    proxyCheckRese
296c0 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78  rvedLock    /* x
296d0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
296e0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
296f0 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63  ndif../* nfs loc
29700 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20  kd on OSX 10.3+ 
29710 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72  doesn't clear wr
29720 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61  ite locks when a
29730 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
29740 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  t */.#if defined
29750 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
29760 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
29770 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
29780 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e  HODS(.  nfsIoFin
29790 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
297a0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
297b0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
297c0 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  nfsIoMethods,   
297d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
297e0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
297f0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
29800 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
29810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29820 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
29830 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75   disabled */.  u
29840 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
29850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
29860 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
29870 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
29880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
29890 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
298a0 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nfsUnlock,      
298b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
298c0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
298d0 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
298e0 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
298f0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
29900 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
29910 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
29920 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
29930 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
29940 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
29950 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
29960 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  " function attem
29970 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
29980 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
29990 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66  g strategy .** f
299a0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
299b0 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e  file "filePath".
299c0 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
299d0 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
299e0 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
299f0 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
29a00 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
29a10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
29a20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e  for MacOSX only.
29a30 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
29a40 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
29a50 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
29a60 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
29a70 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
29a80 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
29a90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29aa0 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
29ab0 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
29ac0 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62   /* open file ob
29ad0 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74  ject for the dat
29ae0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  abase file */.){
29af0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
29b00 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b  struct Mapping {
29b10 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
29b20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20  *zFilesystem;   
29b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
29b40 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61  lesystem type na
29b50 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  me */.    const 
29b60 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29b70 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20  ds *pMethods;   
29b80 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c  /* Appropriate l
29b90 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f  ocking method */
29ba0 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a  .  } aMap[] = {.
29bb0 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20      { "hfs",    
29bc0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
29bd0 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20  },.    { "ufs", 
29be0 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
29bf0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70  ds },.    { "afp
29c00 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
29c10 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d  ods },.    { "sm
29c20 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  bfs",  &afpIoMet
29c30 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77  hods },.    { "w
29c40 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49  ebdav", &nolockI
29c50 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
29c60 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20  { 0, 0 }.  };.  
29c70 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
29c80 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
29c90 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
29ca0 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
29cb0 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
29cc0 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
29cd0 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
29ce0 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
29cf0 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
29d00 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
29d10 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
29d20 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
29d30 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
29d40 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
29d50 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69  .  if( statfs(fi
29d60 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  lePath, &fsInfo)
29d70 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66   != -1 ){.    if
29d80 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  ( fsInfo.f_flags
29d90 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b   & MNT_RDONLY ){
29da0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
29db0 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
29dc0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
29dd0 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  0; aMap[i].zFile
29de0 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  system; i++){.  
29df0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
29e00 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
29e10 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  me, aMap[i].zFil
29e20 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20  esystem)==0 ){. 
29e30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d         return aM
29e40 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a  ap[i].pMethods;.
29e50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29e60 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  }..  /* Default 
29e70 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61  case. Handles, a
29e80 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22  mongst others, "
29e90 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20  nfs"..  ** Test 
29ea0 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20  byte-range lock 
29eb0 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49  using fcntl(). I
29ec0 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65  f the call succe
29ed0 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d  eds, .  ** assum
29ee0 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d  e that the file-
29ef0 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
29f00 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
29f10 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  s. .  */.  lockI
29f20 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
29f30 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
29f40 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
29f50 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
29f60 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
29f70 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
29f80 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
29f90 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
29fa0 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
29fb0 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73  -1 ) {.    if( s
29fc0 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
29fd0 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22  stypename, "nfs"
29fe0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
29ff0 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f  turn &nfsIoMetho
2a000 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ds;.    } else {
2a010 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70  .      return &p
2a020 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  osixIoMethods;. 
2a030 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2a040 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63    return &dotloc
2a050 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
2a060 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
2a070 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2a080 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75  s .  *(*const au
2a090 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28  tolockIoFinder)(
2a0a0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
2a0b0 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63  File*) = autoloc
2a0c0 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a  kIoFinderImpl;..
2a0d0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
2a0e0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2a0f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2a100 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
2a110 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  #if OS_VXWORKS &
2a120 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2a130 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
2a140 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65   .** This "finde
2a150 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  r" function atte
2a160 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
2a170 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  e the best locki
2a180 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20  ng strategy .** 
2a190 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
2a1a0 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22   file "filePath"
2a1b0 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72  .  It then retur
2a1c0 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ns the sqlite3_i
2a1d0 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
2a1e0 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
2a1f0 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67  nts that strateg
2a200 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  y..**.** This is
2a210 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c   for VXWorks onl
2a220 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y..*/.static con
2a230 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2a240 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49  thods *autolockI
2a250 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
2a260 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
2a270 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
2a280 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2a290 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
2a2a0 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
2a2b0 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66     /* the open f
2a2c0 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  ile object */.){
2a2d0 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
2a2e0 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
2a2f0 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
2a300 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
2a310 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
2a320 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
2a330 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
2a340 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
2a350 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
2a360 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
2a370 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
2a380 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
2a390 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66   }..  /* Test if
2a3a0 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70   fcntl() is supp
2a3b0 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f  orted and use PO
2a3c0 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e  SIX style locks.
2a3d0 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  .  ** Otherwise 
2a3e0 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
2a3f0 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
2a400 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20   method..  */.  
2a410 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
2a420 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
2a430 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
2a440 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
2a450 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
2a460 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
2a470 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f  F_RDLCK;.  if( o
2a480 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20  sFcntl(pNew->h, 
2a490 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
2a4a0 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
2a4b0 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d  return &posixIoM
2a4c0 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
2a4d0 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d  .    return &sem
2a4e0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d  IoMethods;.  }.}
2a4f0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
2a500 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a510 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74   .  *(*const aut
2a520 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63  olockIoFinder)(c
2a530 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
2a540 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b  ile*) = autolock
2a550 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
2a560 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
2a570 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  RKS && SQLITE_EN
2a580 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2a590 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  LE */../*.** An 
2a5a0 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f  abstract type fo
2a5b0 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
2a5c0 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65   IO method finde
2a5d0 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74  r function:.*/.t
2a5e0 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c  ypedef const sql
2a5f0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2a600 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28  *(*finder_type)(
2a610 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
2a620 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a  File*);.../*****
2a630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a670 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
2a680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a690 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  **** sqlite3_vfs
2a6a0 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
2a6b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a6c0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
2a6d0 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
2a6e0 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ns the implement
2a6f0 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73  ation of methods
2a700 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   on the.** sqlit
2a710 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a  e3_vfs object..*
2a720 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  /../*.** Initial
2a730 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ize the contents
2a740 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   of the unixFile
2a750 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
2a760 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f  ed to by pId..*/
2a770 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
2a780 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71  InUnixFile(.  sq
2a790 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2a7a0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2a7b0 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
2a7c0 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20  /.  int h,      
2a7d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2a7e0 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
2a7f0 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e  tor of file bein
2a800 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71  g opened */.  sq
2a810 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c  lite3_file *pId,
2a820 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
2a830 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  o the unixFile s
2a840 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
2a850 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2a860 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
2a870 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62  me of the file b
2a880 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
2a890 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 20   int ctrlFlags  
2a8a0 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f           /* Zero
2a8b0 20 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c   or more UNIXFIL
2a8c0 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  E_* values */.){
2a8d0 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
2a8e0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f  _io_methods *pLo
2a8f0 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e  ckingStyle;.  un
2a900 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28  ixFile *pNew = (
2a910 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a  unixFile *)pId;.
2a920 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a930 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
2a940 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e   pNew->pInode==N
2a950 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55 73 75  ULL );..  /* Usu
2a960 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20 7a 46  ally the path zF
2a970 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  ilename should n
2a980 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69 76 65  ot be a relative
2a990 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20   pathname. The. 
2a9a0 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69 73   ** exception is
2a9b0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68   when opening th
2a9c0 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68 22 20  e proxy "conch" 
2a9d0 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73 20 74  file in builds t
2a9e0 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65  hat.  ** include
2a9f0 20 74 68 65 20 73 70 65 63 69 61 6c 20 41 70 70   the special App
2aa00 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65  le locking style
2aa10 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  s..  */.#if defi
2aa20 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
2aa30 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2aa40 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2aa50 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
2aa60 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
2aa70 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c  e[0]=='/' .    |
2aa80 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61  | pVfs->pAppData
2aa90 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f  ==(void*)&autolo
2aaa0 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65  ckIoFinder );.#e
2aab0 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a 46  lse.  assert( zF
2aac0 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
2aad0 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  ilename[0]=='/' 
2aae0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
2aaf0 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72  No locking occur
2ab00 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66  s in temporary f
2ab10 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  iles */.  assert
2ab20 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c  ( zFilename!=0 |
2ab30 7c 20 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55  | (ctrlFlags & U
2ab40 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21  NIXFILE_NOLOCK)!
2ab50 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  =0 );..  OSTRACE
2ab60 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20  (("OPEN    %-3d 
2ab70 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e  %s\n", h, zFilen
2ab80 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68  ame));.  pNew->h
2ab90 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56   = h;.  pNew->pV
2aba0 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65  fs = pVfs;.  pNe
2abb0 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65  w->zPath = zFile
2abc0 6e 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74  name;.  pNew->ct
2abd0 72 6c 46 6c 61 67 73 20 3d 20 28 75 38 29 63 74  rlFlags = (u8)ct
2abe0 72 6c 46 6c 61 67 73 3b 0a 23 69 66 20 53 51 4c  rlFlags;.#if SQL
2abf0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
2ac00 45 3e 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70  E>0.  pNew->mmap
2ac10 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65  SizeMax = sqlite
2ac20 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
2ac30 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 20 20 69  Mmap;.#endif.  i
2ac40 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  f( sqlite3_uri_b
2ac50 6f 6f 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c 61  oolean(((ctrlFla
2ac60 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 55 52  gs & UNIXFILE_UR
2ac70 49 29 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a  I) ? zFilename :
2ac80 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
2ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aca0 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50  "psow", SQLITE_P
2acb0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
2acc0 54 45 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  TE) ){.    pNew-
2acd0 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
2ace0 49 58 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d  IXFILE_PSOW;.  }
2acf0 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 56  .  if( strcmp(pV
2ad00 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d  fs->zName,"unix-
2ad10 65 78 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  excl")==0 ){.   
2ad20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
2ad30 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58 43   |= UNIXFILE_EXC
2ad40 4c 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56  L;.  }..#if OS_V
2ad50 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70  XWORKS.  pNew->p
2ad60 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64  Id = vxworksFind
2ad70 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65  FileId(zFilename
2ad80 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70  );.  if( pNew->p
2ad90 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74 72  Id==0 ){.    ctr
2ada0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2adb0 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72  LE_NOLOCK;.    r
2adc0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2add0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2ade0 69 66 28 20 63 74 72 6c 46 6c 61 67 73 20 26 20  if( ctrlFlags & 
2adf0 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20  UNIXFILE_NOLOCK 
2ae00 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  ){.    pLockingS
2ae10 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f  tyle = &nolockIo
2ae20 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
2ae30 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
2ae40 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72  yle = (**(finder
2ae50 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70  _type*)pVfs->pAp
2ae60 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65  pData)(zFilename
2ae70 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c  , pNew);.#if SQL
2ae80 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2ae90 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20  NG_STYLE.    /* 
2aea0 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  Cache zFilename 
2aeb0 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  in the locking c
2aec0 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20  ontext (AFP and 
2aed0 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65  dotlock override
2aee0 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f  ) for.    ** pro
2aef0 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f  xyLock activatio
2af00 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72  n is possible (r
2af10 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62  emote proxy is b
2af20 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29  ased on db name)
2af30 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .    ** zFilenam
2af40 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  e remains valid 
2af50 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c  until file is cl
2af60 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74  osed, to support
2af70 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f   */.    pNew->lo
2af80 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28  ckingContext = (
2af90 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b  void*)zFilename;
2afa0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
2afb0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
2afc0 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68   == &posixIoMeth
2afd0 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ods.#if defined(
2afe0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2aff0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2b000 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c  ING_STYLE.    ||
2b010 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2b020 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a  = &nfsIoMethods.
2b030 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20  #endif.  ){.    
2b040 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2b050 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49  ;.    rc = findI
2b060 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
2b070 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
2b080 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2b090 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
2b0a0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2b0b0 75 72 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f  urred in findIno
2b0c0 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20  deInfo(), close 
2b0d0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2b0e0 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d  tor.      ** imm
2b0f0 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65  ediately, before
2b100 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d   releasing the m
2b110 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49  utex. findInodeI
2b120 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20  nfo() may fail. 
2b130 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73       ** in two s
2b140 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20  cenarios:.      
2b150 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61  **.      **   (a
2b160 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61  ) A call to fsta
2b170 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  t() failed..    
2b180 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c    **   (b) A mal
2b190 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  loc failed..    
2b1a0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63    **.      ** Sc
2b1b0 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f  enario (b) may o
2b1c0 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65  nly occur if the
2b1d0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
2b1e0 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20  ing no other.   
2b1f0 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72     ** file descr
2b200 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  iptors open on t
2b210 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66  he same file. If
2b220 20 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65   there were othe
2b230 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  r file.      ** 
2b240 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74  descriptors on t
2b250 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e  his file, then n
2b260 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62  o malloc would b
2b270 65 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  e required by.  
2b280 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65      ** findInode
2b290 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20  Info(). If this 
2b2a0 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20  is the case, it 
2b2b0 69 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f  is quite safe to
2b2c0 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20   close.      ** 
2b2d0 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74  handle h - as it
2b2e0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2b2f0 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63  hat no posix loc
2b300 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61  ks will be relea
2b310 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  sed.      ** by 
2b320 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20  doing so..      
2b330 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73  **.      ** If s
2b340 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73  cenario (a) caus
2b350 65 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65  ed the error the
2b360 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74  n things are not
2b370 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20   so safe. The.  
2b380 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20      ** implicit 
2b390 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20  assumption here 
2b3a0 69 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74  is that if fstat
2b3b0 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73  () fails, things
2b3c0 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a   are in.      **
2b3d0 20 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20   such bad shape 
2b3e0 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20  that dropping a 
2b3f0 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73  lock or two does
2b400 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e  n't matter much.
2b410 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2b420 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
2b430 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
2b440 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20  .      h = -1;. 
2b450 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
2b460 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a  veMutex();.  }..
2b470 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2b480 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
2b490 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
2b4a0 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28  LE__).  else if(
2b4b0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2b4c0 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20  = &afpIoMethods 
2b4d0 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f  ){.    /* AFP lo
2b4e0 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
2b4f0 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
2b500 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
2b510 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
2b520 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
2b530 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext..    */.    
2b540 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
2b550 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65  t *pCtx;.    pNe
2b560 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
2b570 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74  t = pCtx = sqlit
2b580 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
2b590 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20  f(*pCtx) );.    
2b5a0 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20  if( pCtx==0 ){. 
2b5b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2b5c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
2b5d0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20  e{.      /* NB: 
2b5e0 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73  zFilename exists
2b5f0 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c   and remains val
2b600 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c  id until the fil
2b610 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
2b620 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74    ** according t
2b630 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31  o requirement F1
2b640 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20  1141.  So we do 
2b650 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  not need to make
2b660 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
2b670 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   of the filename
2b680 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d  . */.      pCtx-
2b690 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  >dbPath = zFilen
2b6a0 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d  ame;.      pCtx-
2b6b0 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20  >reserved = 0;. 
2b6c0 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28       srandomdev(
2b6d0 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74  );.      unixEnt
2b6e0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  erMutex();.     
2b6f0 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
2b700 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
2b710 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20  >pInode);.      
2b720 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2b730 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
2b740 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
2b750 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
2b760 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f  .        robust_
2b770 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2b780 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2b790 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    h = -1;.      
2b7a0 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  }.      unixLeav
2b7b0 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20  eMutex();       
2b7c0 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64   .    }.  }.#end
2b7d0 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70  if..  else if( p
2b7e0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2b7f0 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
2b800 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66  s ){.    /* Dotf
2b810 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ile locking uses
2b820 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2b830 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2b840 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
2b850 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c   ** the dotlockL
2b860 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20  ockingContext . 
2b870 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a     */.    char *
2b880 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69  zLockFile;.    i
2b890 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  nt nFilename;.  
2b8a0 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
2b8b0 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46  ame!=0 );.    nF
2b8c0 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73  ilename = (int)s
2b8d0 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
2b8e0 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46   + 6;.    zLockF
2b8f0 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ile = (char *)sq
2b900 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69  lite3_malloc(nFi
2b910 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
2b920 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b   zLockFile==0 ){
2b930 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2b940 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
2b950 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2b960 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c  e3_snprintf(nFil
2b970 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65  ename, zLockFile
2b980 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53  , "%s" DOTLOCK_S
2b990 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65  UFFIX, zFilename
2b9a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
2b9b0 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
2b9c0 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  t = zLockFile;. 
2b9d0 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   }..#if OS_VXWOR
2b9e0 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  KS.  else if( pL
2b9f0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2ba00 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  semIoMethods ){.
2ba10 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d      /* Named sem
2ba20 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75  aphore locking u
2ba30 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
2ba40 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
2ba50 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75   be.    ** inclu
2ba60 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f  ded in the semLo
2ba70 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20  ckingContext.   
2ba80 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   */.    unixEnte
2ba90 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
2baa0 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
2bab0 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
2bac0 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28  node);.    if( (
2bad0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
2bae0 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d  & (pNew->pInode-
2baf0 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a  >pSem==NULL) ){.
2bb00 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d        char *zSem
2bb10 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e  Name = pNew->pIn
2bb20 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20  ode->aSemName;. 
2bb30 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
2bb40 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2bb50 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c  tf(MAX_PATHNAME,
2bb60 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e   zSemName, "/%s.
2bb70 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  sem",.          
2bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
2bb90 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  w->pId->zCanonic
2bba0 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66  alName);.      f
2bbb0 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d  or( n=1; zSemNam
2bbc0 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20  e[n]; n++ ).    
2bbd0 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65      if( zSemName
2bbe0 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e  [n]=='/' ) zSemN
2bbf0 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20  ame[n] = '_';.  
2bc00 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65      pNew->pInode
2bc10 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65  ->pSem = sem_ope
2bc20 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52  n(zSemName, O_CR
2bc30 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20  EAT, 0666, 1);. 
2bc40 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70       if( pNew->p
2bc50 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53  Inode->pSem == S
2bc60 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  EM_FAILED ){.   
2bc70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2bc80 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
2bc90 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53  pNew->pInode->aS
2bca0 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27  emName[0] = '\0'
2bcb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2bcc0 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
2bcd0 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
2bce0 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74  .  .  pNew->last
2bcf0 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f  Errno = 0;.#if O
2bd00 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
2bd10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2bd20 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
2bd30 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
2bd40 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
2bd50 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20  .    h = -1;.   
2bd60 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e   osUnlink(zFilen
2bd70 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ame);.    pNew->
2bd80 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2bd90 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20  XFILE_DELETE;.  
2bda0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
2bdb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2bdc0 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72      if( h>=0 ) r
2bdd0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
2bde0 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
2bdf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
2be00 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f  w->pMethod = pLo
2be10 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20  ckingStyle;.    
2be20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
2be30 0a 20 20 20 20 76 65 72 69 66 79 44 62 46 69 6c  .    verifyDbFil
2be40 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72  e(pNew);.  }.  r
2be50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2be60 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
2be70 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72  me of a director
2be80 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75  y in which to pu
2be90 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  t temporary file
2bea0 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74  s..** If no suit
2beb0 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66  able temporary f
2bec0 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63 61  ile directory ca
2bed0 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  n be found, retu
2bee0 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
2bef0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
2bf00 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76  nixTempFileDir(v
2bf10 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63  oid){.  static c
2bf20 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72  onst char *azDir
2bf30 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a  s[] = {.     0,.
2bf40 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76       0,.     "/v
2bf50 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  ar/tmp",.     "/
2bf60 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  usr/tmp",.     "
2bf70 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20 20 20  /tmp",.     0   
2bf80 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72       /* List ter
2bf90 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a  minator */.  };.
2bfa0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
2bfb0 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
2bfc0 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  buf;.  const cha
2bfd0 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20  r *zDir = 0;..  
2bfe0 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69  azDirs[0] = sqli
2bff0 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
2c000 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72  ry;.  if( !azDir
2c010 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d  s[1] ) azDirs[1]
2c020 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49   = getenv("TMPDI
2c030 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  R");.  for(i=0; 
2c040 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  i<sizeof(azDirs)
2c050 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
2c060 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b  ]); zDir=azDirs[
2c070 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a  i++]){.    if( z
2c080 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Dir==0 ) continu
2c090 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53 74 61  e;.    if( osSta
2c0a0 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29 20  t(zDir, &buf) ) 
2c0b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2c0c0 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73  ( !S_ISDIR(buf.s
2c0d0 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e  t_mode) ) contin
2c0e0 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 41 63  ue;.    if( osAc
2c0f0 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20 29  cess(zDir, 07) )
2c100 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62   continue;.    b
2c110 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
2c120 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zDir;.}../*.*
2c130 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
2c140 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  rary file name i
2c150 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75  n zBuf.  zBuf mu
2c160 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
2c170 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ** by the callin
2c180 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75  g process and mu
2c190 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68  st be big enough
2c1a0 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73   to hold at leas
2c1b0 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74  t.** pVfs->mxPat
2c1c0 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a  hname bytes..*/.
2c1d0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
2c1e0 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e  etTempname(int n
2c1f0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
2c200 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
2c210 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
2c220 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
2c230 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
2c240 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
2c250 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
2c260 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
2c270 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
2c280 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20  unsigned int i, 
2c290 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  j;.  const char 
2c2a0 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27  *zDir;..  /* It'
2c2b0 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
2c2c0 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
2c2d0 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
2c2e0 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
2c2f0 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
2c300 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
2c310 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
2c320 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
2c330 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
2c340 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f  n failing. .  */
2c350 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
2c360 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
2c370 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44  E_IOERR );..  zD
2c380 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c  ir = unixTempFil
2c390 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44  eDir();.  if( zD
2c3a0 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20 22  ir==0 ) zDir = "
2c3b0 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  .";..  /* Check 
2c3c0 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20  that the output 
2c3d0 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20  buffer is large 
2c3e0 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74  enough for the t
2c3f0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20  emporary file . 
2c400 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20   ** name. If it 
2c410 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53  is not, return S
2c420 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a  QLITE_ERROR..  *
2c430 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28  /.  if( (strlen(
2c440 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53  zDir) + strlen(S
2c450 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
2c460 50 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d  PREFIX) + 18) >=
2c470 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b   (size_t)nBuf ){
2c480 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2c490 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
2c4a0 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
2c4b0 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
2c4c0 38 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51  8, zBuf, "%s/"SQ
2c4d0 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
2c4e0 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20  REFIX, zDir);.  
2c4f0 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    j = (int)strle
2c500 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c  n(zBuf);.    sql
2c510 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
2c520 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
2c530 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35     for(i=0; i<15
2c540 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
2c550 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
2c560 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
2c570 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
2c580 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
2c590 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a  rs)-1) ];.    }.
2c5a0 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b      zBuf[j] = 0;
2c5b0 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d  .    zBuf[j+1] =
2c5c0 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73   0;.  }while( os
2c5d0 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d  Access(zBuf,0)==
2c5e0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
2c5f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
2c600 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2c610 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
2c620 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2c630 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20  )./*.** Routine 
2c640 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75  to transform a u
2c650 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70  nixFile into a p
2c660 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69  roxy-locking uni
2c670 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d  xFile..** Implem
2c680 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  entation in the 
2c690 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73  proxy-lock divis
2c6a0 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79  ion, but used by
2c6b0 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69   unixOpen().** i
2c6c0 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  f SQLITE_PREFER_
2c6d0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73  PROXY_LOCKING is
2c6e0 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61   defined..*/.sta
2c6f0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61  tic int proxyTra
2c700 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75  nsformUnixFile(u
2c710 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20  nixFile*, const 
2c720 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  char*);.#endif..
2c730 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
2c740 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
2c750 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20  descriptor that 
2c760 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  was opened on th
2c770 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
2c780 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
2c790 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75  al or master-jou
2c7a0 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74  rnal file) ident
2c7b0 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d  ified by pathnam
2c7c0 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20  e.** zPath with 
2c7d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20  SQLITE_OPEN_XXX 
2c7e0 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74  flags matching t
2c7f0 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74  hose passed as t
2c800 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
2c810 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
2c820 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75  nction..**.** Su
2c830 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  ch a file descri
2c840 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69  ptor may exist i
2c850 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  f a database con
2c860 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73  nection was clos
2c870 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73  ed.** but the as
2c880 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65  sociated file de
2c890 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e  scriptor could n
2c8a0 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63  ot be closed bec
2c8b0 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  ause some.** oth
2c8c0 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
2c8d0 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  or open on the s
2c8e0 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64  ame file is hold
2c8f0 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e  ing a file-lock.
2c900 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d  .** Refer to com
2c910 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69  ments in the uni
2c920 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f  xClose() functio
2c930 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68  n and the length
2c940 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73  y comment.** des
2c950 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41  cribing "Posix A
2c960 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22  dvisory Locking"
2c970 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
2c980 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a   this file for .
2c990 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69  ** further detai
2c9a0 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74  ls. Also, ticket
2c9b0 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66   #4018..**.** If
2c9c0 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65   a suitable file
2c9d0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66   descriptor is f
2c9e0 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73  ound, then it is
2c9f0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
2ca00 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65  .** such file de
2ca10 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61  scriptor is loca
2ca20 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72  ted, -1 is retur
2ca30 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55  ned..*/.static U
2ca40 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e  nixUnusedFd *fin
2ca50 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73  dReusableFd(cons
2ca60 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69  t char *zPath, i
2ca70 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69  nt flags){.  Uni
2ca80 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
2ca90 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f  ed = 0;..  /* Do
2caa0 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20   not search for 
2cab0 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
2cac0 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77  escriptor on vxw
2cad0 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73  orks. Not becaus
2cae0 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77  e.  ** vxworks w
2caf0 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74  ould not benefit
2cb00 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65   from the change
2cb10 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72   (it might, we'r
2cb20 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a  e not sure),.  *
2cb30 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f  * but because no
2cb40 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20   way to test it 
2cb50 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61  is currently ava
2cb60 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65  ilable. It is be
2cb70 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74  tter .  ** not t
2cb80 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20  o risk breaking 
2cb90 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20  vxworks support 
2cba0 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20  for the sake of 
2cbb0 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20  such an obscure 
2cbc0 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20  .  ** feature.  
2cbd0 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52  */.#if !OS_VXWOR
2cbe0 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  KS.  struct stat
2cbf0 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
2cc00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
2cc10 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63  ults of stat() c
2cc20 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73  all */..  /* A s
2cc30 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66  tat() call may f
2cc40 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20  ail for various 
2cc50 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73  reasons. If this
2cc60 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a   happens, it is.
2cc70 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74    ** almost cert
2cc80 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e  ain that an open
2cc90 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73  () call on the s
2cca0 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c  ame path will al
2ccb0 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f  so fail..  ** Fo
2ccc0 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69  r this reason, i
2ccd0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2cce0 73 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20  s in the stat() 
2ccf0 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73  call here, it is
2cd00 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e  .  ** ignored an
2cd10 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  d -1 is returned
2cd20 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
2cd30 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20  l try to open a 
2cd40 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65  new file.  ** de
2cd50 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
2cd60 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c  same path, fail,
2cd70 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65   and return an e
2cd80 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a  rror to SQLite..
2cd90 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69    **.  ** Even i
2cda0 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  f a subsequent o
2cdb0 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20  pen() call does 
2cdc0 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e  succeed, the con
2cdd0 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a  sequences of.  *
2cde0 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20  * not searching 
2cdf0 66 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65 20  for a resusable 
2ce00 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2ce10 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a  are not dire.  *
2ce20 2f 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61  /.  if( 0==osSta
2ce30 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29  t(zPath, &sStat)
2ce40 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64   ){.    unixInod
2ce50 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a  eInfo *pInode;..
2ce60 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2ce70 65 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65  ex();.    pInode
2ce80 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
2ce90 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20    while( pInode 
2cea0 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  && (pInode->file
2ceb0 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74  Id.dev!=sStat.st
2cec0 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20  _dev.           
2ced0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e            || pIn
2cee0 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21  ode->fileId.ino!
2cef0 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29  =sStat.st_ino) )
2cf00 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20  {.       pInode 
2cf10 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
2cf20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2cf30 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55  Inode ){.      U
2cf40 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70  nixUnusedFd **pp
2cf50 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26  ;.      for(pp=&
2cf60 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b  pInode->pUnused;
2cf70 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66   *pp && (*pp)->f
2cf80 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d  lags!=flags; pp=
2cf90 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29  &((*pp)->pNext))
2cfa0 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20  ;.      pUnused 
2cfb0 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28  = *pp;.      if(
2cfc0 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20   pUnused ){.    
2cfd0 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65      *pp = pUnuse
2cfe0 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  d->pNext;.      
2cff0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  }.    }.    unix
2d000 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
2d010 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69  }.#endif    /* i
2d020 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  f !OS_VXWORKS */
2d030 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65  .  return pUnuse
2d040 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  d;.}../*.** This
2d050 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2d060 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28  led by unixOpen(
2d070 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  ) to determine t
2d080 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69  he unix permissi
2d090 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  ons.** to create
2d0a0 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e   new files with.
2d0b0 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
2d0c0 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
2d0d0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
2d0e0 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73  ** and a value s
2d0f0 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73  uitable for pass
2d100 69 6e 67 20 61 73 20 74 68 65 20 74 68 69 72 64  ing as the third
2d110 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65   argument to ope
2d120 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74  n(2) is.** writt
2d130 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66  en to *pMode. If
2d140 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2d150 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  urs, an SQLite e
2d160 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
2d170 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
2d180 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64  e value of *pMod
2d190 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65  e is not modifie
2d1a0 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74  d..**.** In most
2d1b0 20 63 61 73 65 73 20 63 61 73 65 73 2c 20 74 68   cases cases, th
2d1c0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
2d1d0 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77 68 69  *pMode to 0, whi
2d1e0 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a  ch will become.*
2d1f0 2a 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20  * an indication 
2d200 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29  to robust_open()
2d210 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 66   to create the f
2d220 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c  ile using.** SQL
2d230 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
2d240 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a  _PERMISSIONS adj
2d250 75 73 74 65 64 20 62 79 20 74 68 65 20 75 6d 61  usted by the uma
2d260 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68  sk..** But if th
2d270 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
2d280 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20  ned is a WAL or 
2d290 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20  regular journal 
2d2a0 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  file, then .** t
2d2b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65  his function que
2d2c0 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79  ries the file-sy
2d2d0 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72  stem for the per
2d2e0 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20  missions on the 
2d2f0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
2d300 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
2d310 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20  and sets *pMode 
2d320 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57  to this value. W
2d330 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73  henever .** poss
2d340 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f  ible, WAL and jo
2d350 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20  urnal files are 
2d360 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
2d370 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f  e same permissio
2d380 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73  ns .** as the as
2d390 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
2d3a0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
2d3b0 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
2d3c0 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74  LE_8_3_NAMES opt
2d3d0 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
2d3e0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67  then the.** orig
2d3f0 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  inal filename is
2d400 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 42   unavailable.  B
2d410 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20  ut 8_3_NAMES is 
2d420 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a  only used for.**
2d430 20 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d 73   FAT filesystems
2d440 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73   and permissions
2d450 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74   do not matter t
2d460 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75 73  here, so just us
2d470 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  e.** the default
2d480 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f   permissions..*/
2d490 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
2d4a0 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a  CreateFileMode(.
2d4b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2d4c0 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
2d4d0 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c    /* Path of fil
2d4e0 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69  e (possibly) bei
2d4f0 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  ng created */.  
2d500 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
2d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d520 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
2d530 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20  as 4th argument 
2d540 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  to xOpen() */.  
2d550 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20  mode_t *pMode,  
2d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d570 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69  /* OUT: Permissi
2d580 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  ons to open file
2d590 20 77 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74   with */.  uid_t
2d5a0 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20 20   *pUid,         
2d5b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2d5c0 54 3a 20 75 69 64 20 74 6f 20 73 65 74 20 6f 6e  T: uid to set on
2d5d0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67   the file */.  g
2d5e0 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20  id_t *pGid      
2d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d600 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f 20 73 65  * OUT: gid to se
2d610 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  t on the file */
2d620 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
2d630 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2d640 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2d650 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65  Code */.  *pMode
2d660 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20   = 0;.  *pUid = 
2d670 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a  0;.  *pGid = 0;.
2d680 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53    if( flags & (S
2d690 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53  QLITE_OPEN_WAL|S
2d6a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2d6b0 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20  JOURNAL) ){.    
2d6c0 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54  char zDb[MAX_PAT
2d6d0 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a  HNAME+1];     /*
2d6e0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   Database file p
2d6f0 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ath */.    int n
2d700 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
2d710 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d720 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65  er of valid byte
2d730 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20  s in zDb */.    
2d740 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
2d750 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
2d760 20 4f 75 74 70 75 74 20 6f 66 20 73 74 61 74 28   Output of stat(
2d770 29 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  ) on database fi
2d780 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50  le */..    /* zP
2d790 61 74 68 20 69 73 20 61 20 70 61 74 68 20 74 6f  ath is a path to
2d7a0 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61   a WAL or journa
2d7b0 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  l file. The foll
2d7c0 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69  owing block deri
2d7d0 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  ves.    ** the p
2d7e0 61 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63  ath to the assoc
2d7f0 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66  iated database f
2d800 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20  ile from zPath. 
2d810 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c  This block handl
2d820 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f  es.    ** the fo
2d830 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63  llowing naming c
2d840 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20  onventions:.    
2d850 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  **.    **   "<pa
2d860 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61  th to db>-journa
2d870 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  l".    **   "<pa
2d880 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20  th to db>-wal". 
2d890 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
2d8a0 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22  o db>-journalNN"
2d8b0 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
2d8c0 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20   to db>-walNN". 
2d8d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65     **.    ** whe
2d8e0 72 65 20 4e 4e 20 69 73 20 61 20 64 65 63 69 6d  re NN is a decim
2d8f0 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e  al number. The N
2d900 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73  N naming schemes
2d910 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65   are .    ** use
2d920 64 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75  d by the test_mu
2d930 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65  ltiplex.c module
2d940 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62  ..    */.    nDb
2d950 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2d960 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a  30(zPath) - 1; .
2d970 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2d980 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20  ABLE_8_3_NAMES. 
2d990 20 20 20 77 68 69 6c 65 28 20 6e 44 62 3e 30 20     while( nDb>0 
2d9a0 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c 6e 75  && sqlite3Isalnu
2d9b0 6d 28 7a 50 61 74 68 5b 6e 44 62 5d 29 20 29 20  m(zPath[nDb]) ) 
2d9c0 6e 44 62 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e  nDb--;.    if( n
2d9d0 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e  Db==0 || zPath[n
2d9e0 44 62 5d 21 3d 27 2d 27 20 29 20 72 65 74 75 72  Db]!='-' ) retur
2d9f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  n SQLITE_OK;.#el
2da00 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50  se.    while( zP
2da10 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b  ath[nDb]!='-' ){
2da20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
2da30 44 62 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  Db>0 );.      as
2da40 73 65 72 74 28 20 7a 50 61 74 68 5b 6e 44 62 5d  sert( zPath[nDb]
2da50 21 3d 27 5c 6e 27 20 29 3b 0a 20 20 20 20 20 20  !='\n' );.      
2da60 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e  nDb--;.    }.#en
2da70 64 69 66 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  dif.    memcpy(z
2da80 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b  Db, zPath, nDb);
2da90 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20  .    zDb[nDb] = 
2daa0 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20 30  '\0';..    if( 0
2dab0 3d 3d 6f 73 53 74 61 74 28 7a 44 62 2c 20 26 73  ==osStat(zDb, &s
2dac0 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a  Stat) ){.      *
2dad0 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74  pMode = sStat.st
2dae0 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20  _mode & 0777;.  
2daf0 20 20 20 20 2a 70 55 69 64 20 3d 20 73 53 74 61      *pUid = sSta
2db00 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20 20 20  t.st_uid;.      
2db10 2a 70 47 69 64 20 3d 20 73 53 74 61 74 2e 73 74  *pGid = sStat.st
2db20 5f 67 69 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _gid;.    }else{
2db30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2db40 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
2db50 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2db60 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
2db70 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
2db80 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64  OSE ){.    *pMod
2db90 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20  e = 0600;.  }.  
2dba0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2dbb0 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c  .** Open the fil
2dbc0 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  e zPath..** .** 
2dbd0 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20  Previously, the 
2dbe0 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20  SQLite OS layer 
2dbf0 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74  used three funct
2dc00 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66  ions in place of
2dc10 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a   this.** one:.**
2dc20 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
2dc30 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29  sOpenReadWrite()
2dc40 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
2dc50 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29  OsOpenReadOnly()
2dc60 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
2dc70 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
2dc80 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  );.**.** These c
2dc90 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  alls correspond 
2dca0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
2dcb0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
2dcc0 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
2dcd0 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e    ReadWrite() ->
2dce0 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20       (READWRITE 
2dcf0 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20  | CREATE).**    
2dd00 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20   ReadOnly()  -> 
2dd10 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a      (READONLY) .
2dd20 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75  **     OpenExclu
2dd30 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57  sive() -> (READW
2dd40 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20  RITE | CREATE | 
2dd50 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a  EXCLUSIVE).**.**
2dd60 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63   The old OpenExc
2dd70 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65  lusive() accepte
2dd80 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75  d a boolean argu
2dd90 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22  ment - "delFlag"
2dda0 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68  . If.** true, th
2ddb0 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69  e file was confi
2ddc0 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f  gured to be auto
2ddd0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
2dde0 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69  d when the.** fi
2ddf0 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64  le handle closed
2de00 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65  . To achieve the
2de10 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69   same effect usi
2de20 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20  ng this new .** 
2de30 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74  interface, add t
2de40 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  he DELETEONCLOSE
2de50 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73   flag to those s
2de60 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66  pecified above f
2de70 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75  or .** OpenExclu
2de80 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sive()..*/.stati
2de90 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a  c int unixOpen(.
2dea0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2deb0 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs,           /
2dec0 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68  * The VFS for wh
2ded0 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20  ich this is the 
2dee0 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a  xOpen method */.
2def0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2df00 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ath,           /
2df10 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69  * Pathname of fi
2df20 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  le to be opened 
2df30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
2df40 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
2df50 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
2df60 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66  scriptor to be f
2df70 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e  illed in */.  in
2df80 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2df90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2dfa0 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e  put flags to con
2dfb0 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67  trol the opening
2dfc0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
2dfd0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
2dfe0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61     /* Output fla
2dff0 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  gs returned to S
2e000 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b  QLite core */.){
2e010 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
2e020 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69   (unixFile *)pFi
2e030 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  le;.  int fd = -
2e040 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
2e050 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
2e060 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64  criptor returned
2e070 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   by open() */.  
2e080 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
2e090 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2e0a0 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
2e0b0 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  to open() */.  i
2e0c0 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73  nt eType = flags
2e0d0 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a  &0xFFFFFF00;  /*
2e0e0 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f   Type of file to
2e0f0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
2e100 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
2e110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2e120 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e  e to omit lockin
2e130 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a  g primitives */.
2e140 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2e150 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2e160 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74   /* Function Ret
2e170 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
2e180 74 20 63 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b  t ctrlFlags = 0;
2e190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e1a0 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73  UNIXFILE_* flags
2e1b0 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63   */..  int isExc
2e1c0 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
2e1d0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
2e1e0 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
2e1f0 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
2e200 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2e210 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
2e220 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
2e230 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
2e240 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
2e250 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73  REATE);.  int is
2e260 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
2e270 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2e280 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69  N_READONLY);.  i
2e290 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
2e2a0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2e2b0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
2e2c0 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  );.#if SQLITE_EN
2e2d0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2e2e0 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50  LE.  int isAutoP
2e2f0 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26  roxy  = (flags &
2e300 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54   SQLITE_OPEN_AUT
2e310 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a  OPROXY);.#endif.
2e320 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2e330 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45  PLE__) || SQLITE
2e340 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2e350 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73  STYLE.  struct s
2e360 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65  tatfs fsInfo;.#e
2e370 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72  ndif..  /* If cr
2e380 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  eating a master 
2e390 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75  or main-file jou
2e3a0 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74  rnal, this funct
2e3b0 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20  ion will open.  
2e3c0 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69  ** a file-descri
2e3d0 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65  ptor on the dire
2e3e0 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66  ctory too. The f
2e3f0 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79  irst time unixSy
2e400 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c  nc().  ** is cal
2e410 6c 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72  led the director
2e420 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
2e430 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28  r will be fsync(
2e440 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64  )ed and close()d
2e450 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e  ..  */.  int syn
2e460 63 44 69 72 20 3d 20 28 69 73 43 72 65 61 74 65  cDir = (isCreate
2e470 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54   && (.        eT
2e480 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2e490 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
2e4a0 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
2e4b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2e4c0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
2e4d0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2e4e0 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a  OPEN_WAL.  ));..
2e4f0 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74    /* If argument
2e500 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c   zPath is a NULL
2e510 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
2e520 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69  unction is requi
2e530 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a  red to open.  **
2e540 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2e550 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66  e. Use this buff
2e560 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  er to store the 
2e570 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20  file name in..  
2e580 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61  */.  char zTmpna
2e590 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
2e5a0 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  2];.  const char
2e5b0 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b   *zName = zPath;
2e5c0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65  ..  /* Check the
2e5d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
2e5e0 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20  ments are true: 
2e5f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29  .  **.  **   (a)
2e600 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20   Exactly one of 
2e610 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e  the READWRITE an
2e620 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73  d READONLY flags
2e630 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e   must be set, an
2e640 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66  d .  **   (b) if
2e650 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20   CREATE is set, 
2e660 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d  then READWRITE m
2e670 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c  ust also be set,
2e680 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20   and.  **   (c) 
2e690 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20  if EXCLUSIVE is 
2e6a0 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
2e6b0 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
2e6c0 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66  t..  **   (d) if
2e6d0 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69   DELETEONCLOSE i
2e6e0 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
2e6f0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
2e700 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
2e710 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d  rt((isReadonly==
2e720 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
2e730 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57  ==0) && (isReadW
2e740 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e  rite || isReadon
2e750 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ly));.  assert(i
2e760 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73  sCreate==0 || is
2e770 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73  ReadWrite);.  as
2e780 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65  sert(isExclusive
2e790 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
2e7a0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c  ;.  assert(isDel
2e7b0 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ete==0 || isCrea
2e7c0 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  te);..  /* The m
2e7d0 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75  ain DB, main jou
2e7e0 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61  rnal, WAL file a
2e7f0 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nd master journa
2e800 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a  l are never .  *
2e810 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
2e820 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65  deleted. Nor are
2e830 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f   they ever tempo
2e840 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a  rary files.  */.
2e850 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
2e860 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
2e870 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
2e880 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a  OPEN_MAIN_DB );.
2e890 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
2e8a0 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
2e8b0 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
2e8c0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2e8d0 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
2e8e0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
2e8f0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
2e900 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
2e910 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
2e920 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
2e930 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
2e940 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2e950 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  _WAL );..  /* As
2e960 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70  sert that the up
2e970 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65  per layer has se
2e980 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69  t one of the "fi
2e990 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20  le-type" flags. 
2e9a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  */.  assert( eTy
2e9b0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2e9c0 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20  MAIN_DB      || 
2e9d0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2e9e0 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20  EN_TEMP_DB .    
2e9f0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2ea00 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2ea10 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  URNAL || eType==
2ea20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
2ea30 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
2ea40 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2ea50 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
2ea60 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  L   || eType==SQ
2ea70 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
2ea80 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
2ea90 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2eaa0 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
2eab0 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  _DB || eType==SQ
2eac0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
2ead0 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  );..  memset(p, 
2eae0 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
2eaf0 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  le));..  if( eTy
2eb00 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2eb10 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55  MAIN_DB ){.    U
2eb20 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
2eb30 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65  used;.    pUnuse
2eb40 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65  d = findReusable
2eb50 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29  Fd(zName, flags)
2eb60 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73 65  ;.    if( pUnuse
2eb70 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20  d ){.      fd = 
2eb80 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20  pUnused->fd;.   
2eb90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55   }else{.      pU
2eba0 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  nused = sqlite3_
2ebb0 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
2ebc0 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20  Unused));.      
2ebd0 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a  if( !pUnused ){.
2ebe0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2ebf0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2ec00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
2ec10 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75  ->pUnused = pUnu
2ec20 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74  sed;..    /* Dat
2ec30 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20  abase filenames 
2ec40 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20  are double-zero 
2ec50 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68  terminated if th
2ec60 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a  ey are not.    *
2ec70 2a 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61  * URIs with para
2ec80 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20  meters.  Hence, 
2ec90 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20  they can always 
2eca0 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20  be passed into. 
2ecb0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72     ** sqlite3_ur
2ecc0 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a  i_parameter(). *
2ecd0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 66  /.    assert( (f
2ece0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2ecf0 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65  EN_URI) || zName
2ed00 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31  [strlen(zName)+1
2ed10 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65  ]==0 );..  }else
2ed20 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20   if( !zName ){. 
2ed30 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
2ed40 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65  s NULL, the uppe
2ed50 72 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65  r layer is reque
2ed60 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c  sting a temp fil
2ed70 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
2ed80 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 73 79  (isDelete && !sy
2ed90 6e 63 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d  ncDir);.    rc =
2eda0 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
2edb0 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 2c  (MAX_PATHNAME+2,
2edc0 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20   zTmpname);.    
2edd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ede0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2edf0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2ee00 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  zName = zTmpname
2ee10 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
2ee20 74 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ted temporary fi
2ee30 6c 65 6e 61 6d 65 73 20 61 72 65 20 61 6c 77 61  lenames are alwa
2ee40 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74  ys double-zero t
2ee50 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a  erminated.    **
2ee60 20 66 6f 72 20 75 73 65 20 62 79 20 73 71 6c 69   for use by sqli
2ee70 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
2ee80 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  r(). */.    asse
2ee90 72 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e  rt( zName[strlen
2eea0 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b  (zName)+1]==0 );
2eeb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72  .  }..  /* Deter
2eec0 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f  mine the value o
2eed0 66 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  f the flags para
2eee0 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20  meter passed to 
2eef0 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20  POSIX function. 
2ef00 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73   ** open(). Thes
2ef10 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c  e must be calcul
2ef20 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65  ated even if ope
2ef30 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
2ef40 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20  d, as.  ** they 
2ef50 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
2ef60 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c   part of the fil
2ef70 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65  e handle and use
2ef80 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27  d by the .  ** '
2ef90 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b  conch file' lock
2efa0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61  ing functions la
2efb0 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66  ter on.  */.  if
2efc0 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20  ( isReadonly )  
2efd0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
2efe0 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52  DONLY;.  if( isR
2eff0 65 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46  eadWrite ) openF
2f000 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a  lags |= O_RDWR;.
2f010 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29    if( isCreate )
2f020 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
2f030 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20   O_CREAT;.  if( 
2f040 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70  isExclusive ) op
2f050 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58  enFlags |= (O_EX
2f060 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a  CL|O_NOFOLLOW);.
2f070 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28    openFlags |= (
2f080 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49  O_LARGEFILE|O_BI
2f090 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64  NARY);..  if( fd
2f0a0 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74  <0 ){.    mode_t
2f0b0 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20   openMode;      
2f0c0 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69          /* Permi
2f0d0 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65  ssions to create
2f0e0 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20   file with */.  
2f0f0 20 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20    uid_t uid;    
2f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f110 2f 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74 68  /* Userid for th
2f120 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69  e file */.    gi
2f130 64 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20 20  d_t gid;        
2f140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
2f150 72 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20 66  roupid for the f
2f160 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ile */.    rc = 
2f170 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f  findCreateFileMo
2f180 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c  de(zName, flags,
2f190 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64   &openMode, &uid
2f1a0 2c 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28  , &gid);.    if(
2f1b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f1c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2f1d0 21 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20  !p->pUnused );. 
2f1e0 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
2f1f0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2f200 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  WAL || eType==SQ
2f210 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
2f220 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20  OURNAL );.      
2f230 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2f240 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
2f250 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65  _open(zName, ope
2f260 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65  nFlags, openMode
2f270 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
2f280 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73  "OPENX   %-3d %s
2f290 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61   0%o\n", fd, zNa
2f2a0 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b  me, openFlags));
2f2b0 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
2f2c0 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26   errno!=EISDIR &
2f2d0 26 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  & isReadWrite &&
2f2e0 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b   !isExclusive ){
2f2f0 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64  .      /* Failed
2f300 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c   to open the fil
2f310 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  e for read/write
2f320 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61   access. Try rea
2f330 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  d-only. */.     
2f340 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49   flags &= ~(SQLI
2f350 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
2f360 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
2f370 45 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65  EATE);.      ope
2f380 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44  nFlags &= ~(O_RD
2f390 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20  WR|O_CREAT);.   
2f3a0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
2f3b0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2f3c0 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67  ;.      openFlag
2f3d0 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  s |= O_RDONLY;. 
2f3e0 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20       isReadonly 
2f3f0 3d 20 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20  = 1;.      fd = 
2f400 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d  robust_open(zNam
2f410 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70  e, openFlags, op
2f420 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  enMode);.    }. 
2f430 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
2f440 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
2f450 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
2f460 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
2f470 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  en", zName);.   
2f480 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
2f490 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ished;.    }..  
2f4a0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f    /* If this pro
2f4b0 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20  cess is running 
2f4c0 61 73 20 72 6f 6f 74 20 61 6e 64 20 69 66 20 63  as root and if c
2f4d0 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 72 6f  reating a new ro
2f4e0 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f  llback.    ** jo
2f4f0 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c  urnal or WAL fil
2f500 65 2c 20 73 65 74 20 74 68 65 20 6f 77 6e 65 72  e, set the owner
2f510 73 68 69 70 20 6f 66 20 74 68 65 20 6a 6f 75 72  ship of the jour
2f520 6e 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62 65  nal or WAL to be
2f530 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  .    ** the same
2f540 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   as the original
2f550 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a   database..    *
2f560 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  /.    if( flags 
2f570 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  & (SQLITE_OPEN_W
2f580 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  AL|SQLITE_OPEN_M
2f590 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a  AIN_JOURNAL) ){.
2f5a0 20 20 20 20 20 20 6f 73 46 63 68 6f 77 6e 28 66        osFchown(f
2f5b0 64 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a 20 20  d, uid, gid);.  
2f5c0 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
2f5d0 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ( fd>=0 );.  if(
2f5e0 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20   pOutFlags ){.  
2f5f0 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66    *pOutFlags = f
2f600 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  lags;.  }..  if(
2f610 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20   p->pUnused ){. 
2f620 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66     p->pUnused->f
2f630 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70  d = fd;.    p->p
2f640 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20  Unused->flags = 
2f650 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66  flags;.  }..  if
2f660 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69  ( isDelete ){.#i
2f670 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
2f680 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a   zPath = zName;.
2f690 23 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69  #else.    osUnli
2f6a0 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69  nk(zName);.#endi
2f6b0 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  f.  }.#if SQLITE
2f6c0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2f6d0 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20  STYLE.  else{.  
2f6e0 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d    p->openFlags =
2f6f0 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a   openFlags;.  }.
2f700 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b  #endif..  noLock
2f710 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45   = eType!=SQLITE
2f720 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a  _OPEN_MAIN_DB;..
2f730 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f    .#if defined(_
2f740 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c  _APPLE__) || SQL
2f750 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2f760 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66  NG_STYLE.  if( f
2f770 73 74 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e  statfs(fd, &fsIn
2f780 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) == -1 ){.   
2f790 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69   ((unixFile*)pFi
2f7a0 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  le)->lastErrno =
2f7b0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 6f 62 75   errno;.    robu
2f7c0 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20  st_close(p, fd, 
2f7d0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72  __LINE__);.    r
2f7e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2f7f0 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20  RR_ACCESS;.  }. 
2f800 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d   if (0 == strncm
2f810 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66  p("msdos", fsInf
2f820 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
2f830 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78  5)) {.    ((unix
2f840 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73  File*)pFile)->fs
2f850 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
2f860 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
2f870 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2f880 2f 2a 20 53 65 74 20 75 70 20 61 70 70 72 6f 70  /* Set up approp
2f890 72 69 61 74 65 20 63 74 72 6c 46 6c 61 67 73 20  riate ctrlFlags 
2f8a0 2a 2f 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74  */.  if( isDelet
2f8b0 65 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  e )             
2f8c0 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
2f8d0 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b  UNIXFILE_DELETE;
2f8e0 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
2f8f0 79 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  y )             
2f900 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
2f910 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20  IXFILE_RDONLY;. 
2f920 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20 20   if( noLock )   
2f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2f940 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2f950 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69  FILE_NOLOCK;.  i
2f960 66 28 20 73 79 6e 63 44 69 72 20 29 20 20 20 20  f( syncDir )    
2f970 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
2f980 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2f990 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 69 66  LE_DIRSYNC;.  if
2f9a0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
2f9b0 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63 74 72 6c  _OPEN_URI ) ctrl
2f9c0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2f9d0 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51 4c 49  E_URI;..#if SQLI
2f9e0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2f9f0 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49  G_STYLE.#if SQLI
2fa00 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
2fa10 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f  LOCKING.  isAuto
2fa20 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69  Proxy = 1;.#endi
2fa30 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50 72  f.  if( isAutoPr
2fa40 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e  oxy && (zPath!=N
2fa50 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b  ULL) && (!noLock
2fa60 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e  ) && pVfs->xOpen
2fa70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e   ){.    char *en
2fa80 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28  vforce = getenv(
2fa90 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52  "SQLITE_FORCE_PR
2faa0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20  OXY_LOCKING");. 
2fab0 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20     int useProxy 
2fac0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c  = 0;..    /* SQL
2fad0 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
2fae0 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73  LOCKING==1 means
2faf0 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73   force always us
2fb00 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73  e proxy, 0 means
2fb10 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75   .    ** never u
2fb20 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d  se proxy, NULL m
2fb30 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66  eans use proxy f
2fb40 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  or non-local fil
2fb50 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20  es only.  */.   
2fb60 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e   if( envforce!=N
2fb70 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65  ULL ){.      use
2fb80 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76  Proxy = atoi(env
2fb90 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65  force)>0;.    }e
2fba0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 73  lse{.      if( s
2fbb0 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73  tatfs(zPath, &fs
2fbc0 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
2fbd0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65         /* In the
2fbe0 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66  ory, the close(f
2fbf0 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f  d) call is sub-o
2fc00 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66  ptimal. If the f
2fc10 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20  ile opened.     
2fc20 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73     ** with fd is
2fc30 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
2fc40 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
2fc50 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2fc60 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  s open.        *
2fc70 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74  * on that file t
2fc80 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
2fc90 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f  y holding adviso
2fca0 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a  ry locks on it,.
2fcb0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2fcc0 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73  the call to clos
2fcd0 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20  e() will cancel 
2fce0 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20  those locks. In 
2fcf0 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20  practice,.      
2fd00 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d    ** we're assum
2fd10 69 6e 67 20 74 68 61 74 20 73 74 61 74 66 73 28  ing that statfs(
2fd20 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76  ) doesn't fail v
2fd30 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65  ery often. At le
2fd40 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  ast.        ** n
2fd50 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66  ot while other f
2fd60 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2fd70 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73 61  opened by the sa
2fd80 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20  me process on.  
2fd90 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d        ** the sam
2fda0 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69  e file are worki
2fdb0 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ng.  */.        
2fdc0 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  p->lastErrno = e
2fdd0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 6f  rrno;.        ro
2fde0 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64  bust_close(p, fd
2fdf0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2fe00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2fe10 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20  _IOERR_ACCESS;. 
2fe20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e         goto open
2fe30 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20  _finished;.     
2fe40 20 7d 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78   }.      useProx
2fe50 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66  y = !(fsInfo.f_f
2fe60 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b  lags&MNT_LOCAL);
2fe70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
2fe80 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20  seProxy ){.     
2fe90 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78   rc = fillInUnix
2fea0 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70  File(pVfs, fd, p
2feb0 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72  File, zPath, ctr
2fec0 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69  lFlags);.      i
2fed0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2fee0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2fef0 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
2ff00 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c  nixFile((unixFil
2ff10 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f  e*)pFile, ":auto
2ff20 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  :");.        if(
2ff30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ff40 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  {.          /* U
2ff50 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20  se unixClose to 
2ff60 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65 73  clean up the res
2ff70 6f 75 72 63 65 73 20 61 64 64 65 64 20 69 6e 20  ources added in 
2ff80 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a  fillInUnixFile .
2ff90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
2ffa0 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73   clear all the s
2ffb0 74 72 75 63 74 75 72 65 27 73 20 72 65 66 65 72  tructure's refer
2ffc0 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66 69 63  ences.  Specific
2ffd0 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20  ally, .         
2ffe0 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68   ** pFile->pMeth
2fff0 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ods will be NULL
30000 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f   so sqlite3OsClo
30010 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d  se will be a no-
30020 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  op .          */
30030 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 43  .          unixC
30040 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  lose(pFile);.   
30050 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
30060 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30070 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f    }.      goto o
30080 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  pen_finished;.  
30090 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
300a0 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55   .  rc = fillInU
300b0 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64  nixFile(pVfs, fd
300c0 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20  , pFile, zPath, 
300d0 63 74 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70 65  ctrlFlags);..ope
300e0 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66  n_finished:.  if
300f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30100 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
30110 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b  ree(p->pUnused);
30120 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
30130 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  ;.}.../*.** Dele
30140 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a  te the file at z
30150 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72  Path. If the dir
30160 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73  Sync argument is
30170 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a   true, fsync().*
30180 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  * the directory 
30190 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74  after deleting t
301a0 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
301b0 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74  ic int unixDelet
301c0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
301d0 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f   *NotUsed,     /
301e0 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67  * VFS containing
301f0 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44 65   this as the xDe
30200 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lete method */. 
30210 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
30220 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  th,        /* Na
30230 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65  me of file to be
30240 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e   deleted */.  in
30250 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20 20  t dirSync       
30260 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
30270 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65  ue, fsync() dire
30280 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65  ctory after dele
30290 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  ting file */.){.
302a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
302b0 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50  E_OK;.  UNUSED_P
302c0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
302d0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
302e0 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
302f0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
30300 3b 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b  ;.  if( osUnlink
30310 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 29 7b  (zPath)==(-1) ){
30320 0a 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d  .    if( errno==
30330 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20  ENOENT ){.      
30340 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
30350 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 0a  R_DELETE_NOENT;.
30360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30370 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
30380 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
30390 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22  DELETE, "unlink"
303a0 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  , zPath);.    }.
303b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
303c0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
303d0 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e  E_DISABLE_DIRSYN
303e0 43 0a 20 20 69 66 28 20 28 64 69 72 53 79 6e 63  C.  if( (dirSync
303f0 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20 20 20   & 1)!=0 ){.    
30400 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d  int fd;.    rc =
30410 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   osOpenDirectory
30420 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20  (zPath, &fd);.  
30430 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30440 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58  _OK ){.#if OS_VX
30450 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20  WORKS.      if( 
30460 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a  fsync(fd)==-1 ).
30470 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  #else.      if( 
30480 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64  fsync(fd) ).#end
30490 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
304a0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
304b0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
304c0 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73  R_DIR_FSYNC, "fs
304d0 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ync", zPath);.  
304e0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75      }.      robu
304f0 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20  st_close(0, fd, 
30500 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
30510 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
30520 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
30530 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
30540 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
30550 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
30560 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  rc;.}../*.** Tes
30570 74 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20  t the existence 
30580 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72  of or access per
30590 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65  missions of file
305a0 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74   zPath. The.** t
305b0 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65  est performed de
305c0 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
305d0 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a  ue of flags:.**.
305e0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
305f0 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74  CESS_EXISTS: Ret
30600 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
30610 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20  e exists.**     
30620 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
30630 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20  ADWRITE: Return 
30640 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  1 if the file is
30650 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62   read and writab
30660 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  le..**     SQLIT
30670 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c  E_ACCESS_READONL
30680 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  Y: Return 1 if t
30690 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61  he file is reada
306a0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ble..**.** Other
306b0 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a  wise return 0..*
306c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
306d0 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74  xAccess(.  sqlit
306e0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
306f0 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f     /* The VFS co
30700 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41  ntaining this xA
30710 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a  ccess method */.
30720 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
30730 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74  ath,      /* Pat
30740 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  h of the file to
30750 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e   examine */.  in
30760 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
30770 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f        /* What do
30780 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72   we want to lear
30790 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74  n about the zPat
307a0 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74  h file? */.  int
307b0 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20   *pResOut       
307c0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
307d0 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72  sult boolean her
307e0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d  e */.){.  int am
307f0 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45  ode = 0;.  UNUSE
30800 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
30810 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  sed);.  Simulate
30820 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
30830 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
30840 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63 68  ESS; );.  switch
30850 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63  ( flags ){.    c
30860 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
30870 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20  S_EXISTS:.      
30880 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20  amode = F_OK;.  
30890 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
308a0 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
308b0 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20  S_READWRITE:.   
308c0 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c     amode = W_OK|
308d0 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  R_OK;.      brea
308e0 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
308f0 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a  TE_ACCESS_READ:.
30900 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f        amode = R_
30910 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
30920 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
30930 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e       assert(!"In
30940 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75  valid flags argu
30950 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70  ment");.  }.  *p
30960 52 65 73 4f 75 74 20 3d 20 28 6f 73 41 63 63 65  ResOut = (osAcce
30970 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29  ss(zPath, amode)
30980 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  ==0);.  if( flag
30990 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53  s==SQLITE_ACCESS
309a0 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52 65 73  _EXISTS && *pRes
309b0 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  Out ){.    struc
309c0 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
309d0 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50  if( 0==osStat(zP
309e0 61 74 68 2c 20 26 62 75 66 29 20 26 26 20 62 75  ath, &buf) && bu
309f0 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a  f.st_size==0 ){.
30a00 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d        *pResOut =
30a10 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
30a20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30a30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  ;.}.../*.** Turn
30a40 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
30a50 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
30a60 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72   pathname. The r
30a70 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20  elative path.** 
30a80 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e  is stored as a n
30a90 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
30aa0 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66  ring in the buff
30ab0 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
30ac0 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a  .** zPath. .**.*
30ad0 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f  * zOut points to
30ae0 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
30af0 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66  least sqlite3_vf
30b00 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  s.mxPathname byt
30b10 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20  es .** (in this 
30b20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41  case, MAX_PATHNA
30b30 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20 66  ME bytes). The f
30b40 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74  ull-path is writ
30b50 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62  ten to.** this b
30b60 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74  uffer before ret
30b70 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
30b80 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61  c int unixFullPa
30b90 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
30ba0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
30bb0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
30bc0 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
30bd0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
30be0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
30bf0 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
30c00 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
30c10 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75  ath */.  int nOu
30c20 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
30c30 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
30c40 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
30c50 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
30c60 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
30c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
30c80 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
30c90 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  ){..  /* It's od
30ca0 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
30cb0 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
30cc0 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
30cd0 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
30ce0 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
30cf0 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
30d00 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
30d10 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
30d20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
30d30 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63  iling. This func
30d40 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20  tion could fail 
30d50 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  if, for example,
30d60 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
30d70 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  t working direct
30d80 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c  ory has been unl
30d90 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69  inked..  */.  Si
30da0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
30db0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
30dc0 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  OR );..  assert(
30dd0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
30de0 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e==MAX_PATHNAME 
30df0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
30e00 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20  METER(pVfs);..  
30e10 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27  zOut[nOut-1] = '
30e20 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  \0';.  if( zPath
30e30 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [0]=='/' ){.    
30e40 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
30e50 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73  (nOut, zOut, "%s
30e60 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  ", zPath);.  }el
30e70 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64  se{.    int nCwd
30e80 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 63  ;.    if( osGetc
30e90 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29  wd(zOut, nOut-1)
30ea0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
30eb0 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
30ec0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
30ed0 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c  _BKPT, "getcwd",
30ee0 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20   zPath);.    }. 
30ef0 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29 73     nCwd = (int)s
30f00 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20  trlen(zOut);.   
30f10 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
30f20 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f  f(nOut-nCwd, &zO
30f30 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c  ut[nCwd], "/%s",
30f40 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72   zPath);.  }.  r
30f50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30f60 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
30f70 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
30f80 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
30f90 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
30fa0 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
30fb0 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
30fc0 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
30fd0 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
30fe0 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
30ff0 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
31000 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e   library..*/.#in
31010 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a  clude <dlfcn.h>.
31020 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69  static void *uni
31030 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  xDlOpen(sqlite3_
31040 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f  vfs *NotUsed, co
31050 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
31060 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ame){.  UNUSED_P
31070 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
31080 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70  );.  return dlop
31090 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54  en(zFilename, RT
310a0 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c  LD_NOW | RTLD_GL
310b0 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  OBAL);.}../*.** 
310c0 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
310d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64  s function immed
310e0 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63  iately after a c
310f0 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d  all to unixDlSym
31100 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f  () or.** unixDlO
31110 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74  pen() fails (ret
31120 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  urns a null poin
31130 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20  ter). If a more 
31140 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a  detailed error.*
31150 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61  * message is ava
31160 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72  ilable, it is wr
31170 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74  itten to zBufOut
31180 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65  . If no error me
31190 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69  ssage.** is avai
311a0 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69  lable, zBufOut i
311b0 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
311c0 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65  d and SQLite use
311d0 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65  s a default.** e
311e0 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f  rror message..*/
311f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
31200 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  xDlError(sqlite3
31210 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
31220 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
31230 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74  BufOut){.  const
31240 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55   char *zErr;.  U
31250 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
31260 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78  NotUsed);.  unix
31270 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
31280 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29  zErr = dlerror()
31290 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a  ;.  if( zErr ){.
312a0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
312b0 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f  intf(nBuf, zBufO
312c0 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b  ut, "%s", zErr);
312d0 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
312e0 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69  Mutex();.}.stati
312f0 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53  c void (*unixDlS
31300 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ym(sqlite3_vfs *
31310 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70  NotUsed, void *p
31320 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79  , const char*zSy
31330 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20  m))(void){.  /* 
31340 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d  .  ** GCC with -
31350 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20  pedantic-errors 
31360 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64 6f  says that C90 do
31370 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76  es not allow a v
31380 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20  oid* to be.  ** 
31390 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e  cast into a poin
313a0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
313b0 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65 20  n.  And yet the 
313c0 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20  library dlsym() 
313d0 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74  routine.  ** ret
313e0 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69  urns a void* whi
313f0 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70  ch is really a p
31400 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
31410 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f  tion.  So how do
31420 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73   we.  ** use dls
31430 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e  ym() with -pedan
31440 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a  tic-errors?.  **
31450 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78  .  ** Variable x
31460 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65   below is define
31470 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65  d to be a pointe
31480 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
31490 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61  taking.  ** para
314a0 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64  meters void* and
314b0 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64   const char* and
314c0 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69   returning a poi
314d0 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
314e0 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74  on..  ** We init
314f0 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69  ialize x by assi
31500 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74  gning it a point
31510 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28  er to the dlsym(
31520 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ) function..  **
31530 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e   (That assignmen
31540 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73  t requires a cas
31550 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c  t.)  Then we cal
31560 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74  l the function t
31570 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74  hat.  ** x point
31580 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  s to.  .  **.  *
31590 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75  * This work-arou
315a0 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74  nd is unlikely t
315b0 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  o work correctly
315c0 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77   on any system w
315d0 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65  here.  ** you re
315e0 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74  ally cannot cast
315f0 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e   a function poin
31600 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20  ter into void*. 
31610 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68   But then, on th
31620 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e  e.  ** other han
31630 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20  d, dlsym() will 
31640 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68  not work on such
31650 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65 72   a system either
31660 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a  , so we have.  *
31670 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73  * not really los
31680 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  t anything..  */
31690 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76  .  void (*(*x)(v
316a0 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
316b0 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53  ))(void);.  UNUS
316c0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
316d0 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f  Used);.  x = (vo
316e0 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f  id(*(*)(void*,co
316f0 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64  nst char*))(void
31700 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72  ))dlsym;.  retur
31710 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b  n (*x)(p, zSym);
31720 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
31730 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  nixDlClose(sqlit
31740 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
31750 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
31760 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
31770 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
31780 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29  dlclose(pHandle)
31790 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ;.}.#else /* if 
317a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
317b0 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65  _EXTENSION is de
317c0 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66  fined: */.  #def
317d0 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20  ine unixDlOpen  
317e0 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
317f0 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66  DlError 0.  #def
31800 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20  ine unixDlSym   
31810 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
31820 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
31830 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42  ../*.** Write nB
31840 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64  uf bytes of rand
31850 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73  om data to the s
31860 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a  upplied buffer z
31870 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Buf..*/.static i
31880 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73  nt unixRandomnes
31890 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  s(sqlite3_vfs *N
318a0 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
318b0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
318c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
318d0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73  R(NotUsed);.  as
318e0 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75  sert((size_t)nBu
318f0 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f  f>=(sizeof(time_
31900 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29  t)+sizeof(int)))
31910 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  ;..  /* We have 
31920 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42  to initialize zB
31930 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61  uf to prevent va
31940 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f  lgrind from repo
31950 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72  rting.  ** error
31960 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20  s.  The reports 
31970 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69  issued by valgri
31980 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74  nd are incorrect
31990 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a   - we would.  **
319a0 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65   prefer that the
319b0 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69   randomness be i
319c0 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69  ncreased by maki
319d0 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20  ng use of the.  
319e0 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ** uninitialized
319f0 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d   space in zBuf -
31a00 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72   but valgrind er
31a10 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72  rors tend to wor
31a20 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65  ry.  ** some use
31a30 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e  rs.  Rather than
31a40 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73   argue, it seems
31a50 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20   easier just to 
31a60 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20  initialize.  ** 
31a70 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20  the whole array 
31a80 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67  and silence valg
31a90 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68  rind, even if th
31aa0 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61  at means less ra
31ab0 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e  ndomness.  ** in
31ac0 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64   the random seed
31ad0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
31ae0 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61   testing, initia
31af0 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f  lizing zBuf[] to
31b00 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20   zero is all we 
31b10 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a  do.  That means.
31b20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77    ** that we alw
31b30 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ays use the same
31b40 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73   random number s
31b50 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d  equence.  This m
31b60 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65  akes the.  ** te
31b70 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a  sts repeatable..
31b80 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42    */.  memset(zB
31b90 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69  uf, 0, nBuf);.#i
31ba0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
31bb0 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20  E_TEST).  {.    
31bc0 69 6e 74 20 70 69 64 2c 20 66 64 2c 20 67 6f 74  int pid, fd, got
31bd0 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  ;.    fd = robus
31be0 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61  t_open("/dev/ura
31bf0 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c  ndom", O_RDONLY,
31c00 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c   0);.    if( fd<
31c10 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f  0 ){.      time_
31c20 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28  t t;.      time(
31c30 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  &t);.      memcp
31c40 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65  y(zBuf, &t, size
31c50 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69  of(t));.      pi
31c60 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20  d = getpid();.  
31c70 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
31c80 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69  [sizeof(t)], &pi
31c90 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b  d, sizeof(pid));
31ca0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
31cb0 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28  izeof(t)+sizeof(
31cc0 70 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42  pid)<=(size_t)nB
31cd0 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66  uf );.      nBuf
31ce0 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73   = sizeof(t) + s
31cf0 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20 20  izeof(pid);.    
31d00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b  }else{.      do{
31d10 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66 64   got = osRead(fd
31d20 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d  , zBuf, nBuf); }
31d30 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20  while( got<0 && 
31d40 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
31d50 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
31d60 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(0, fd, __LINE
31d70 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  __);.    }.  }.#
31d80 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e  endif.  return n
31d90 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  Buf;.}.../*.** S
31da0 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
31db0 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
31dc0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
31dd0 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68  ime slept..** Th
31de0 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
31df0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
31e00 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74  oseconds we want
31e10 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68   to sleep..** Th
31e20 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
31e30 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
31e40 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20  microseconds of 
31e50 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a  sleep actually.*
31e60 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  * requested from
31e70 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
31e80 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
31e90 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68  , a number which
31ea0 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65  .** might be gre
31eb0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
31ec0 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65  al to the argume
31ed0 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73  nt, but not less
31ee0 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67  .** than the arg
31ef0 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
31f00 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73   int unixSleep(s
31f10 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
31f20 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  sed, int microse
31f30 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56  conds){.#if OS_V
31f40 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
31f50 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20  timespec sp;..  
31f60 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72  sp.tv_sec = micr
31f70 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30  oseconds / 10000
31f80 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63  00;.  sp.tv_nsec
31f90 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
31fa0 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31 30   % 1000000) * 10
31fb0 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28  00;.  nanosleep(
31fc0 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e  &sp, NULL);.  UN
31fd0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
31fe0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
31ff0 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a  n microseconds;.
32000 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
32010 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41  VE_USLEEP) && HA
32020 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65  VE_USLEEP.  usle
32030 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29  ep(microseconds)
32040 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
32050 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
32060 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
32070 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  onds;.#else.  in
32080 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63  t seconds = (mic
32090 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39  roseconds+999999
320a0 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65  )/1000000;.  sle
320b0 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55  ep(seconds);.  U
320c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
320d0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
320e0 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30  rn seconds*10000
320f0 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  00;.#endif.}../*
32100 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
32110 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
32120 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
32130 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72   value, is inter
32140 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65  preted as.** the
32150 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e   number of secon
32160 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e  ds since 1970 an
32170 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74  d is used to set
32180 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
32190 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  * sqlite3OsCurre
321a0 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20  ntTime() during 
321b0 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
321c0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
321d0 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
321e0 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a  nt_time = 0;  /*
321f0 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d   Fake system tim
32200 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e  e in seconds sin
32210 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64  ce 1970. */.#end
32220 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
32230 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
32240 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
32250 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
32260 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
32270 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  Now.** the curre
32280 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
32290 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
322a0 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36   number times 86
322b0 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a  _400_000.  In.**
322c0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72   other words, wr
322d0 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20  ite into *piNow 
322e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
322f0 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  lliseconds since
32300 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65   the Julian.** e
32310 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20  poch of noon in 
32320 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76  Greenwich on Nov
32330 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42  ember 24, 4714 B
32340 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  .C according to 
32350 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63  the.** proleptic
32360 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e   Gregorian calen
32370 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  dar..**.** On su
32380 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51  ccess, return SQ
32390 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e  LITE_OK.  Return
323a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
323b0 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
323c0 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  te .** cannot be
323d0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
323e0 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
323f0 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
32400 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
32410 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
32420 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63  piNow){.  static
32430 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
32440 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d  nt64 unixEpoch =
32450 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74   24405875*(sqlit
32460 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
32470 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
32480 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69  ITE_OK;.#if defi
32490 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20  ned(NO_GETTOD). 
324a0 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d   time_t t;.  tim
324b0 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  e(&t);.  *piNow 
324c0 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ((sqlite3_int6
324d0 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78  4)t)*1000 + unix
324e0 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f  Epoch;.#elif OS_
324f0 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
32500 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a   timespec sNow;.
32510 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28    clock_gettime(
32520 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20  CLOCK_REALTIME, 
32530 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77  &sNow);.  *piNow
32540 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
32550 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
32560 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
32570 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30   sNow.tv_nsec/10
32580 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73  00000;.#else.  s
32590 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e  truct timeval sN
325a0 6f 77 3b 0a 20 20 69 66 28 20 67 65 74 74 69 6d  ow;.  if( gettim
325b0 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29  eofday(&sNow, 0)
325c0 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f  ==0 ){.    *piNo
325d0 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20  w = unixEpoch + 
325e0 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
325f0 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20  t64)sNow.tv_sec 
32600 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31  + sNow.tv_usec/1
32610 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  000;.  }else{.  
32620 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
32630 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ROR;.  }.#endif.
32640 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
32650 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
32660 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
32670 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31  {.    *piNow = 1
32680 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
32690 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65  64)sqlite3_curre
326a0 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70  nt_time + unixEp
326b0 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  och;.  }.#endif.
326c0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
326d0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
326e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
326f0 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
32700 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
32710 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
32720 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
32730 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
32740 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
32750 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
32760 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
32770 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
32780 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
32790 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
327a0 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
327b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
327c0 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28  unixCurrentTime(
327d0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
327e0 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72  Used, double *pr
327f0 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Now){.  sqlite3_
32800 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69  int64 i = 0;.  i
32810 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f  nt rc;.  UNUSED_
32820 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
32830 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43  d);.  rc = unixC
32840 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
32850 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77  0, &i);.  *prNow
32860 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b   = i/86400000.0;
32870 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
32880 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64 20  ./*.** We added 
32890 74 68 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f  the xGetLastErro
328a0 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68 20  r() method with 
328b0 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66  the intention of
328c0 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65   providing.** be
328d0 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65  tter low-level e
328e0 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68  rror messages wh
328f0 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73  en operating-sys
32900 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d  tem problems com
32910 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53  e up.** during S
32920 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e  QLite operation.
32930 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f    But so far, no
32940 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73 20 62  ne of that has b
32950 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  een implemented.
32960 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e 20  ** in the core. 
32970 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   So this routine
32980 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
32990 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69  .  For now, it i
329a0 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c  s merely.** a pl
329b0 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73  ace-holder..*/.s
329c0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
329d0 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
329e0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
329f0 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63   int NotUsed2, c
32a00 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a  har *NotUsed3){.
32a10 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
32a20 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55  ER(NotUsed);.  U
32a30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
32a40 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55  NotUsed2);.  UNU
32a50 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
32a60 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72  tUsed3);.  retur
32a70 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a  n 0;.}.../*.****
32a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32a90 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69  **** End of sqli
32aa0 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20  te3_vfs methods 
32ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
32ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
32b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
32b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32b80 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72  ******* Begin Pr
32b90 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  oxy Locking ****
32ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
32bc0 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
32bd0 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b   is a "uber-lock
32be0 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  ing-method" in t
32bf0 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75  his sense:  It u
32c00 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72  ses the.** other
32c10 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
32c20 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f   on secondary lo
32c30 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79  ck files.  Proxy
32c40 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a   locking is a.**
32c50 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72   meta-layer over
32c60 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d   top of the prim
32c70 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d  itive locking im
32c80 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e  plemented above.
32c90 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65    For.** this re
32ca0 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69  ason, the divisi
32cb0 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  on that implemen
32cc0 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b  ts of proxy lock
32cd0 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 0a  ing is deferred.
32ce0 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e  ** until late in
32cf0 20 74 68 65 20 66 69 6c 65 20 28 68 65 72 65 29   the file (here)
32d00 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68   after all of th
32d10 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68  e other I/O meth
32d20 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  ods have.** been
32d30 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68   defined - so th
32d40 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65  at the primitive
32d50 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
32d60 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   are available.*
32d70 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74 6f  * as services to
32d80 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20 69   help with the i
32d90 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
32da0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a   proxy locking..
32db0 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  **.****.**.** Th
32dc0 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
32dd0 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c  g schemes in SQL
32de0 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e  ite use byte-ran
32df0 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a  ge locks on the.
32e00 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
32e10 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73   to coordinate s
32e20 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  afe, concurrent 
32e30 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70  access by multip
32e40 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e  le readers.** an
32e50 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a  d writers [http:
32e60 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63  //sqlite.org/loc
32e70 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54  kingv3.html].  T
32e80 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63  he five file loc
32e90 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28  king.** states (
32ea0 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e  UNLOCKED, PENDIN
32eb0 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  G, SHARED, RESER
32ec0 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20  VED, EXCLUSIVE) 
32ed0 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  are implemented.
32ee0 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61 64  ** as POSIX read
32ef0 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f   & write locks o
32f00 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f 66  ver fixed set of
32f10 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20   locations (via 
32f20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46  fsctl),.** on AF
32f30 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65  P and SMB only e
32f40 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61  xclusive byte-ra
32f50 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76  nge locks are av
32f60 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74  ailable via fsct
32f70 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28  l.** with _IOWR(
32f80 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20  'z', 23, struct 
32f90 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
32fa0 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73  ) to track the s
32fb0 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a  ame 5 states..**
32fc0 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46   To simulate a F
32fd0 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68  _RDLCK on the sh
32fe0 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41  ared range, on A
32ff0 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65  FP a randomly se
33000 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73  lected.** addres
33010 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  s in the shared 
33020 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
33030 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  or a SHARED lock
33040 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20  , the entire.** 
33050 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20  shared range is 
33060 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43  taken for an EXC
33070 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a  LUSIVE lock):.**
33080 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47  .**      PENDING
33090 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78 34  _BYTE        0x4
330a0 30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20 20 20  0000000.**      
330b0 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20  RESERVED_BYTE   
330c0 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a      0x40000001.*
330d0 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41  *      SHARED_RA
330e0 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30  NGE        0x400
330f0 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30  00002 -> 0x40000
33100 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  200.**.** This w
33110 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65  orks well on the
33120 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74   local file syst
33130 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20  em, but shows a 
33140 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73  nearly 100x.** s
33150 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20  lowdown in read 
33160 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41  performance on A
33170 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41  FP because the A
33180 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c  FP client disabl
33190 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63  es.** the read c
331a0 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72  ache when byte-r
331b0 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70  ange locks are p
331c0 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e  resent.  Enablin
331d0 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61  g the read.** ca
331e0 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61  che exposes a ca
331f0 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72  che coherency pr
33200 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72  oblem that is pr
33210 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20  esent on all OS 
33220 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e  X.** supported n
33230 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74  etwork file syst
33240 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46  ems.  NFS and AF
33250 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74  P both observe t
33260 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f  he.** close-to-o
33270 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f  pen semantics fo
33280 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65  r ensuring cache
33290 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68   coherency.** [h
332a0 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65  ttp://nfs.source
332b0 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61  forge.net/#faq_a
332c0 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e  8], which does n
332d0 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a  ot effectively.*
332e0 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65  * address the re
332f0 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63  quirements for c
33300 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  oncurrent databa
33310 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c  se access by mul
33320 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73  tiple.** readers
33330 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20   and writers.** 
33340 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62  [http://www.nabb
33350 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e  le.com/SQLite-on
33360 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72  -NFS-cache-coher
33370 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e  ency-td15655701.
33380 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  html]..**.** To 
33390 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66  address the perf
333a0 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68  ormance and cach
333b0 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75  e coherency issu
333c0 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c  es, proxy file l
333d0 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  ocking.** change
333e0 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61  s the way databa
333f0 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e  se access is con
33400 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74  trolled by limit
33410 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a  ing access to a.
33420 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61  ** single host a
33430 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76  t a time and mov
33440 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f  ing file locks o
33450 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ff of the databa
33460 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f  se file.** and o
33470 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65  nto a proxy file
33480 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69   on the local fi
33490 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a  le system.  .**.
334a0 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78  **.** Using prox
334b0 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d  y locks.** -----
334c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
334d0 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20  ** C APIs.**.** 
334e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
334f0 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65  ntrol(db, dbname
33500 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  , SQLITE_SET_LOC
33510 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20  KPROXYFILE,.**  
33520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33530 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68       <proxy_path
33540 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a  > | ":auto:");.*
33550 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
33560 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
33570 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  me, SQLITE_GET_L
33580 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c  OCKPROXYFILE, &<
33590 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a  proxy_path>);.**
335a0 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d  .**.** SQL pragm
335b0 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41  as.**.**  PRAGMA
335c0 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
335d0 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f  _proxy_file=<pro
335e0 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f  xy_path> | :auto
335f0 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  :.**  PRAGMA [da
33600 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
33610 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70  xy_file.**.** Sp
33620 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a  ecifying ":auto:
33630 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20  " means that if 
33640 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68  there is a conch
33650 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74   file with a mat
33660 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44  ching.** host ID
33670 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78   in it, the prox
33680 79 20 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f  y path in the co
33690 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nch file will be
336a0 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65   used, otherwise
336b0 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68  .** a proxy path
336c0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73   based on the us
336d0 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a  er's temp dir.**
336e0 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43   (via confstr(_C
336f0 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
33700 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c  MP_DIR,...)) wil
33710 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20 74 68  l be used and th
33720 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78  e.** actual prox
33730 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67  y file name is g
33740 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68  enerated from th
33750 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20  e name and path 
33760 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
33770 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78  se file.  For ex
33780 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
33790 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65 20     For database 
337a0 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f  path "/Users/me/
337b0 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20  foo.db" .**     
337c0 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20    The lock path 
337d0 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72  will be "<tmpdir
337e0 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f  >/sqliteplocks/_
337f0 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a  Users_me_foo.db:
33800 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e  auto:").**.** On
33810 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20  ce a lock proxy 
33820 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  is configured fo
33830 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  r a database con
33840 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20  nection, it can 
33850 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65  not.** be remove
33860 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61  d, however it ma
33870 79 20 62 65 20 73 77 69 74 63 68 65 64 20 74 6f  y be switched to
33880 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f   a different pro
33890 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74  xy path via.** t
338a0 68 65 20 61 62 6f 76 65 20 41 50 49 73 20 28 61  he above APIs (a
338b0 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63  ssuming the conc
338c0 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65  h file is not be
338d0 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74  ing held by anot
338e0 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  her.** connectio
338f0 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a  n or process). .
33900 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f  **.**.** How pro
33910 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  xy locking works
33920 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
33930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
33940 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63  * Proxy file loc
33950 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d  king relies prim
33960 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77  arily on two new
33970 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65   supporting file
33980 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63  s: .**.**   *  c
33990 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d  onch file to lim
339a0 69 74 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  it access to the
339b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
339c0 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a  o a single host.
339d0 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74 69 6d  **      at a tim
339e0 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f  e.**.**   *  pro
339f0 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61  xy file to act a
33a00 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68  s a proxy for th
33a10 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  e advisory locks
33a20 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20   normally.**    
33a30 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64    taken on the d
33a40 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68  atabase.**.** Th
33a50 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74  e conch file - t
33a60 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20 66 69  o use a proxy fi
33a70 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20  le, sqlite must 
33a80 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20  first "hold the 
33a90 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b  conch".** by tak
33aa0 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74  ing an sqlite-st
33ab0 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  yle shared lock 
33ac0 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  on the conch fil
33ad0 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a  e, reading the.*
33ae0 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63  * contents and c
33af0 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73  omparing the hos
33b00 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20  t's unique host 
33b10 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61  ID (see below) a
33b20 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79  nd lock.** proxy
33b30 20 70 61 74 68 20 61 67 61 69 6e 73 74 20 74 68   path against th
33b40 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  e values stored 
33b50 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54  in the conch.  T
33b60 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73  he conch file is
33b70 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68  .** stored in th
33b80 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
33b90 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65   as the database
33ba0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
33bb0 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61  le name.** is pa
33bc0 74 74 65 72 6e 65 64 20 61 66 74 65 72 20 74 68  tterned after th
33bd0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
33be0 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62  name as ".<datab
33bf0 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e  asename>-conch".
33c00 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68  .** If the conch
33c10 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
33c20 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f  xist, or it's co
33c30 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  ntents do not ma
33c40 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20  tch the.** host 
33c50 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20  ID and/or proxy 
33c60 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c  path, then the l
33c70 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64  ock is escalated
33c80 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
33c90 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65  .** lock and the
33ca0 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
33cb0 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64 20  ents is updated 
33cc0 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49 44  with the host ID
33cd0 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61   and proxy.** pa
33ce0 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  th and the lock 
33cf0 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  is downgraded to
33d00 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
33d10 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f  gain.  If the co
33d20 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62  nch.** is held b
33d30 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  y another proces
33d40 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65 64  s (with a shared
33d50 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c   lock), the excl
33d60 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69  usive lock.** wi
33d70 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49  ll fail and SQLI
33d80 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
33d90 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ned..**.** The p
33da0 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69  roxy file - a si
33db0 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75  ngle-byte file u
33dc0 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69  sed for all advi
33dd0 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a  sory file locks.
33de0 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65  ** normally take
33df0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
33e00 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61  e file.   This a
33e10 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73  llows for safe s
33e20 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65  haring.** of the
33e30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
33e40 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  or multiple read
33e50 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 20  ers and writers 
33e60 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68  on the same.** h
33e70 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65  ost (the conch e
33e80 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 79  nsures that they
33e90 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d   all use the sam
33ea0 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
33eb0 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73  e)..**.** Reques
33ec0 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72  ting the lock pr
33ed0 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d  oxy does not imm
33ee0 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68  ediately take th
33ef0 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a  e conch, it is.*
33f00 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65  * only taken whe
33f10 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  n the first requ
33f20 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61  est to lock data
33f30 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64  base file is mad
33f40 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74  e.  .** This mat
33f50 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69  ches the semanti
33f60 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69 74  cs of the tradit
33f70 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65  ional locking be
33f80 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a  havior, where.**
33f90 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65   opening a conne
33fa0 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62  ction to a datab
33fb0 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  ase file does no
33fc0 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e  t take a lock on
33fd0 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72   it..** The shar
33fe0 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f  ed lock and an o
33ff0 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
34000 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e  tor are maintain
34010 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65  ed until .** the
34020 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
34030 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
34040 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  losed. .**.** Th
34050 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64  e proxy file and
34060 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
34070 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64  re never deleted
34080 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65   so they only ne
34090 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61  ed.** to be crea
340a0 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74 69  ted the first ti
340b0 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65 64  me they are used
340c0 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ..**.** Configur
340d0 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a  ation options.**
340e0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
340f0 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51  ------.**.**  SQ
34100 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
34110 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20  Y_LOCKING.**.** 
34120 20 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66        Database f
34130 69 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e  iles accessed on
34140 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20   non-local file 
34150 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20  systems are.**  
34160 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c       automatical
34170 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ly configured fo
34180 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c  r proxy locking,
34190 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a   lock files are.
341a0 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61  **       named a
341b0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69  utomatically usi
341c0 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69  ng the same logi
341d0 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52  c as.**       PR
341e0 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f  AGMA lock_proxy_
341f0 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a  file=":auto:".**
34200 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f      .**  SQLITE_
34210 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a  PROXY_DEBUG.**.*
34220 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20  *       Enables 
34230 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65  the logging of e
34240 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75  rror messages du
34250 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c  ring host id fil
34260 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69  e.**       retri
34270 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f  eval and creatio
34280 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f  n.**.**  LOCKPRO
34290 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20  XYDIR.**.**     
342a0 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65 20    Overrides the 
342b0 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72  default director
342c0 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20  y used for lock 
342d0 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74  proxy files that
342e0 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61  .**       are na
342f0 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  med automaticall
34300 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f  y via the ":auto
34310 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a  :" setting.**.**
34320 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
34330 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
34340 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20  SIONS.**.**     
34350 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f    Permissions to
34360 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74 69   use when creati
34370 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 66  ng a directory f
34380 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a  or storing the.*
34390 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f  *       lock pro
343a0 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75  xy files, only u
343b0 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f  sed when LOCKPRO
343c0 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74  XYDIR is not set
343d0 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a  ..**    .**    .
343e0 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20  ** As mentioned 
343f0 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70  above, when comp
34400 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45  iled with SQLITE
34410 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
34420 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e  CKING,.** settin
34430 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e  g the environmen
34440 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54  t variable SQLIT
34450 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
34460 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a  CKING to 1 will.
34470 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c  ** force proxy l
34480 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65  ocking to be use
34490 64 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  d for every data
344a0 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64  base file opened
344b0 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20  , and 0.** will 
344c0 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20  force automatic 
344d0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f  proxy locking to
344e0 20 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72   be disabled for
344f0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a   all database.**
34500 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74   files (explicit
34510 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51  y calling the SQ
34520 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
34530 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72  XYFILE pragma or
34540 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f  .** sqlite_file_
34550 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e  control API is n
34560 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53  ot affected by S
34570 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
34580 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a  Y_LOCKING)..*/..
34590 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  /*.** Proxy lock
345a0 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
345b0 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20  lable on MacOSX 
345c0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
345d0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
345e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
345f0 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a  ING_STYLE../*.**
34600 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   The proxyLockin
34610 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65  gContext has the
34620 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73   path and file s
34630 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68  tructures for th
34640 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64  e remote .** and
34650 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c   local proxy fil
34660 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65  es in it.*/.type
34670 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79  def struct proxy
34680 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70  LockingContext p
34690 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
346a0 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79  xt;.struct proxy
346b0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
346c0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
346d0 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  chFile;         
346e0 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69  /* Open conch fi
346f0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f  le */.  char *co
34700 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20  nchFilePath;    
34710 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
34720 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  the conch file *
34730 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f  /.  unixFile *lo
34740 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20  ckProxy;        
34750 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c   /* Open proxy l
34760 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
34770 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74  ar *lockProxyPat
34780 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  h;         /* Na
34790 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20  me of the proxy 
347a0 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
347b0 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
347c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
347d0 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ame of the open 
347e0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  file */.  int co
347f0 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20  nchHeld;        
34800 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74         /* 1 if t
34810 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64  he conch is held
34820 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73  , -1 if lockless
34830 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c   */.  void *oldL
34840 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
34850 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c     /* Original l
34860 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f  ockingcontext to
34870 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73   restore on clos
34880 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
34890 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
348a0 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20  *pOldMethod;    
348b0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f   /* Original I/O
348c0 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f   methods for clo
348d0 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a  se */.};../* .**
348e0 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   The proxy lock 
348f0 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68  file path for th
34900 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64 62  e database at db
34910 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20  Path is written 
34920 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20  into lPath, .** 
34930 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74  which must point
34940 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61   to valid, writa
34950 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65  ble memory large
34960 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61   enough for a ma
34970 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66  xLen length.** f
34980 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74  ile path. .*/.st
34990 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
349a0 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20  tLockPath(const 
349b0 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68  char *dbPath, ch
349c0 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f  ar *lPath, size_
349d0 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74  t maxLen){.  int
349e0 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65   len;.  int dbLe
349f0 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66  n;.  int i;..#if
34a00 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  def LOCKPROXYDIR
34a10 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79  .  len = strlcpy
34a20 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58  (lPath, LOCKPROX
34a30 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23  YDIR, maxLen);.#
34a40 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53  else.# ifdef _CS
34a50 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
34a60 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66  P_DIR.  {.    if
34a70 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44  ( !confstr(_CS_D
34a80 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f  ARWIN_USER_TEMP_
34a90 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c  DIR, lPath, maxL
34aa0 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  en) ){.      OST
34ab0 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41  RACE(("GETLOCKPA
34ac0 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65 72  TH  failed %s er
34ad0 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22  rno=%d pid=%d\n"
34ae0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
34af0 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 67   lPath, errno, g
34b00 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20  etpid()));.     
34b10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
34b20 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  OERR_LOCK;.    }
34b30 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  .    len = strlc
34b40 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74  at(lPath, "sqlit
34b50 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e  eplocks", maxLen
34b60 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73  );    .  }.# els
34b70 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  e.  len = strlcp
34b80 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22  y(lPath, "/tmp/"
34b90 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64  , maxLen);.# end
34ba0 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  if.#endif..  if(
34bb0 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27   lPath[len-1]!='
34bc0 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20  /' ){.    len = 
34bd0 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
34be0 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d  /", maxLen);.  }
34bf0 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f  .  .  /* transfo
34c00 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20 74  rm the db path t
34c10 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68 65  o a unique cache
34c20 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e   name */.  dbLen
34c30 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64   = (int)strlen(d
34c40 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69  bPath);.  for( i
34c50 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28  =0; i<dbLen && (
34c60 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61  i+len+7)<(int)ma
34c70 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  xLen; i++){.    
34c80 63 68 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b  char c = dbPath[
34c90 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b  i];.    lPath[i+
34ca0 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f  len] = (c=='/')?
34cb0 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61  '_':c;.  }.  lPa
34cc0 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a  th[i+len]='\0';.
34cd0 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c    strlcat(lPath,
34ce0 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65   ":auto:", maxLe
34cf0 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  n);.  OSTRACE(("
34d00 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f  GETLOCKPATH  pro
34d10 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
34d20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68  pid=%d\n", lPath
34d30 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
34d40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
34d50 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65  ;.}../* . ** Cre
34d60 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66 69  ates the lock fi
34d70 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73 69  le and any missi
34d80 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 69  ng directories i
34d90 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73  n lockPath. */.s
34da0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
34db0 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f  reateLockPath(co
34dc0 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61  nst char *lockPa
34dd0 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65  th){.  int i, le
34de0 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d 41  n;.  char buf[MA
34df0 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74  XPATHLEN];.  int
34e00 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20   start = 0;.  . 
34e10 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74 68   assert(lockPath
34e20 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72  !=NULL);.  /* tr
34e30 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c 20  y to create all 
34e40 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
34e50 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a   directories */.
34e60 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72    len = (int)str
34e70 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20  len(lockPath);. 
34e80 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61   buf[0] = lockPa
34e90 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d  th[0];.  for( i=
34ea0 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b  1; i<len; i++ ){
34eb0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74  .    if( lockPat
34ec0 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28  h[i] == '/' && (
34ed0 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29  i - start > 0) )
34ee0 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20  {.      /* only 
34ef0 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64 69  mkdir if leaf di
34f00 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20  r != "." or "/" 
34f10 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20  or ".." */.     
34f20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20 7c   if( i-start>2 |
34f30 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 26  | (i-start==1 &&
34f40 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
34f50 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  .' && buf[start]
34f60 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20 20   != '/') .      
34f70 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d     || (i-start==
34f80 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  2 && buf[start] 
34f90 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74  != '.' && buf[st
34fa0 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29  art+1] != '.') )
34fb0 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69 5d  {.        buf[i]
34fc0 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 69  ='\0';.        i
34fd0 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66 2c 20  f( osMkdir(buf, 
34fe0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
34ff0 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
35000 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ONS) ){.        
35010 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b    int err=errno;
35020 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
35030 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20  rr!=EEXIST ) {. 
35040 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41             OSTRA
35050 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50  CE(("CREATELOCKP
35060 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65 61  ATH  FAILED crea
35070 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20  ting %s, ".     
35080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35090 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b  "'%s' proxy lock
350a0 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
350b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
350c0 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73 74           buf, st
350d0 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63  rerror(err), loc
350e0 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29  kPath, getpid())
350f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
35100 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20  eturn err;.     
35110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
35120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
35130 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a  tart=i+1;.    }.
35140 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63      buf[i] = loc
35150 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20  kPath[i];.  }.  
35160 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45  OSTRACE(("CREATE
35170 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20  LOCKPATH  proxy 
35180 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
35190 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68  =%d\n", lockPath
351a0 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
351b0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
351c0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
351d0 56 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70  VFS file descrip
351e0 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d  tor (stored in m
351f0 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
35200 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  rom.** sqlite3_m
35210 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20  alloc) and open 
35220 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22  the file named "
35230 70 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c  path" in the fil
35240 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a  e descriptor..**
35250 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69  .** The caller i
35260 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f  s responsible no
35270 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69  t only for closi
35280 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ng the file desc
35290 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c  riptor.** but al
352a0 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  so for freeing t
352b0 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  he memory associ
352c0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
352d0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
352e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
352f0 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65  xyCreateUnixFile
35300 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  (.    const char
35310 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f   *path,        /
35320 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e  * path for the n
35330 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20  ew unixFile */. 
35340 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70     unixFile **pp
35350 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75  File,       /* u
35360 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20  nixFile created 
35370 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20  and returned by 
35380 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ref */.    int i
35390 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20  slockfile       
353a0 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65      /* if non ze
353b0 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20  ro missing dirs 
353c0 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
353d0 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20  */.) {.  int fd 
353e0 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65  = -1;.  unixFile
353f0 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63   *pNew;.  int rc
35400 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
35410 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
35420 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54  O_RDWR | O_CREAT
35430 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
35440 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20  dummyVfs;.  int 
35450 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e  terrno = 0;.  Un
35460 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
35470 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f  sed = NULL;..  /
35480 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79 20 74  * 1. first try t
35490 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68  o open/create th
354a0 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69  e file.  ** 2. i
354b0 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e  f that fails, an
354c0 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b  d this is a lock
354d0 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68   file (not-conch
354e0 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a  ), try creating.
354f0 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20    ** the parent 
35500 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20  directories and 
35510 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a  then try again..
35520 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20    ** 3. if that 
35530 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70  fails, try to op
35540 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61 64  en the file read
35550 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72  -only.  ** other
35560 77 69 73 65 20 72 65 74 75 72 6e 20 42 55 53 59  wise return BUSY
35570 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20   (if lock file) 
35580 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20  or CANTOPEN for 
35590 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20  the conch file. 
355a0 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20   */.  pUnused = 
355b0 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70  findReusableFd(p
355c0 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b  ath, openFlags);
355d0 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29  .  if( pUnused )
355e0 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73  {.    fd = pUnus
355f0 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b  ed->fd;.  }else{
35600 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73  .    pUnused = s
35610 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
35620 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b  zeof(*pUnused));
35630 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65  .    if( !pUnuse
35640 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  d ){.      retur
35650 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
35660 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
35670 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d  fd<0 ){.    fd =
35680 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
35690 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29  h, openFlags, 0)
356a0 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65  ;.    terrno = e
356b0 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64  rrno;.    if( fd
356c0 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f  <0 && errno==ENO
356d0 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c  ENT && islockfil
356e0 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
356f0 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61  roxyCreateLockPa
35700 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49  th(path) == SQLI
35710 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35720 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
35730 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  n(path, openFlag
35740 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  s, 0);.      }. 
35750 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
35760 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46  d<0 ){.    openF
35770 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  lags = O_RDONLY;
35780 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
35790 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
357a0 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74  Flags, 0);.    t
357b0 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  errno = errno;. 
357c0 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
357d0 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66  .    if( islockf
357e0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ile ){.      ret
357f0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
35800 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
35810 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20  h (terrno) {.   
35820 20 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a     case EACCES:.
35830 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
35840 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
35850 20 20 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20    case EIO: .   
35860 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
35870 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f  TE_IOERR_LOCK; /
35880 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  * even though it
35890 20 69 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f   is the conch */
358a0 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
358b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
358c0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
358d0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  KPT;.    }.  }. 
358e0 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78   .  pNew = (unix
358f0 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d  File *)sqlite3_m
35900 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e  alloc(sizeof(*pN
35910 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ew));.  if( pNew
35920 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63  ==NULL ){.    rc
35930 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
35940 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72  .    goto end_cr
35950 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a  eate_proxy;.  }.
35960 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
35970 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
35980 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65  e));.  pNew->ope
35990 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
359a0 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75  gs;.  memset(&du
359b0 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f  mmyVfs, 0, sizeo
359c0 66 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20  f(dummyVfs));.  
359d0 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74  dummyVfs.pAppDat
359e0 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f  a = (void*)&auto
359f0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20  lockIoFinder;.  
35a00 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d  dummyVfs.zName =
35a10 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75   "dummy";.  pUnu
35a20 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  sed->fd = fd;.  
35a30 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d  pUnused->flags =
35a40 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e   openFlags;.  pN
35a50 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55  ew->pUnused = pU
35a60 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d  nused;.  .  rc =
35a70 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
35a80 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 28  &dummyVfs, fd, (
35a90 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e  sqlite3_file*)pN
35aa0 65 77 2c 20 70 61 74 68 2c 20 30 29 3b 0a 20 20  ew, path, 0);.  
35ab0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35ac0 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65  K ){.    *ppFile
35ad0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74   = pNew;.    ret
35ae0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
35af0 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72   }.end_create_pr
35b00 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62 75 73  oxy:    .  robus
35b10 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64  t_close(pNew, fd
35b20 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73  , __LINE__);.  s
35b30 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
35b40 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
35b50 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65  e(pUnused);.  re
35b60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
35b70 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
35b80 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69  * simulate multi
35b90 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65  ple hosts by cre
35ba0 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73  ating unique hos
35bb0 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a  tid file paths *
35bc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f  /.int sqlite3_ho
35bd0 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65  stid_num = 0;.#e
35be0 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50 52  ndif..#define PR
35bf0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20  OXY_HOSTIDLEN   
35c00 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   16  /* conch fi
35c10 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67 74  le host id lengt
35c20 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77  h */../* Not alw
35c30 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74  ays defined in t
35c40 68 65 20 68 65 61 64 65 72 73 20 61 73 20 69 74  he headers as it
35c50 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a   ought to be */.
35c60 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 68 6f  extern int getho
35c70 73 74 75 75 69 64 28 75 75 69 64 5f 74 20 69 64  stuuid(uuid_t id
35c80 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74  , const struct t
35c90 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29 3b 0a  imespec *wait);.
35ca0 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74  ./* get the host
35cb0 20 49 44 20 76 69 61 20 67 65 74 68 6f 73 74 75   ID via gethostu
35cc0 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d  uid(), pHostID m
35cd0 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f  ust point to PRO
35ce0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a  XY_HOSTIDLEN .**
35cf0 20 62 79 74 65 73 20 6f 66 20 77 72 69 74 61 62   bytes of writab
35d00 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  le memory..*/.st
35d10 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
35d20 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 64  tHostID(unsigned
35d30 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20   char *pHostID, 
35d40 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20  int *pError){.  
35d50 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53  assert(PROXY_HOS
35d60 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66  TIDLEN == sizeof
35d70 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d  (uuid_t));.  mem
35d80 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c 20  set(pHostID, 0, 
35d90 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
35da0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ;.#if defined(__
35db0 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAX_OS_X_VERSION
35dc0 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 29 5c 0a  _MIN_REQUIRED)\.
35dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
35de0 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52  & __MAC_OS_X_VER
35df0 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45  SION_MIN_REQUIRE
35e00 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20 20 20 73  D<1050.  {.    s
35e10 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
35e20 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65  ct timespec time
35e30 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a  out = {1, 0}; /*
35e40 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a   1 sec timeout *
35e50 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68 6f 73  /.    if( gethos
35e60 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26  tuuid(pHostID, &
35e70 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20  timeout) ){.    
35e80 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
35e90 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 72  o;.      if( pEr
35ea0 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ror ){.        *
35eb0 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20  pError = err;.  
35ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
35ed0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
35ee0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
35ef0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
35f00 54 45 52 28 70 45 72 72 6f 72 29 3b 0a 23 65 6e  TER(pError);.#en
35f10 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
35f20 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75  E_TEST.  /* simu
35f30 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f  late multiple ho
35f40 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  sts by creating 
35f50 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69  unique hostid fi
35f60 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66  le paths */.  if
35f70 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  ( sqlite3_hostid
35f80 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20  _num != 0){.    
35f90 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68  pHostID[0] = (ch
35fa0 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b  ar)(pHostID[0] +
35fb0 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f   (char)(sqlite3_
35fc0 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46  hostid_num & 0xF
35fd0 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  F));.  }.#endif.
35fe0 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
35ff0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  TE_OK;.}../* The
36000 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
36010 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c  ains the header,
36020 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63   host id and loc
36030 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a  k file path. */.
36040 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f  #define PROXY_CO
36050 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f  NCHVERSION 2   /
36060 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c  * 1-byte header,
36070 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64   16-byte host id
36080 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e  , path */.#defin
36090 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  e PROXY_HEADERLE
360a0 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63  N    1   /* conc
360b0 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65  h file header le
360c0 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ngth */.#define 
360d0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
360e0 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52     (PROXY_HEADER
360f0 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
36100 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f  LEN).#define PRO
36110 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20  XY_MAXCONCHLEN  
36120 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
36130 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
36140 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a  +MAXPATHLEN)../*
36150 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70   .** Takes an op
36160 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63  en conch file, c
36170 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  opies the conten
36180 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68  ts to a new path
36190 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20   and then moves 
361a0 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68  .** it back.  Th
361b0 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  e newly created 
361c0 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63  file's file desc
361d0 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e  riptor is assign
361e0 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ed to the.** con
361f0 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  ch file structur
36200 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68  e and finally th
36210 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68  e original conch
36220 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
36230 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20   is .** closed. 
36240 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   Returns zero if
36250 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a   successful..*/.
36260 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
36270 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75  BreakConchLock(u
36280 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
36290 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29  uuid_t myHostID)
362a0 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
362b0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
362c0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
362d0 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
362e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
362f0 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
36300 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
36310 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74  chFile;.  char t
36320 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
36330 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f  ;.  char buf[PRO
36340 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
36350 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d  .  char *cPath =
36360 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
36370 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72  Path;.  size_t r
36380 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69  eadLen = 0;.  si
36390 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30  ze_t pathLen = 0
363a0 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b  ;.  char errmsg[
363b0 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20  64] = "";.  int 
363c0 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72  fd = -1;.  int r
363d0 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44  c = -1;.  UNUSED
363e0 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73  _PARAMETER(myHos
363f0 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61  tID);..  /* crea
36400 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62 79  te a new path by
36410 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72 61   replace the tra
36420 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77  iling '-conch' w
36430 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a  ith '-break' */.
36440 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c    pathLen = strl
36450 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74 68  cpy(tPath, cPath
36460 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
36470 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58   if( pathLen>MAX
36480 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c  PATHLEN || pathL
36490 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73  en<6 || .     (s
364a0 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61  trlcpy(&tPath[pa
364b0 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b  thLen-5], "break
364c0 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20  ", 6) != 5) ){. 
364d0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
364e0 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
364f0 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20  g),errmsg,"path 
36500 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
36510 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20  (int)pathLen);. 
36520 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
36530 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20  klock;.  }.  /* 
36540 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63  read the conch c
36550 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64  ontent */.  read
36560 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f  Len = osPread(co
36570 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c  nchFile->h, buf,
36580 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
36590 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65  EN, 0);.  if( re
365a0 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48  adLen<PROXY_PATH
365b0 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c  INDEX ){.    sql
365c0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
365d0 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72  zeof(errmsg),err
365e0 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20  msg,"read error 
365f0 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72  (len %d)",(int)r
36600 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74  eadLen);.    got
36610 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
36620 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20  .  }.  /* write 
36630 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65  it out to the te
36640 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69  mporary break fi
36650 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62  le */.  fd = rob
36660 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20  ust_open(tPath, 
36670 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c  (O_RDWR|O_CREAT|
36680 4f 5f 45 58 43 4c 29 2c 20 30 29 3b 0a 20 20 69  O_EXCL), 0);.  i
36690 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73  f( fd<0 ){.    s
366a0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
366b0 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20  sizeof(errmsg), 
366c0 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20  errmsg, "create 
366d0 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
366e0 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
366f0 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
36700 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74 65  }.  if( osPwrite
36710 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c 65  (fd, buf, readLe
36720 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65 5f  n, 0) != (ssize_
36730 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20  t)readLen ){.   
36740 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
36750 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
36760 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74 65  , errmsg, "write
36770 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
36780 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
36790 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
367a0 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28   }.  if( rename(
367b0 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b  tPath, cPath) ){
367c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
367d0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
367e0 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 72  msg), errmsg, "r
367f0 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64  ename failed (%d
36800 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
36810 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
36820 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ck;.  }.  rc = 0
36830 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  ;.  fprintf(stde
36840 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65  rr, "broke stale
36850 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20   lock on %s\n", 
36860 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73 74  cPath);.  robust
36870 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f  _close(pFile, co
36880 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  nchFile->h, __LI
36890 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69  NE__);.  conchFi
368a0 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f  le->h = fd;.  co
368b0 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  nchFile->openFla
368c0 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f  gs = O_RDWR | O_
368d0 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61  CREAT;..end_brea
368e0 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63 20  klock:.  if( rc 
368f0 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30  ){.    if( fd>=0
36900 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69   ){.      osUnli
36910 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20  nk(tPath);.     
36920 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
36930 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  ile, fd, __LINE_
36940 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  _);.    }.    fp
36950 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
36960 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73  ailed to break s
36970 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c  tale lock on %s,
36980 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65   %s\n", cPath, e
36990 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65  rrmsg);.  }.  re
369a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
369b0 61 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65  ake the requeste
369c0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
369d0 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65  nch file and bre
369e0 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20  ak a stale lock 
369f0 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20  if the .** host 
36a00 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73  id matches..*/.s
36a10 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
36a20 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  onchLock(unixFil
36a30 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74  e *pFile, uuid_t
36a40 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c   myHostID, int l
36a50 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78  ockType){.  prox
36a60 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
36a70 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
36a80 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
36a90 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
36aa0 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c  text; .  unixFil
36ab0 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
36ac0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
36ad0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
36ae0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69  E_OK;.  int nTri
36af0 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  es = 0;.  struct
36b00 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d   timespec conchM
36b10 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d  odTime;.  .  mem
36b20 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54 69 6d  set(&conchModTim
36b30 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6f 6e  e, 0, sizeof(con
36b40 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20 20 64  chModTime));.  d
36b50 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e  o {.    rc = con
36b60 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
36b70 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
36b80 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
36b90 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20   lockType);.    
36ba0 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69  nTries ++;.    i
36bb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
36bc0 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  SY ){.      /* I
36bd0 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65  f the lock faile
36be0 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20 20  d (busy):.      
36bf0 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74 20   * 1st try: get 
36c00 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20  the mod time of 
36c10 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74 20  the conch, wait 
36c20 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67 61  0.5s and try aga
36c30 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32 6e  in. .       * 2n
36c40 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20 74  d try: fail if t
36c50 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e  he mod time chan
36c60 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20 69  ged or host id i
36c70 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61 69  s different, wai
36c80 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20 20  t .       *     
36c90 20 20 20 20 20 20 31 30 20 73 65 63 20 61 6e 64        10 sec and
36ca0 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20 20   try again.     
36cb0 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72 65    * 3rd try: bre
36cc0 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65  ak the lock unle
36cd0 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  ss the mod time 
36ce0 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20  has changed..   
36cf0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72      */.      str
36d00 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
36d10 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
36d20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62  conchFile->h, &b
36d30 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  uf) ){.        p
36d40 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
36d50 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
36d60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
36d70 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
36d80 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
36d90 69 66 28 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b  if( nTries==1 ){
36da0 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f  .        conchMo
36db0 64 54 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d  dTime = buf.st_m
36dc0 74 69 6d 65 73 70 65 63 3b 0a 20 20 20 20 20 20  timespec;.      
36dd0 20 20 75 73 6c 65 65 70 28 35 30 30 30 30 30 29    usleep(500000)
36de0 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35 20 73 65  ; /* wait 0.5 se
36df0 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f  c and try the lo
36e00 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20  ck again*/.     
36e10 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20     continue;  . 
36e20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
36e30 73 65 72 74 28 20 6e 54 72 69 65 73 3e 31 20 29  sert( nTries>1 )
36e40 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63  ;.      if( conc
36e50 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65 63 20  hModTime.tv_sec 
36e60 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73  != buf.st_mtimes
36e70 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20  pec.tv_sec || . 
36e80 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64          conchMod
36e90 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20  Time.tv_nsec != 
36ea0 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
36eb0 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20  .tv_nsec ){.    
36ec0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
36ed0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a  E_BUSY;.      }.
36ee0 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
36ef0 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a   nTries==2 ){  .
36f00 20 20 20 20 20 20 20 20 63 68 61 72 20 74 42 75          char tBu
36f10 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  f[PROXY_MAXCONCH
36f20 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e  LEN];.        in
36f30 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28  t len = osPread(
36f40 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42  conchFile->h, tB
36f50 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
36f60 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20  CHLEN, 0);.     
36f70 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a     if( len<0 ){.
36f80 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
36f90 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
36fa0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  no;.          re
36fb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
36fc0 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  R_LOCK;.        
36fd0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  }.        if( le
36fe0 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  n>PROXY_PATHINDE
36ff0 58 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63  X && tBuf[0]==(c
37000 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
37010 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20  ERSION){.       
37020 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61     /* don't brea
37030 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68  k the lock if th
37040 65 20 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27  e host id doesn'
37050 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  t match */.     
37060 20 20 20 20 20 69 66 28 20 30 21 3d 6d 65 6d 63       if( 0!=memc
37070 6d 70 28 26 74 42 75 66 5b 50 52 4f 58 59 5f 48  mp(&tBuf[PROXY_H
37080 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73  EADERLEN], myHos
37090 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49  tID, PROXY_HOSTI
370a0 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  DLEN) ){.       
370b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
370c0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
370d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
370e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
370f0 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65   don't break the
37100 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72   lock on short r
37110 65 61 64 20 6f 72 20 61 20 76 65 72 73 69 6f 6e  ead or a version
37120 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20   mismatch */.   
37130 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
37140 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
37150 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 73 6c     }.        usl
37160 65 65 70 28 31 30 30 30 30 30 30 30 29 3b 20 2f  eep(10000000); /
37170 2a 20 77 61 69 74 20 31 30 20 73 65 63 20 61 6e  * wait 10 sec an
37180 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61  d try the lock a
37190 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  gain */.        
371a0 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20 20  continue; .     
371b0 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
371c0 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3d 3d  assert( nTries==
371d0 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  3 );.      if( 0
371e0 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63  ==proxyBreakConc
371f0 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
37200 6f 73 74 49 44 29 20 29 7b 0a 20 20 20 20 20 20  ostID) ){.      
37210 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
37220 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f  ;.        if( lo
37230 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  ckType==EXCLUSIV
37240 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
37250 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
37260 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
37270 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
37280 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41  *)conchFile, SHA
37290 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20  RED_LOCK);      
372a0 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20      .        }. 
372b0 20 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29         if( !rc )
372c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
372d0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
372e0 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
372f0 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
37300 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  ile, lockType);.
37310 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37320 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c  }.    }.  } whil
37330 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
37340 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33 20 29  SY && nTries<3 )
37350 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63  ;.  .  return rc
37360 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68  ;.}../* Takes th
37370 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e  e conch by takin
37380 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  g a shared lock 
37390 61 6e 64 20 72 65 61 64 20 74 68 65 20 63 6f 6e  and read the con
373a0 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66 20  tents conch, if 
373b0 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73 20  .** lockPath is 
373c0 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f  non-NULL, the ho
373d0 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66  st ID and lock f
373e0 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20 6d 61  ile path must ma
373f0 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a  tch.  A NULL .**
37400 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73 20   lockPath means 
37410 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50 61 74  that the lockPat
37420 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  h in the conch f
37430 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ile will be used
37440 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74   if the .** host
37450 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72 20 61   IDs match, or a
37460 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68 20 77   new lock path w
37470 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
37480 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
37490 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e 20 74  ** and written t
374a0 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  o the conch file
374b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
374c0 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 75  proxyTakeConch(u
374d0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
374e0 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
374f0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
37500 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
37510 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
37520 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20  kingContext; .  
37530 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e  .  if( pCtx->con
37540 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20  chHeld!=0 ){.   
37550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
37560 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
37570 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
37580 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
37590 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f  hFile;.    uuid_
375a0 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20 20  t myHostID;.    
375b0 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a  int pError = 0;.
375c0 20 20 20 20 63 68 61 72 20 72 65 61 64 42 75 66      char readBuf
375d0 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c  [PROXY_MAXCONCHL
375e0 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f  EN];.    char lo
375f0 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  ckPath[MAXPATHLE
37600 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 65  N];.    char *te
37610 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c  mpLockPath = NUL
37620 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  L;.    int rc = 
37630 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69  SQLITE_OK;.    i
37640 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d  nt createConch =
37650 20 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73 74   0;.    int host
37660 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  IdMatch = 0;.   
37670 20 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20 30   int readLen = 0
37680 3b 0a 20 20 20 20 69 6e 74 20 74 72 79 4f 6c 64  ;.    int tryOld
37690 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20  LockPath = 0;.  
376a0 20 20 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f    int forceNewLo
376b0 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20  ckPath = 0;.    
376c0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
376d0 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72  AKECONCH  %d for
376e0 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63   %s pid=%d\n", c
376f0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  onchFile->h,.   
37700 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d            (pCtx-
37710 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f  >lockProxyPath ?
37720 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
37730 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29  Path : ":auto:")
37740 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20  , getpid()));.. 
37750 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47 65 74     rc = proxyGet
37760 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49 44 2c  HostID(myHostID,
37770 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 69   &pError);.    i
37780 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51  f( (rc&0xff)==SQ
37790 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
377a0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
377b0 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20  rrno = pError;. 
377c0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
377d0 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20  keconch;.    }. 
377e0 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e     rc = proxyCon
377f0 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79  chLock(pFile, my
37800 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44 5f 4c  HostID, SHARED_L
37810 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
37820 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
37830 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
37840 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20  keconch;.    }. 
37850 20 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 65     /* read the e
37860 78 69 73 74 69 6e 67 20 63 6f 6e 63 68 20 66 69  xisting conch fi
37870 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65  le */.    readLe
37880 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  n = seekAndRead(
37890 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68  (unixFile*)conch
378a0 46 69 6c 65 2c 20 30 2c 20 72 65 61 64 42 75 66  File, 0, readBuf
378b0 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
378c0 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28 20 72 65  LEN);.    if( re
378d0 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20  adLen<0 ){.     
378e0 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c   /* I/O error: l
378f0 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
37900 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20  seekAndRead */. 
37910 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
37920 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c  Errno = conchFil
37930 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
37940 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
37950 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 20 20  IOERR_READ;.    
37960 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
37970 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20  onch;.    }else 
37980 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52  if( readLen<=(PR
37990 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52  OXY_HEADERLEN+PR
379a0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c  OXY_HOSTIDLEN) |
379b0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
379c0 72 65 61 64 42 75 66 5b 30 5d 21 3d 28 63 68 61  readBuf[0]!=(cha
379d0 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52  r)PROXY_CONCHVER
379e0 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a  SION ){.      /*
379f0 20 61 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72   a short read or
37a00 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20   version format 
37a10 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e 73 20 77  mismatch means w
37a20 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  e need to create
37a30 20 61 20 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a   a new .      **
37a40 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20   conch file. .  
37a50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 72 65      */.      cre
37a60 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20  ateConch = 1;.  
37a70 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20 74 68    }.    /* if th
37a80 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65  e host id matche
37a90 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70  s and the lock p
37aa0 61 74 68 20 61 6c 72 65 61 64 79 20 65 78 69 73  ath already exis
37ab0 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a  ts in the conch.
37ac0 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79      ** we'll try
37ad0 20 74 6f 20 75 73 65 20 74 68 65 20 70 61 74 68   to use the path
37ae0 20 74 68 65 72 65 2c 20 69 66 20 77 65 20 63 61   there, if we ca
37af0 6e 27 74 20 6f 70 65 6e 20 74 68 61 74 20 70 61  n't open that pa
37b00 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a  th, we'll .    *
37b10 2a 20 72 65 74 72 79 20 77 69 74 68 20 61 20 6e  * retry with a n
37b20 65 77 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65  ew auto-generate
37b30 64 20 70 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20  d path .    */. 
37b40 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61     do { /* in ca
37b50 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 74 72  se we need to tr
37b60 79 20 61 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a  y again for an :
37b70 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b  auto: named lock
37b80 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20   file */..      
37b90 69 66 28 20 21 63 72 65 61 74 65 43 6f 6e 63 68  if( !createConch
37ba0 20 26 26 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63   && !forceNewLoc
37bb0 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  kPath ){.       
37bc0 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 21   hostIdMatch = !
37bd0 6d 65 6d 63 6d 70 28 26 72 65 61 64 42 75 66 5b  memcmp(&readBuf[
37be0 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d  PROXY_HEADERLEN]
37bf0 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20 20 20  , myHostID, .   
37c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
37c20 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b  ROXY_HOSTIDLEN);
37c30 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74  .        /* if t
37c40 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64 61 74  he conch has dat
37c50 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 6f  a compare the co
37c60 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ntents */.      
37c70 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63    if( !pCtx->loc
37c80 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
37c90 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 20 61          /* for a
37ca0 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20  uto-named local 
37cb0 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20  lock file, just 
37cc0 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74 20 49  check the host I
37cd0 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20  D and we'll.    
37ce0 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 74 68         ** use th
37cf0 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
37d00 65 20 70 61 74 68 20 74 68 61 74 27 73 20 61 6c  e path that's al
37d10 72 65 61 64 79 20 69 6e 20 74 68 65 72 65 0a 20  ready in there. 
37d20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
37d30 20 20 20 20 20 20 20 69 66 28 20 68 6f 73 74 49         if( hostI
37d40 64 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  dMatch ){.      
37d50 20 20 20 20 20 20 73 69 7a 65 5f 74 20 70 61 74        size_t pat
37d60 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20  hLen = (readLen 
37d70 2d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  - PROXY_PATHINDE
37d80 58 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  X);.            
37d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
37da0 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54   pathLen>=MAXPAT
37db0 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  HLEN ){.        
37dc0 20 20 20 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41        pathLen=MA
37dd0 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20  XPATHLEN-1;.    
37de0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37df0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63        memcpy(loc
37e00 6b 50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b  kPath, &readBuf[
37e10 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
37e20 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20  , pathLen);.    
37e30 20 20 20 20 20 20 20 20 6c 6f 63 6b 50 61 74 68          lockPath
37e40 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20  [pathLen] = 0;. 
37e50 20 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 4c             tempL
37e60 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61  ockPath = lockPa
37e70 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  th;.            
37e80 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d  tryOldLockPath =
37e90 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
37ea0 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70 79  /* create a copy
37eb0 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74   of the lock pat
37ec0 68 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69  h if the conch i
37ed0 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20  s taken */.     
37ee0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
37ef0 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20  takeconch;.     
37f00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
37f10 65 6c 73 65 20 69 66 28 20 68 6f 73 74 49 64 4d  else if( hostIdM
37f20 61 74 63 68 0a 20 20 20 20 20 20 20 20 20 20 20  atch.           
37f30 20 20 20 20 26 26 20 21 73 74 72 6e 63 6d 70 28      && !strncmp(
37f40 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
37f50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52  ath, &readBuf[PR
37f60 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a  OXY_PATHINDEX],.
37f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f80 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64 4c             readL
37f90 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  en-PROXY_PATHIND
37fa0 45 58 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  EX).        ){. 
37fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63           /* conc
37fc0 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20  h host and lock 
37fd0 70 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20  path match */.  
37fe0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
37ff0 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20  _takeconch; .   
38000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
38010 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 69       .      /* i
38020 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27  f the conch isn'
38030 74 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20 64  t writable and d
38040 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c 20 77 65  oesn't match, we
38050 20 63 61 6e 27 74 20 74 61 6b 65 20 69 74 20 2a   can't take it *
38060 2f 0a 20 20 20 20 20 20 69 66 28 20 28 63 6f 6e  /.      if( (con
38070 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67  chFile->openFlag
38080 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 20 29  s&O_RDWR) == 0 )
38090 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
380a0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
380b0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
380c0 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a  econch;.      }.
380d0 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
380e0 65 69 74 68 65 72 20 74 68 65 20 63 6f 6e 63 68  either the conch
380f0 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20 6f 72   didn't match or
38100 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
38110 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a  te a new one */.
38120 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d        if( !pCtx-
38130 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
38140 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 47  {.        proxyG
38150 65 74 4c 6f 63 6b 50 61 74 68 28 70 43 74 78 2d  etLockPath(pCtx-
38160 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74  >dbPath, lockPat
38170 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
38180 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b          tempLock
38190 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b  Path = lockPath;
381a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61  .        /* crea
381b0 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  te a copy of the
381c0 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79   lock path _only
381d0 5f 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69  _ if the conch i
381e0 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20  s taken */.     
381f0 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
38200 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63 68 20  /* update conch 
38210 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20 70 61  with host and pa
38220 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20 66 61  th (this will fa
38230 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72 6f 63  il if other proc
38240 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ess.      ** has
38250 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
38260 6c 72 65 61 64 79 29 2c 20 69 66 20 74 68 65 20  lready), if the 
38270 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2c  host id matches,
38280 20 75 73 65 20 74 68 65 20 62 69 67 0a 20 20 20   use the big.   
38290 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20     ** stick..   
382a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 75 74 69     */.      futi
382b0 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  mes(conchFile->h
382c0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69  , NULL);.      i
382d0 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20 26  f( hostIdMatch &
382e0 26 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 29  & !createConch )
382f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
38300 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  nchFile->pInode 
38310 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49  && conchFile->pI
38320 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
38330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
38340 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
38350 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
38360 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
38370 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
38380 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d            ** sam
38390 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
383a0 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
383b0 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
383c0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
383d0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
383e0 20 7d 20 65 6c 73 65 20 7b 20 20 20 20 20 20 20   } else {       
383f0 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 72 63     .          rc
38400 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63   = proxyConchLoc
38410 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49  k(pFile, myHostI
38420 44 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  D, EXCLUSIVE_LOC
38430 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  K);.        }.  
38440 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
38450 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
38460 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
38470 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
38480 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c  )conchFile, EXCL
38490 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
384a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
384b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
384c0 20 20 20 20 20 20 20 20 63 68 61 72 20 77 72 69          char wri
384d0 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d  teBuffer[PROXY_M
384e0 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20  AXCONCHLEN];.   
384f0 20 20 20 20 20 69 6e 74 20 77 72 69 74 65 53 69       int writeSi
38500 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ze = 0;.        
38510 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 42 75  .        writeBu
38520 66 66 65 72 5b 30 5d 20 3d 20 28 63 68 61 72 29  ffer[0] = (char)
38530 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
38540 4f 4e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ON;.        memc
38550 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b  py(&writeBuffer[
38560 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d  PROXY_HEADERLEN]
38570 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58  , myHostID, PROX
38580 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20  Y_HOSTIDLEN);.  
38590 20 20 20 20