/ Hex Artifact Content
Login

Artifact 6b74fa8300c2db55a143155371405ab49ae6afdf:


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 0a 23 69 66 20 53 51 4c 49 54  no.h>..#if SQLIT
1140: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1150: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1160: 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23   <sys/ioctl.h>.#
1170: 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23   if OS_VXWORKS.#
1180: 20 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70    include <semap
1190: 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75  hore.h>.#  inclu
11a0: 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 20  de <limits.h>.# 
11b0: 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64 65 20  else.#  include 
11c0: 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23 20 20  <sys/file.h>.#  
11d0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61 72  include <sys/par
11e0: 61 6d 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65  am.h>.#  include
11f0: 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23   <sys/mount.h>.#
1200: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a   endif.#endif /*
1210: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1220: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
1230: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
1240: 46 53 46 4c 41 47 53 5f 49 53 5f 52 45 41 44 4f  FSFLAGS_IS_READO
1250: 4e 4c 59 20 20 30 78 31 0a 23 64 65 66 69 6e 65  NLY  0x1.#define
1260: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
1270: 49 53 5f 4c 4f 43 41 4c 20 20 20 20 20 30 78 32  IS_LOCAL     0x2
1280: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
1290: 46 53 46 4c 41 47 53 5f 49 53 5f 48 46 53 50 4c  FSFLAGS_IS_HFSPL
12a0: 55 53 20 20 20 30 78 34 0a 23 64 65 66 69 6e 65  US   0x4.#define
12b0: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
12c0: 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78 38  IS_MSDOS     0x8
12d0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
12e0: 46 53 46 4c 41 47 53 5f 49 4e 49 54 49 41 4c 49  FSFLAGS_INITIALI
12f0: 5a 45 44 20 20 20 20 20 30 78 31 30 30 30 30 0a  ZED     0x10000.
1300: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
1310: 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73  e to be thread-s
1320: 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65  afe, include the
1330: 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72   pthreads header
1340: 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74   and define.** t
1350: 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  he SQLITE_UNIX_T
1360: 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f  HREADS macro..*/
1370: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
1380: 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65  ADSAFE.# include
1390: 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64   <pthread.h>.# d
13a0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49  efine SQLITE_UNI
13b0: 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64  X_THREADS 1.#end
13c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c  if../*.** Defaul
13d0: 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68  t permissions wh
13e0: 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65  en creating a ne
13f0: 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65  w file.*/.#ifnde
1400: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1410: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1420: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1430: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
1440: 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a  ERMISSIONS 0644.
1450: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2a 20 44  #endif../*. ** D
1460: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1470: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1480: 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a   auto proxy dir.
1490: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
14a0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
14b0: 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a  DIR_PERMISSIONS.
14c0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
14d0: 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
14e0: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35  _PERMISSIONS 075
14f0: 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  5.#endif../*.** 
1500: 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  Maximum supporte
1510: 64 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a  d path-length..*
1520: 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41  /.#define MAX_PA
1530: 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a  THNAME 512../*.*
1540: 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c  * Only set the l
1550: 61 73 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20  astErrno if the 
1560: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20  error code is a 
1570: 72 65 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e  real error and n
1580: 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20  ot .** a normal 
1590: 65 78 70 65 63 74 65 64 20 72 65 74 75 72 6e 20  expected return 
15a0: 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42  code of SQLITE_B
15b0: 55 53 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b  USY or SQLITE_OK
15c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c  .*/.#define IS_L
15d0: 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28  OCK_ERROR(x)  ((
15e0: 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20  x != SQLITE_OK) 
15f0: 26 26 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f  && (x != SQLITE_
1600: 42 55 53 59 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 53  BUSY)).../*.** S
1610: 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72 20  ometimes, after 
1620: 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 73  a file handle is
1630: 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69 74   closed by SQLit
1640: 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  e, the file desc
1650: 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74  riptor.** cannot
1660: 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64   be closed immed
1670: 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73 65  iately. In these
1680: 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63 65   cases, instance
1690: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
16a0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  ng.** structure 
16b0: 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  are used to stor
16c0: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
16d0: 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69 74  iptor while wait
16e0: 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70  ing for an.** op
16f0: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69 74  portunity to eit
1700: 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65 75  her close or reu
1710: 73 65 20 69 74 2e 0a 2a 2f 0a 74 79 70 65 64 65  se it..*/.typede
1720: 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75  f struct UnixUnu
1730: 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65 64  sedFd UnixUnused
1740: 46 64 3b 0a 73 74 72 75 63 74 20 55 6e 69 78 55  Fd;.struct UnixU
1750: 6e 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74 20  nusedFd {.  int 
1760: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
1770: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
1780: 73 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f 73  scriptor to clos
1790: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
17a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17b0: 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20 66   /* Flags this f
17c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
17d0: 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20 2a  as opened with *
17e0: 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  /.  UnixUnusedFd
17f0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a   *pNext;      /*
1800: 20 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69 6c   Next unused fil
1810: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
1820: 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  same file */.};.
1830: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46  ./*.** The unixF
1840: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ile structure is
1850: 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c   subclass of sql
1860: 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69 66  ite3_file specif
1870: 69 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a 2a  ic to the unix.*
1880: 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61  * VFS implementa
1890: 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64 65  tions..*/.typede
18a0: 66 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  f struct unixFil
18b0: 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75  e unixFile;.stru
18c0: 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20  ct unixFile {.  
18d0: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
18e0: 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f  ds const *pMetho
18f0: 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74 68  d;  /* Always th
1900: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a 2f  e first entry */
1910: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70  .  struct unixOp
1920: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20 20 20  enCnt *pOpen;   
1930: 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75      /* Info abou
1940: 74 20 61 6c 6c 20 6f 70 65 6e 20 66 64 27 73 20  t all open fd's 
1950: 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  on this inode */
1960: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  .  struct unixLo
1970: 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 20 20  ckInfo *pLock;  
1980: 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75      /* Info abou
1990: 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20  t locks on this 
19a0: 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68  inode */.  int h
19b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19d0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
19e0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  or */.  int dirf
19f0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1a10: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
1a20: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a 2f  the directory */
1a30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1a40: 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20   locktype;      
1a50: 20 20 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20      /* The type 
1a60: 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  of lock held on 
1a70: 74 68 69 73 20 66 64 20 2a 2f 0a 20 20 69 6e 74  this fd */.  int
1a80: 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20   lastErrno;     
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aa0: 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20   The unix errno 
1ab0: 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f  from the last I/
1ac0: 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76 6f 69  O error */.  voi
1ad0: 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  d *lockingContex
1ae0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
1af0: 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73   Locking style s
1b00: 70 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f  pecific state */
1b10: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
1b20: 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20  *pUnused;       
1b30: 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63      /* Pre-alloc
1b40: 61 74 65 64 20 55 6e 69 78 55 6e 75 73 65 64 46  ated UnixUnusedF
1b50: 64 20 2a 2f 0a 20 20 69 6e 74 20 66 69 6c 65 46  d */.  int fileF
1b60: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1b70: 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 73 63 65          /* Misce
1b80: 6c 6c 61 6e 6f 75 73 20 66 6c 61 67 73 20 2a 2f  llanous flags */
1b90: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1ba0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1bb0: 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
1bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bd0: 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 67 73      /* The flags
1be0: 20 73 70 65 63 69 66 69 65 64 20 61 74 20 6f 70   specified at op
1bf0: 65 6e 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  en() */.#endif.#
1c00: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
1c10: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c  _LOCKING_STYLE |
1c20: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  | defined(__APPL
1c30: 45 5f 5f 29 0a 20 20 75 6e 73 69 67 6e 65 64 20  E__).  unsigned 
1c40: 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  fsFlags;        
1c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68           /* cach
1c60: 65 64 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20  ed details from 
1c70: 73 74 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64  statfs() */.#end
1c80: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  if.#if SQLITE_TH
1c90: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
1ca0: 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20  ned(__linux__). 
1cb0: 20 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20   pthread_t tid; 
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 2f 2a 20 54 68 65 20 74 68 72 65 61 64 20    /* The thread 
1ce0: 74 68 61 74 20 22 6f 77 6e 73 22 20 74 68 69 73  that "owns" this
1cf0: 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 23 65 6e   unixFile */.#en
1d00: 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  dif.#if OS_VXWOR
1d10: 4b 53 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  KS.  int isDelet
1d20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1d30: 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
1d40: 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65  on close if true
1d50: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77   */.  struct vxw
1d60: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b  orksFileId *pId;
1d70: 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65         /* Unique
1d80: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64   file ID */.#end
1d90: 69 66 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  if.#ifndef NDEBU
1da0: 47 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  G.  /* The next 
1db0: 67 72 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c  group of variabl
1dc0: 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  es are used to t
1dd0: 72 61 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20  rack whether or 
1de0: 6e 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61  not the.  ** tra
1df0: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1e00: 20 69 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20   in bytes 24-27 
1e10: 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
1e20: 73 20 61 72 65 20 75 70 64 61 74 65 64 0a 20 20  s are updated.  
1e30: 2a 2a 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20  ** whenever any 
1e40: 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
1e50: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
1e60: 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c  n assertion faul
1e70: 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75  t will.  ** occu
1e80: 72 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 75  r if a file is u
1e90: 70 64 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  pdated without a
1ea0: 6c 73 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65  lso updating the
1eb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
1ec0: 2a 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73  * counter.  This
1ed0: 20 74 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f   test is made to
1ee0: 20 61 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c   avoid new probl
1ef0: 65 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74  ems similar to t
1f00: 68 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63  he.  ** one desc
1f10: 72 69 62 65 64 20 62 79 20 74 69 63 6b 65 74 20  ribed by ticket 
1f20: 23 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75  #3584. .  */.  u
1f30: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 72 61  nsigned char tra
1f40: 6e 73 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a  nsCntrChng;   /*
1f50: 20 54 72 75 65 20 69 66 20 74 68 65 20 74 72 61   True if the tra
1f60: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1f70: 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e   changed */.  un
1f80: 73 69 67 6e 65 64 20 63 68 61 72 20 64 62 55 70  signed char dbUp
1f90: 64 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  date;        /* 
1fa0: 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 72 74  True if any part
1fb0: 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   of database fil
1fc0: 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  e changed */.  u
1fd0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e  nsigned char inN
1fe0: 6f 72 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a  ormalWrite;   /*
1ff0: 20 54 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f   True if in a no
2000: 72 6d 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61  rmal write opera
2010: 74 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  tion */.#endif.#
2020: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2030: 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d  T.  /* In test m
2040: 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ode, increase th
2050: 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73  e size of this s
2060: 74 72 75 63 74 75 72 65 20 61 20 62 69 74 20 73  tructure a bit s
2070: 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20  o that .  ** it 
2080: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
2090: 68 65 20 73 74 72 75 63 74 20 43 72 61 73 68 46  he struct CrashF
20a0: 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74  ile defined in t
20b0: 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63  est6.c..  */.  c
20c0: 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d  har aPadding[32]
20d0: 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  ;.#endif.};../*.
20e0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
20f0: 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 20 62   macros define b
2100: 69 74 73 20 69 6e 20 75 6e 69 78 46 69 6c 65 2e  its in unixFile.
2110: 66 69 6c 65 46 6c 61 67 73 0a 2a 2f 0a 23 64 65  fileFlags.*/.#de
2120: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 48 4f 4c  fine SQLITE_WHOL
2130: 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 20 20  E_FILE_LOCKING  
2140: 30 78 30 30 30 31 20 20 20 2f 2a 20 55 73 65 20  0x0001   /* Use 
2150: 77 68 6f 6c 65 2d 66 69 6c 65 20 6c 6f 63 6b 69  whole-file locki
2160: 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  ng */../*.** Inc
2170: 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20 69  lude code that i
2180: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  s common to all 
2190: 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a  os_*.c files.*/.
21a0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d  #include "os_com
21b0: 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65  mon.h"../*.** De
21c0: 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63  fine various mac
21d0: 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69 73  ros that are mis
21e0: 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73  sing from some s
21f0: 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
2200: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
2210: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
2220: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2230: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
2240: 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f  LE_LFS.# undef O
2250: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
2260: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
2270: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
2280: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65   O_NOFOLLOW.# de
2290: 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20  fine O_NOFOLLOW 
22a0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
22b0: 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69   O_BINARY.# defi
22c0: 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65  ne O_BINARY 0.#e
22d0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
22e0: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
22f0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
2300: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
2310: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
2320: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
2330: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
2340: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
2350: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
2360: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
2370: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
2380: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
2390: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
23a0: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
23b0: 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53  .  But it is DOS
23c0: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
23d0: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
23e0: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65  f __DJGPP__.# de
23f0: 66 69 6e 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43  fine fcntl(A,B,C
2400: 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ) 0.#endif../*.*
2410: 2a 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d  * The threadid m
2420: 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f  acro resolves to
2430: 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f   the thread-id o
2440: 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f  r to 0.  Used fo
2450: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
2460: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
2470: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
2480: 48 52 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e  HREADSAFE.#defin
2490: 65 20 74 68 72 65 61 64 69 64 20 70 74 68 72 65  e threadid pthre
24a0: 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a  ad_self().#else.
24b0: 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64  #define threadid
24c0: 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
24d0: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
24e0: 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64  ns to obtain and
24f0: 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20   relinquish the 
2500: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68  global mutex. Th
2510: 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65  e.** global mute
2520: 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  x is used to pro
2530: 74 65 63 74 20 74 68 65 20 75 6e 69 78 4f 70 65  tect the unixOpe
2540: 6e 43 6e 74 2c 20 75 6e 69 78 4c 6f 63 6b 49 6e  nCnt, unixLockIn
2550: 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b  fo and.** vxwork
2560: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 73 20  sFileId objects 
2570: 75 73 65 64 20 62 79 20 74 68 69 73 20 66 69 6c  used by this fil
2580: 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20  e, all of which 
2590: 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61 72 65  may be .** share
25a0: 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68  d by multiple th
25b0: 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e  reads..**.** Fun
25c0: 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65 78 48  ction unixMutexH
25d0: 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f  eld() is used to
25e0: 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
25f0: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  he global mutex 
2600: 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e  .** is held when
2610: 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
2620: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
2630: 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
2640: 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74   assert() .** st
2650: 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a  atements. e.g..*
2660: 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  *.**   unixEnter
2670: 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61  Mutex().**     a
2680: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
2690: 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 75  Held() );.**   u
26a0: 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28 29 0a  nixEnterLeave().
26b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
26c0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 76 6f  nixEnterMutex(vo
26d0: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
26e0: 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
26f0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
2700: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
2710: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61  _MASTER));.}.sta
2720: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61  tic void unixLea
2730: 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  veMutex(void){. 
2740: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
2750: 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65  eave(sqlite3Mute
2760: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
2770: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
2780: 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  R));.}.#ifdef SQ
2790: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
27a0: 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65 78 48  c int unixMutexH
27b0: 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65  eld(void) {.  re
27c0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
27d0: 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d  ex_held(sqlite3M
27e0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
27f0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
2800: 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  STER));.}.#endif
2810: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
2820: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48 65 6c  _DEBUG./*.** Hel
2830: 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  per function for
2840: 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72   printing out tr
2850: 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ace information 
2860: 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a  from debugging.*
2870: 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73  * binaries. This
2880: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72   returns the str
2890: 69 6e 67 20 72 65 70 72 65 73 65 74 61 74 69 6f  ing represetatio
28a0: 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  n of the supplie
28b0: 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63  d.** integer loc
28c0: 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69  k-type..*/.stati
28d0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f  c const char *lo
28e0: 63 6b 74 79 70 65 4e 61 6d 65 28 69 6e 74 20 6c  cktypeName(int l
28f0: 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 77 69 74  ocktype){.  swit
2900: 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  ch( locktype ){.
2910: 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b      case NO_LOCK
2920: 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b  : return "NONE";
2930: 0a 20 20 20 20 63 61 73 65 20 53 48 41 52 45 44  .    case SHARED
2940: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53  _LOCK: return "S
2950: 48 41 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65  HARED";.    case
2960: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20   RESERVED_LOCK: 
2970: 72 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44  return "RESERVED
2980: 22 3b 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44  ";.    case PEND
2990: 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  ING_LOCK: return
29a0: 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20   "PENDING";.    
29b0: 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c  case EXCLUSIVE_L
29c0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43  OCK: return "EXC
29d0: 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72  LUSIVE";.  }.  r
29e0: 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d  eturn "ERROR";.}
29f0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
2a00: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
2a10: 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75  E./*.** Print ou
2a20: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  t information ab
2a30: 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20  out all locking 
2a40: 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
2a50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2a60: 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62  s used for troub
2a70: 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73  leshooting locks
2a80: 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65   on multithreade
2a90: 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20  d.** platforms. 
2aa0: 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69   Enable by compi
2ab0: 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44  ling with the -D
2ac0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
2ad0: 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  E.** command-lin
2ae0: 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20  e option on the 
2af0: 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20  compiler.  This 
2b00: 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  code is normally
2b10: 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a  .** turned off..
2b20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
2b30: 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20  ckTrace(int fd, 
2b40: 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66  int op, struct f
2b50: 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72  lock *p){.  char
2b60: 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70   *zOpName, *zTyp
2b70: 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e  e;.  int s;.  in
2b80: 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  t savedErrno;.  
2b90: 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20  if( op==F_GETLK 
2ba0: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
2bb0: 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "GETLK";.  }els
2bc0: 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c  e if( op==F_SETL
2bd0: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
2be0: 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "SETLK";.  }e
2bf0: 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 66 63 6e  lse{.    s = fcn
2c00: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
2c10: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2c20: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b  rintf("fcntl unk
2c30: 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22  nown %d %d %d\n"
2c40: 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20  , fd, op, s);.  
2c50: 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a    return s;.  }.
2c60: 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d    if( p->l_type=
2c70: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
2c80: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
2c90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
2ca0: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
2cb0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
2cc0: 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  WRLCK";.  }else 
2cd0: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
2ce0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _UNLCK ){.    zT
2cf0: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
2d00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
2d10: 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61  rt( 0 );.  }.  a
2d20: 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e  ssert( p->l_when
2d30: 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a  ce==SEEK_SET );.
2d40: 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20    s = fcntl(fd, 
2d50: 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45  op, p);.  savedE
2d60: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
2d70: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2d80: 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20  tf("fcntl %d %d 
2d90: 25 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25  %s %s %d %d %d %
2da0: 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61  d\n",.     threa
2db0: 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65  did, fd, zOpName
2dc0: 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d  , zType, (int)p-
2dd0: 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70  >l_start, (int)p
2de0: 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69  ->l_len,.     (i
2df0: 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b  nt)p->l_pid, s);
2e00: 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26  .  if( s==(-1) &
2e10: 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26  & op==F_SETLK &&
2e20: 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52   (p->l_type==F_R
2e30: 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70  DLCK || p->l_typ
2e40: 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20  e==F_WRLCK) ){. 
2e50: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
2e60: 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b  l2;.    l2 = *p;
2e70: 0a 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46  .    fcntl(fd, F
2e80: 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20  _GETLK, &l2);.  
2e90: 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d    if( l2.l_type=
2ea0: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
2eb0: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
2ec0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
2ed0: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   l2.l_type==F_WR
2ee0: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
2ef0: 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20  pe = "WRLCK";.  
2f00: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
2f10: 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
2f20: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
2f30: 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "UNLCK";.    }el
2f40: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2f50: 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ( 0 );.    }.   
2f60: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2f70: 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75  ntf("fcntl-failu
2f80: 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64  re-reason: %s %d
2f90: 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d %d\n",.     
2fa0: 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32    zType, (int)l2
2fb0: 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c  .l_start, (int)l
2fc0: 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32  2.l_len, (int)l2
2fd0: 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65  .l_pid);.  }.  e
2fe0: 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e  rrno = savedErrn
2ff0: 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d  o;.  return s;.}
3000: 0a 23 64 65 66 69 6e 65 20 66 63 6e 74 6c 20 6c  .#define fcntl l
3010: 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20  ockTrace.#endif 
3020: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  /* SQLITE_LOCK_T
3030: 52 41 43 45 20 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a  RACE */..../*.**
3040: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72   This routine tr
3050: 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64  anslates a stand
3060: 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20  ard POSIX errno 
3070: 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68  code into someth
3080: 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f  ing.** useful to
3090: 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20   the clients of 
30a0: 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63  the sqlite3 func
30b0: 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63  tions.  Specific
30c0: 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69  ally, it is.** i
30d0: 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73  ntended to trans
30e0: 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f  late a variety o
30f0: 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72  f "try again" er
3100: 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45  rors into SQLITE
3110: 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76  _BUSY.** and a v
3120: 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73  ariety of "pleas
3130: 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  e close the file
3140: 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22   descriptor NOW"
3150: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a   errors into .**
3160: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a   SQLITE_IOERR.**
3170: 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69   .** Errors duri
3180: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
3190: 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66  n of locks, or f
31a0: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
31b0: 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a  rt for locks,.**
31c0: 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45   should handle E
31d0: 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20  NOLCK, ENOTSUP, 
31e0: 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72  EOPNOTSUPP separ
31f0: 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
3200: 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72   int sqliteError
3210: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69  FromPosixError(i
3220: 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69  nt posixError, i
3230: 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20  nt sqliteIOErr) 
3240: 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73 69  {.  switch (posi
3250: 78 45 72 72 6f 72 29 20 7b 0a 20 20 63 61 73 65  xError) {.  case
3260: 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20   0: .    return 
3270: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a  SQLITE_OK;.    .
3280: 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20    case EAGAIN:. 
3290: 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a   case ETIMEDOUT:
32a0: 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20  .  case EBUSY:. 
32b0: 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63   case EINTR:.  c
32c0: 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20  ase ENOLCK:  .  
32d0: 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20    /* random NFS 
32e0: 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c  retry error, unl
32f0: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
3300: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
3310: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
3320: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
3330: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
3340: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
3350: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
3360: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20  TE_BUSY;.    .  
3370: 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20  case EACCES: .  
3380: 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c    /* EACCES is l
3390: 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e  ike EAGAIN durin
33a0: 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74  g locking operat
33b0: 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e  ions, but not an
33c0: 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20  y other time*/. 
33d0: 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f     if( (sqliteIO
33e0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
33f0: 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28  ERR_LOCK) || ..(
3400: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
3410: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
3420: 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65  CK) || ..(sqlite
3430: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
3440: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c  IOERR_RDLOCK) ||
3450: 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ..(sqliteIOErr =
3460: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
3470: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
3480: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
3490: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
34a0: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65     }.    /* else
34b0: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   fall through */
34c0: 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a  .  case EPERM: .
34d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34e0: 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 63  E_PERM;.    .  c
34f0: 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20  ase EDEADLK:.   
3500: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
3510: 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20  OERR_BLOCKED;.  
3520: 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50    .#if EOPNOTSUP
3530: 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73  P!=ENOTSUP.  cas
3540: 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20  e EOPNOTSUPP: . 
3550: 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20     /* something 
3560: 77 65 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77  went terribly aw
3570: 72 79 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  ry, unless durin
3580: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
3590: 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e  pport .     * in
35a0: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
35b0: 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c  which it actuall
35c0: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
35d0: 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  says */.#endif.#
35e0: 69 66 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20  ifdef ENOTSUP.  
35f0: 63 61 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20  case ENOTSUP: . 
3600: 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64     /* invalid fd
3610: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
3620: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
3630: 6f 72 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f  ort introspectio
3640: 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20  n, in which .   
3650: 20 20 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20    * it actually 
3660: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
3670: 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ys */.#endif.  c
3680: 61 73 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20  ase EIO:.  case 
3690: 45 42 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49  EBADF:.  case EI
36a0: 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f  NVAL:.  case ENO
36b0: 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e  TCONN:.  case EN
36c0: 4f 44 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58  ODEV:.  case ENX
36d0: 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e  IO:.  case ENOEN
36e0: 54 3a 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45  T:.  case ESTALE
36f0: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53 3a  :.  case ENOSYS:
3700: 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73 68  .    /* these sh
3710: 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20 63  ould force the c
3720: 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74  lient to close t
3730: 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63 6f  he file and reco
3740: 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20  nnect */.    .  
3750: 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65  default: .    re
3760: 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72  turn sqliteIOErr
3770: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a  ;.  }.}..../****
3780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
37d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
37e0: 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20  gin Unique File 
37f0: 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20  ID Utility Used 
3800: 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a  By VxWorks *****
3810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
3820: 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e   On most version
3830: 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61  s of unix, we ca
3840: 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49  n get a unique I
3850: 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20  D for a file by 
3860: 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a  concatenating.**
3870: 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62   the device numb
3880: 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65  er and the inode
3890: 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68   number.  But th
38a0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  is does not work
38b0: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
38c0: 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e  On VxWorks, a un
38d0: 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73  ique file id mus
38e0: 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68  t be based on th
38f0: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
3900: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  name..**.** A po
3910: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
3920: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
3930: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
3940: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61  can be used as a
3950: 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20  .** unique file 
3960: 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20  ID in VxWorks.  
3970: 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
3980: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
3990: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f  contains.** a co
39a0: 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69  py of the canoni
39b0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54  cal filename.  T
39c0: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72  here is also a r
39d0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20  eference count. 
39e0: 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75   .** The structu
39f0: 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20  re is reclaimed 
3a00: 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  when the number 
3a10: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69  of pointers to i
3a20: 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65  t drops to.** ze
3a30: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ro..**.** There 
3a40: 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d  are never very m
3a50: 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61  any files open a
3a60: 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c  t one time and l
3a70: 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a  ookups are not.*
3a80: 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d  * a performance-
3a90: 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73  critical path, s
3aa0: 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  o it is sufficie
3ab0: 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a  nt to put these.
3ac0: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e  ** structures on
3ad0: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a   a linked list..
3ae0: 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b  */.struct vxwork
3af0: 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75  sFileId {.  stru
3b00: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
3b10: 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78   *pNext;  /* Nex
3b20: 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74  t in a list of t
3b30: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  hem all */.  int
3b40: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
3b50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3b60: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
3b70: 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a  es to this one *
3b80: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ba0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
3bb0: 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  he zCanonicalNam
3bc0: 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  e[] string */.  
3bd0: 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c  char *zCanonical
3be0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Name;         /*
3bf0: 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   Canonical filen
3c00: 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f  ame */.};..#if O
3c10: 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a  S_VXWORKS./* .**
3c20: 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65   All unique file
3c30: 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f  names are held o
3c40: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
3c50: 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a  headed by this.*
3c60: 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73  * variable:.*/.s
3c70: 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77  tatic struct vxw
3c80: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f  orksFileId *vxwo
3c90: 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b  rksFileList = 0;
3ca0: 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79  ../*.** Simplify
3cb0: 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f   a filename into
3cc0: 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66   its canonical f
3cd0: 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67  orm.** by making
3ce0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
3cf0: 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a  hanges:.**.**  *
3d00: 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72   removing any tr
3d10: 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69  ailing and dupli
3d20: 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  cate /.**  * con
3d30: 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75  vert /./ into ju
3d40: 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65  st /.**  * conve
3d50: 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20  rt /A/../ where 
3d60: 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20  A is any simple 
3d70: 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f  name into just /
3d80: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61  .**.** Changes a
3d90: 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65  re made in-place
3da0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
3db0: 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a  w name length..*
3dc0: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
3dd0: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e  l filename is in
3de0: 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74   z[0..n-1].  Ret
3df0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
3e00: 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  f.** characters 
3e10: 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65  in the simplifie
3e20: 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  d name..*/.stati
3e30: 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d  c int vxworksSim
3e40: 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a  plifyName(char *
3e50: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
3e60: 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20   i, j;.  while( 
3e70: 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>1 && z[n-1]=='
3e80: 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66  /' ){ n--; }.  f
3e90: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
3ea0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
3eb0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
3ec0: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20  if( z[i+1]=='/' 
3ed0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
3ee0: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
3ef0: 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b  ' && i+2<n && z[
3f00: 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+2]=='/' ){.   
3f10: 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20       i += 1;.   
3f20: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
3f30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3f40: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
3f50: 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+3<n && z[i+2]=
3f60: 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d  ='.' && z[i+3]==
3f70: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '/' ){.        w
3f80: 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a  hile( j>0 && z[j
3f90: 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b  -1]!='/' ){ j--;
3fa0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
3fb0: 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  >0 ){ j--; }.   
3fc0: 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
3fd0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
3fe0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3ff0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
4000: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
4010: 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f    return j;.}../
4020: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71  *.** Find a uniq
4030: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74  ue file ID for t
4040: 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74  he given absolut
4050: 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74  e pathname.  Ret
4060: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
4070: 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46   to the vxworksF
4080: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54  ileId object.  T
4090: 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74  his pointer is t
40a0: 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c  he unique.** fil
40b0: 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e ID..**.** The 
40c0: 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68  nRef field of th
40d0: 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  e vxworksFileId 
40e0: 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d  object is increm
40f0: 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ented before.** 
4100: 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65  the object is re
4110: 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76  turned.  A new v
4120: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
4130: 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ect is created.*
4140: 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  * and added to t
4150: 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69  he global list i
4160: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  f necessary..**.
4170: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
4180: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
4190: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
41a0: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ULL..*/.static s
41b0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
41c0: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64  eId *vxworksFind
41d0: 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61  FileId(const cha
41e0: 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  r *zAbsoluteName
41f0: 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  ){.  struct vxwo
4200: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b  rksFileId *pNew;
4210: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72           /* sear
4220: 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66  ch key and new f
4230: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75  ile ID */.  stru
4240: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
4250: 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20   *pCandidate;   
4260: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
4270: 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c  ver existing fil
4280: 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  e IDs */.  int n
4290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
42b0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73  * Length of zAbs
42c0: 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67  oluteName string
42d0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   */..  assert( z
42e0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d  AbsoluteName[0]=
42f0: 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69  ='/' );.  n = (i
4300: 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c  nt)strlen(zAbsol
4310: 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77  uteName);.  pNew
4320: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
4330: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
4340: 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66   + (n+1) );.  if
4350: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
4360: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43  rn 0;.  pNew->zC
4370: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28  anonicalName = (
4380: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
4390: 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a    memcpy(pNew->z
43a0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a  CanonicalName, z
43b0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b  AbsoluteName, n+
43c0: 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b  1);.  n = vxwork
43d0: 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e  sSimplifyName(pN
43e0: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
43f0: 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65  me, n);..  /* Se
4400: 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
4410: 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20  ting entry that 
4420: 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e  matching the can
4430: 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a  onical name..  *
4440: 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72  * If found, incr
4450: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
4460: 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65  nce count and re
4470: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
4480: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74  o.  ** the exist
4490: 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a  ing file ID..  *
44a0: 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
44b0: 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e  ex();.  for(pCan
44c0: 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69  didate=vxworksFi
44d0: 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61  leList; pCandida
44e0: 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70  te; pCandidate=p
44f0: 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74  Candidate->pNext
4500: 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64  ){.    if( pCand
4510: 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20  idate->nName==n 
4520: 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28  .     && memcmp(
4530: 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e  pCandidate->zCan
4540: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77  onicalName, pNew
4550: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
4560: 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  , n)==0.    ){. 
4570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
4580: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ee(pNew);.      
4590: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65   pCandidate->nRe
45a0: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78  f++;.       unix
45b0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
45c0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e       return pCan
45d0: 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20  didate;.    }.  
45e0: 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68  }..  /* No match
45f0: 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20   was found.  We 
4600: 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20  will make a new 
4610: 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65  file ID */.  pNe
4620: 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  w->nRef = 1;.  p
4630: 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a  New->nName = n;.
4640: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
4650: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
4660: 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  .  vxworksFileLi
4670: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69  st = pNew;.  uni
4680: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
4690: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
46a0: 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
46b0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
46c0: 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b  ount on a vxwork
46d0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
46e0: 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a   Free.** the obj
46f0: 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66  ect when the ref
4700: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61  erence count rea
4710: 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  ches zero..*/.st
4720: 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b  atic void vxwork
4730: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73  sReleaseFileId(s
4740: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
4750: 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69  eId *pId){.  uni
4760: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
4770: 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52   assert( pId->nR
4780: 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e  ef>0 );.  pId->n
4790: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64  Ref--;.  if( pId
47a0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
47b0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
47c0: 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20  ileId **pp;.    
47d0: 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46  for(pp=&vxworksF
47e0: 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20  ileList; *pp && 
47f0: 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26  *pp!=pId; pp = &
4800: 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b  ((*pp)->pNext)){
4810: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  }.    assert( *p
4820: 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70  p==pId );.    *p
4830: 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a  p = pId->pNext;.
4840: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4850: 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  (pId);.  }.  uni
4860: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
4870: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
4880: 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a  WORKS */./******
4890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
48a0: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
48b0: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
48c0: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
48d0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
48e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4920: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
4930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
4980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4990: 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76  ****** Posix Adv
49a0: 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a  isory Locking **
49b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
49d0: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
49e0: 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e  locks are broken
49f0: 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53   by design.  ANS
4a00: 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39  I STD 1003.1 (19
4a10: 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36  96).** section 6
4a20: 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33  .5.2.2 lines 483
4a30: 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65   through 490 spe
4a40: 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61  cify that when a
4a50: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73   process.** sets
4a60: 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63   or clears a loc
4a70: 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f  k, that operatio
4a80: 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20  n overrides any 
4a90: 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a  prior locks set.
4aa0: 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  ** by the same p
4ab0: 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73  rocess.  It does
4ac0: 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20   not explicitly 
4ad0: 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73  say so, but this
4ae0: 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74   implies.** that
4af0: 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f   it overrides lo
4b00: 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73  cks set by the s
4b10: 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e  ame process usin
4b20: 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  g a different.**
4b30: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4b40: 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73  .  Consider this
4b50: 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a   test case:.**.*
4b60: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 20  *       int fd1 
4b70: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22  = open("./file1"
4b80: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
4b90: 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20  , 0644);.**     
4ba0: 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e    int fd2 = open
4bb0: 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44  ("./file2", O_RD
4bc0: 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34  WR|O_CREAT, 0644
4bd0: 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  );.**.** Suppose
4be0: 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66   ./file1 and ./f
4bf0: 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20  ile2 are really 
4c00: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62  the same file (b
4c10: 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73  ecause.** one is
4c20: 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f   a hard or symbo
4c30: 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20  lic link to the 
4c40: 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 79  other) then if y
4c50: 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63  ou set.** an exc
4c60: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66  lusive lock on f
4c70: 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  d1, then try to 
4c80: 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  get an exclusive
4c90: 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c   lock.** on fd2,
4ca0: 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f   it works.  I wo
4cb0: 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 65  uld have expecte
4cc0: 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63  d the second loc
4cd0: 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e  k to.** fail sin
4ce0: 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c 72  ce there was alr
4cf0: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  eady a lock on t
4d00: 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66  he file due to f
4d10: 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73  d1..** But not s
4d20: 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c  o.  Since both l
4d30: 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74  ocks came from t
4d40: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c  he same process,
4d50: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f   the.** second o
4d60: 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69 72  verrides the fir
4d70: 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  st, even though 
4d80: 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66  they were on dif
4d90: 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64  ferent.** file d
4da0: 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65  escriptors opene
4db0: 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66  d on different f
4dc0: 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a  ile names..**.**
4dd0: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
4de0: 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50   we cannot use P
4df0: 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79  OSIX locks to sy
4e00: 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61  nchronize file a
4e10: 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63  ccess.** among c
4e20: 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73  ompeting threads
4e30: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f   of the same pro
4e40: 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63  cess.  POSIX loc
4e50: 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ks will work fin
4e60: 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e  e.** to synchron
4e70: 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74  ize access for t
4e80: 68 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61  hreads in separa
4e90: 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75  te processes, bu
4ea0: 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73  t not.** threads
4eb0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
4ec0: 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
4ed0: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
4ee0: 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69  he problem, SQLi
4ef0: 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65  te has to manage
4f00: 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65   file locks inte
4f10: 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73  rnally.** on its
4f20: 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20   own.  Whenever 
4f30: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69  a new database i
4f40: 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76  s opened, we hav
4f50: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a  e to find the.**
4f60: 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20   specific inode 
4f70: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
4f80: 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20  file (the inode 
4f90: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
4fa0: 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61   the.** st_dev a
4fb0: 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73  nd st_ino fields
4fc0: 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72   of the stat str
4fd0: 75 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61  ucture that fsta
4fe0: 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a  t() fills in).**
4ff0: 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c   and check for l
5000: 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69  ocks already exi
5010: 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e  sting on that in
5020: 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73  ode.  When locks
5030: 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20   are.** created 
5040: 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68  or removed, we h
5050: 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f  ave to look at o
5060: 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20  ur own internal 
5070: 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a  record of the.**
5080: 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66   locks to see if
5090: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
50a0: 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73  has previously s
50b0: 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61  et a lock on tha
50c0: 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e  t same.** inode.
50d0: 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54  .**.** (Aside: T
50e0: 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20  he use of inode 
50f0: 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75  numbers as uniqu
5100: 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77  e IDs does not w
5110: 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ork on VxWorks..
5120: 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20  ** For VxWorks, 
5130: 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74  we have to use t
5140: 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75  he alternative u
5150: 6e 69 71 75 65 20 49 44 20 73 79 73 74 65 6d 20  nique ID system 
5160: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f  based on.** cano
5170: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61  nical filename a
5180: 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  nd implemented i
5190: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 64  n the previous d
51a0: 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20  ivision.).**.** 
51b0: 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  The sqlite3_file
51c0: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50   structure for P
51d0: 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  OSIX is no longe
51e0: 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65  r just an intege
51f0: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
5200: 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77  ptor.  It is now
5210: 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61   a structure tha
5220: 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65  t holds the inte
5230: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
5240: 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69  riptor and a poi
5250: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74  nter to a struct
5260: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
5270: 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a  es the internal.
5280: 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ** locks on the 
5290: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e  corresponding in
52a0: 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f  ode.  There is o
52b0: 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ne locking struc
52c0: 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64  ture.** per inod
52d0: 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d  e, so if the sam
52e0: 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65  e inode is opene
52f0: 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e  d twice, both un
5300: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
5310: 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68  s.** point to th
5320: 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73  e same locking s
5330: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c  tructure.  The l
5340: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
5350: 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65   keeps.** a refe
5360: 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20  rence count (so 
5370: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65  we will know whe
5380: 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20  n to delete it) 
5390: 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66  and a "cnt".** f
53a0: 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20  ield that tells 
53b0: 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20  us its internal 
53c0: 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e  lock status.  cn
53d0: 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a  t==0 means the.*
53e0: 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  * file is unlock
53f0: 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61  ed.  cnt==-1 mea
5400: 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ns the file has 
5410: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
5420: 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e  k..** cnt>0 mean
5430: 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20  s there are cnt 
5440: 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20  shared locks on 
5450: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
5460: 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  Any attempt to l
5470: 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20  ock or unlock a 
5480: 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b  file first check
5490: 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  s the locking.**
54a0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
54b0: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
54c0: 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76  call is only inv
54d0: 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a  oked to set a .*
54e0: 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20  * POSIX lock if 
54f0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  the internal loc
5500: 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  k structure tran
5510: 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a  sitions between.
5520: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20  ** a locked and 
5530: 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74  an unlocked stat
5540: 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69  e..**.** But wai
5550: 74 3a 20 20 74 68 65 72 65 20 61 72 65 20 79 65  t:  there are ye
5560: 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20  t more problems 
5570: 77 69 74 68 20 50 4f 53 49 58 20 61 64 76 69 73  with POSIX advis
5580: 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  ory locks..**.**
5590: 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20   If you close a 
55a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
55b0: 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  that points to a
55c0: 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c   file that has l
55d0: 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63  ocks,.** all loc
55e0: 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20  ks on that file 
55f0: 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62  that are owned b
5600: 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  y the current pr
5610: 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c  ocess are.** rel
5620: 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20  eased.  To work 
5630: 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62  around this prob
5640: 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 46 69  lem, each unixFi
5650: 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  le structure con
5660: 74 61 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74  tains.** a point
5670: 65 72 20 74 6f 20 61 6e 20 75 6e 69 78 4f 70 65  er to an unixOpe
5680: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 2e 20  nCnt structure. 
5690: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 75 6e   There is one un
56a0: 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  ixOpenCnt struct
56b0: 75 72 65 0a 2a 2a 20 70 65 72 20 6f 70 65 6e 20  ure.** per open 
56c0: 69 6e 6f 64 65 2c 20 77 68 69 63 68 20 6d 65 61  inode, which mea
56d0: 6e 73 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65  ns that multiple
56e0: 20 75 6e 69 78 46 69 6c 65 20 63 61 6e 20 70 6f   unixFile can po
56f0: 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a  int to a single.
5700: 2a 2a 20 75 6e 69 78 4f 70 65 6e 43 6e 74 2e 20  ** unixOpenCnt. 
5710: 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   When an attempt
5720: 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73   is made to clos
5730: 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69  e an unixFile, i
5740: 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f  f there are.** o
5750: 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70  ther unixFile op
5760: 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69  en on the same i
5770: 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68 6f  node that are ho
5780: 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65  lding locks, the
5790: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73   call.** to clos
57a0: 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65 73  e() the file des
57b0: 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65 72  criptor is defer
57c0: 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66  red until all of
57d0: 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72   the locks clear
57e0: 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 4f 70 65  ..** The unixOpe
57f0: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 6b  nCnt structure k
5800: 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66  eeps a list of f
5810: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
5820: 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20  that need to.** 
5830: 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68  be closed and th
5840: 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65  at list is walke
5850: 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20  d (and cleared) 
5860: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f  when the last lo
5870: 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a  ck.** clears..**
5880: 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72 20  .** Yet another 
5890: 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54  problem:  LinuxT
58a0: 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c  hreads do not pl
58b0: 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f 73  ay well with pos
58c0: 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  ix locks..**.** 
58d0: 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73 69  Many older versi
58e0: 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73 65  ons of linux use
58f0: 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61 64   the LinuxThread
5900: 73 20 6c 69 62 72 61 72 79 20 77 68 69 63 68 20  s library which 
5910: 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20  is.** not posix 
5920: 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65  compliant.  Unde
5930: 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20  r LinuxThreads, 
5940: 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62  a lock created b
5950: 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63 61  y thread.** A ca
5960: 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64  nnot be modified
5970: 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20 62   or overridden b
5980: 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68  y a different th
5990: 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20  read B..** Only 
59a0: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f 64  thread A can mod
59b0: 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c  ify the lock.  L
59c0: 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 20  ocking behavior 
59d0: 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66  is correct.** if
59e0: 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e 20   the appliation 
59f0: 75 73 65 73 20 74 68 65 20 6e 65 77 65 72 20 4e  uses the newer N
5a00: 61 74 69 76 65 20 50 6f 73 69 78 20 54 68 72 65  ative Posix Thre
5a10: 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54 4c  ad Library (NPTL
5a20: 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20  ).** on linux - 
5a30: 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b  with NPTL a lock
5a40: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65   created by thre
5a50: 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64  ad A can overrid
5a60: 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68  e locks.** in th
5a70: 72 65 61 64 20 42 2e 20 20 42 75 74 20 74 68 65  read B.  But the
5a80: 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20  re is no way to 
5a90: 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d  know at compile-
5aa0: 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74 68  time which.** th
5ab0: 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79 20  reading library 
5ac0: 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20  is being used.  
5ad0: 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  So there is no w
5ae0: 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a  ay to know at.**
5af0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
5b00: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72  ether or not thr
5b10: 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69  ead A can overri
5b20: 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65  de locks on thre
5b30: 61 64 20 42 2e 0a 2a 2a 20 57 65 20 68 61 76 65  ad B..** We have
5b40: 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d   to do a run-tim
5b50: 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63 6f  e check to disco
5b60: 76 65 72 20 74 68 65 20 62 65 68 61 76 69 6f 72  ver the behavior
5b70: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   of the.** curre
5b80: 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  nt process..**.*
5b90: 2a 20 4f 6e 20 73 79 73 74 65 6d 73 20 77 68 65  * On systems whe
5ba0: 72 65 20 74 68 72 65 61 64 20 41 20 69 73 20 75  re thread A is u
5bb0: 6e 61 62 6c 65 20 74 6f 20 6d 6f 64 69 66 79 20  nable to modify 
5bc0: 6c 6f 63 6b 73 20 63 72 65 61 74 65 64 20 62 79  locks created by
5bd0: 0a 2a 2a 20 74 68 72 65 61 64 20 42 2c 20 77 65  .** thread B, we
5be0: 20 68 61 76 65 20 74 6f 20 6b 65 65 70 20 74 72   have to keep tr
5bf0: 61 63 6b 20 6f 66 20 77 68 69 63 68 20 74 68 72  ack of which thr
5c00: 65 61 64 20 63 72 65 61 74 65 64 20 65 61 63 68  ead created each
5c10: 0a 2a 2a 20 6c 6f 63 6b 2e 20 20 48 65 6e 63 65  .** lock.  Hence
5c20: 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 74   there is an ext
5c30: 72 61 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  ra field in the 
5c40: 6b 65 79 20 74 6f 20 74 68 65 20 75 6e 69 78 4c  key to the unixL
5c50: 6f 63 6b 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ockInfo.** struc
5c60: 74 75 72 65 20 74 6f 20 72 65 63 6f 72 64 20 74  ture to record t
5c70: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  his information.
5c80: 20 20 41 6e 64 20 6f 6e 20 74 68 6f 73 65 20 73    And on those s
5c90: 79 73 74 65 6d 73 20 69 74 0a 2a 2a 20 69 73 20  ystems it.** is 
5ca0: 69 6c 6c 65 67 61 6c 20 74 6f 20 62 65 67 69 6e  illegal to begin
5cb0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
5cc0: 6e 20 6f 6e 65 20 74 68 72 65 61 64 20 61 6e 64  n one thread and
5cd0: 20 66 69 6e 69 73 68 20 69 74 0a 2a 2a 20 69 6e   finish it.** in
5ce0: 20 61 6e 6f 74 68 65 72 2e 20 20 46 6f 72 20 74   another.  For t
5cf0: 68 69 73 20 6c 61 74 74 65 72 20 72 65 73 74 72  his latter restr
5d00: 69 63 74 69 6f 6e 2c 20 74 68 65 72 65 20 69 73  iction, there is
5d10: 20 6e 6f 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 2e   no work-around.
5d20: 0a 2a 2a 20 49 74 20 69 73 20 61 20 6c 69 6d 69  .** It is a limi
5d30: 74 61 74 69 6f 6e 20 6f 66 20 4c 69 6e 75 78 54  tation of LinuxT
5d40: 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  hreads..*/../*.*
5d50: 2a 20 53 65 74 20 6f 72 20 63 68 65 63 6b 20 74  * Set or check t
5d60: 68 65 20 75 6e 69 78 46 69 6c 65 2e 74 69 64 20  he unixFile.tid 
5d70: 66 69 65 6c 64 2e 20 20 54 68 69 73 20 66 69 65  field.  This fie
5d80: 6c 64 20 69 73 20 73 65 74 20 77 68 65 6e 20 61  ld is set when a
5d90: 6e 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 69 73  n unixFile.** is
5da0: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 20   first opened.  
5db0: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 75  All subsequent u
5dc0: 73 65 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46  ses of the unixF
5dd0: 69 6c 65 20 76 65 72 69 66 79 20 74 68 61 74 20  ile verify that 
5de0: 74 68 65 0a 2a 2a 20 73 61 6d 65 20 74 68 72 65  the.** same thre
5df0: 61 64 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20  ad is operating 
5e00: 6f 6e 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  on the unixFile.
5e10: 20 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67    Some operating
5e20: 20 73 79 73 74 65 6d 73 20 64 6f 0a 2a 2a 20 6e   systems do.** n
5e30: 6f 74 20 61 6c 6c 6f 77 20 6c 6f 63 6b 73 20 74  ot allow locks t
5e40: 6f 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  o be overridden 
5e50: 62 79 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  by other threads
5e60: 20 61 6e 64 20 74 68 61 74 20 72 65 73 74 72 69   and that restri
5e70: 63 74 69 6f 6e 0a 2a 2a 20 6d 65 61 6e 73 20 74  ction.** means t
5e80: 68 61 74 20 73 71 6c 69 74 65 33 2a 20 64 61 74  hat sqlite3* dat
5e90: 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 63 61  abase handles ca
5ea0: 6e 6e 6f 74 20 62 65 20 6d 6f 76 65 64 20 66 72  nnot be moved fr
5eb0: 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 0a 2a 2a  om one thread.**
5ec0: 20 74 6f 20 61 6e 6f 74 68 65 72 20 77 68 69 6c   to another whil
5ed0: 65 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64  e locks are held
5ee0: 2e 0a 2a 2a 0a 2a 2a 20 56 65 72 73 69 6f 6e 20  ..**.** Version 
5ef0: 33 2e 33 2e 31 20 28 32 30 30 36 2d 30 31 2d 31  3.3.1 (2006-01-1
5f00: 35 29 3a 20 20 75 6e 69 78 46 69 6c 65 20 63 61  5):  unixFile ca
5f10: 6e 20 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20  n be moved from 
5f20: 6f 6e 65 20 74 68 72 65 61 64 20 74 6f 0a 2a 2a  one thread to.**
5f30: 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67   another as long
5f40: 20 61 73 20 77 65 20 61 72 65 20 72 75 6e 6e 69   as we are runni
5f50: 6e 67 20 6f 6e 20 61 20 73 79 73 74 65 6d 20 74  ng on a system t
5f60: 68 61 74 20 73 75 70 70 6f 72 74 73 20 74 68 72  hat supports thr
5f70: 65 61 64 73 0a 2a 2a 20 6f 76 65 72 72 69 64 69  eads.** overridi
5f80: 6e 67 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c  ng each others l
5f90: 6f 63 6b 73 20 28 77 68 69 63 68 20 69 73 20 6e  ocks (which is n
5fa0: 6f 77 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d 6d  ow the most comm
5fb0: 6f 6e 20 62 65 68 61 76 69 6f 72 29 0a 2a 2a 20  on behavior).** 
5fc0: 6f 72 20 69 66 20 6e 6f 20 6c 6f 63 6b 73 20 61  or if no locks a
5fd0: 72 65 20 68 65 6c 64 2e 20 20 42 75 74 20 74 68  re held.  But th
5fe0: 65 20 75 6e 69 78 46 69 6c 65 2e 70 4c 6f 63 6b  e unixFile.pLock
5ff0: 20 66 69 65 6c 64 20 6e 65 65 64 73 20 74 6f 20   field needs to 
6000: 62 65 0a 2a 2a 20 72 65 63 6f 6d 70 75 74 65 64  be.** recomputed
6010: 20 62 65 63 61 75 73 65 20 69 74 73 20 6b 65 79   because its key
6020: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 74 68   includes the th
6030: 72 65 61 64 2d 69 64 2e 20 20 53 65 65 20 74 68  read-id.  See th
6040: 65 20 0a 2a 2a 20 74 72 61 6e 73 66 65 72 4f 77  e .** transferOw
6050: 6e 65 72 73 68 69 70 28 29 20 66 75 6e 63 74 69  nership() functi
6060: 6f 6e 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64  on below for add
6070: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
6080: 69 6f 6e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ion.*/.#if SQLIT
6090: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
60a0: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
60b0: 5f 29 0a 23 20 64 65 66 69 6e 65 20 53 45 54 5f  _).# define SET_
60c0: 54 48 52 45 41 44 49 44 28 58 29 20 20 20 28 58  THREADID(X)   (X
60d0: 29 2d 3e 74 69 64 20 3d 20 70 74 68 72 65 61 64  )->tid = pthread
60e0: 5f 73 65 6c 66 28 29 0a 23 20 64 65 66 69 6e 65  _self().# define
60f0: 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28   CHECK_THREADID(
6100: 58 29 20 28 74 68 72 65 61 64 73 4f 76 65 72 72  X) (threadsOverr
6110: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
6120: 6b 73 3d 3d 30 20 26 26 20 5c 0a 20 20 20 20 20  ks==0 && \.     
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6140: 20 20 20 20 20 20 20 21 70 74 68 72 65 61 64 5f         !pthread_
6150: 65 71 75 61 6c 28 28 58 29 2d 3e 74 69 64 2c 20  equal((X)->tid, 
6160: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29 29  pthread_self()))
6170: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
6180: 53 45 54 5f 54 48 52 45 41 44 49 44 28 58 29 0a  SET_THREADID(X).
6190: 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 54  # define CHECK_T
61a0: 48 52 45 41 44 49 44 28 58 29 20 30 0a 23 65 6e  HREADID(X) 0.#en
61b0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  dif../*.** An in
61c0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
61d0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
61e0: 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20  e serves as the 
61f0: 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c  key used.** to l
6200: 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c  ocate a particul
6210: 61 72 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73  ar unixOpenCnt s
6220: 74 72 75 63 74 75 72 65 20 67 69 76 65 6e 20 69  tructure given i
6230: 74 73 20 69 6e 6f 64 65 2e 20 20 54 68 69 73 0a  ts inode.  This.
6240: 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ** is the same a
6250: 73 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 4b 65  s the unixLockKe
6260: 79 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  y except that th
6270: 65 20 74 68 72 65 61 64 20 49 44 20 69 73 20 6f  e thread ID is o
6280: 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 72 75 63  mitted..*/.struc
6290: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20  t unixFileId {. 
62a0: 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20   dev_t dev;     
62b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
62c0: 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f  Device number */
62d0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
62e0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
62f0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a  FileId *pId;  /*
6300: 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   Unique file ID 
6310: 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a  for vxworks. */.
6320: 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e  #else.  ino_t in
6330: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
6340: 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d      /* Inode num
6350: 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ber */.#endif.};
6360: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
6370: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
6380: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73  wing structure s
6390: 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79  erves as the key
63a0: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61   used.** to loca
63b0: 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  te a particular 
63c0: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73 74 72  unixLockInfo str
63d0: 75 63 74 75 72 65 20 67 69 76 65 6e 20 69 74 73  ucture given its
63e0: 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   inode..**.** If
63f0: 20 74 68 72 65 61 64 73 20 63 61 6e 6e 6f 74 20   threads cannot 
6400: 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74  override each ot
6410: 68 65 72 73 20 6c 6f 63 6b 73 20 28 4c 69 6e 75  hers locks (Linu
6420: 78 54 68 72 65 61 64 73 29 2c 20 74 68 65 6e 20  xThreads), then 
6430: 77 65 0a 2a 2a 20 73 65 74 20 74 68 65 20 75 6e  we.** set the un
6440: 69 78 4c 6f 63 6b 4b 65 79 2e 74 69 64 20 66 69  ixLockKey.tid fi
6450: 65 6c 64 20 74 6f 20 74 68 65 20 74 68 72 65 61  eld to the threa
6460: 64 20 49 44 2e 20 20 49 66 20 74 68 72 65 61 64  d ID.  If thread
6470: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 0a 2a  s can override.*
6480: 2a 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f  * each others lo
6490: 63 6b 73 20 28 50 6f 73 69 78 20 61 6e 64 20 4e  cks (Posix and N
64a0: 50 54 4c 29 20 74 68 65 6e 20 74 69 64 20 69 73  PTL) then tid is
64b0: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a   always set to z
64c0: 65 72 6f 2e 0a 2a 2a 20 74 69 64 20 69 73 20 6f  ero..** tid is o
64d0: 6d 69 74 74 65 64 20 69 66 20 77 65 20 63 6f 6d  mitted if we com
64e0: 70 69 6c 65 20 77 69 74 68 6f 75 74 20 74 68 72  pile without thr
64f0: 65 61 64 69 6e 67 20 73 75 70 70 6f 72 74 20 6f  eading support o
6500: 72 20 6f 6e 20 61 6e 20 4f 53 0a 2a 2a 20 6f 74  r on an OS.** ot
6510: 68 65 72 20 74 68 61 6e 20 6c 69 6e 75 78 2e 0a  her than linux..
6520: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  */.struct unixLo
6530: 63 6b 4b 65 79 20 7b 0a 20 20 73 74 72 75 63 74  ckKey {.  struct
6540: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 64 3b   unixFileId fid;
6550: 20 20 2f 2a 20 55 6e 69 71 75 65 20 69 64 65 6e    /* Unique iden
6560: 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 66  tifier for the f
6570: 69 6c 65 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ile */.#if SQLIT
6580: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
6590: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
65a0: 5f 29 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74  _).  pthread_t t
65b0: 69 64 3b 20 20 2f 2a 20 54 68 72 65 61 64 20 49  id;  /* Thread I
65c0: 44 20 6f 66 20 6c 6f 63 6b 20 6f 77 6e 65 72 2e  D of lock owner.
65d0: 20 5a 65 72 6f 20 69 66 20 6e 6f 74 20 75 73 69   Zero if not usi
65e0: 6e 67 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  ng LinuxThreads 
65f0: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
6600: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
6610: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
6620: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
6630: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
6640: 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20   open.** inode. 
6650: 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72   Or, on LinuxThr
6660: 65 61 64 73 2c 20 74 68 65 72 65 20 69 73 20 6f  eads, there is o
6670: 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74 72 75  ne of these stru
6680: 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61  ctures for.** ea
6690: 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20  ch inode opened 
66a0: 62 79 20 65 61 63 68 20 74 68 72 65 61 64 2e 0a  by each thread..
66b0: 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69  **.** A single i
66c0: 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75  node can have mu
66d0: 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63  ltiple file desc
66e0: 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68  riptors, so each
66f0: 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72   unixFile.** str
6700: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
6710: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
6720: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
6730: 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73   object and this
6740: 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73  .** object keeps
6750: 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20   a count of the 
6760: 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69  number of unixFi
6770: 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69  le pointing to i
6780: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  t..*/.struct uni
6790: 78 4c 6f 63 6b 49 6e 66 6f 20 7b 0a 20 20 73 74  xLockInfo {.  st
67a0: 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 4b 65 79  ruct unixLockKey
67b0: 20 6c 6f 63 6b 4b 65 79 3b 20 20 20 20 20 2f 2a   lockKey;     /*
67c0: 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20   The lookup key 
67d0: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20  */.  int cnt;   
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6800: 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68  f SHARED locks h
6810: 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  eld */.  int loc
6820: 6b 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  ktype;          
6830: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
6840: 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  of SHARED_LOCK, 
6850: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74  RESERVED_LOCK et
6860: 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  c. */.  int nRef
6870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6880: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6890: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
68a0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
68b0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
68c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
68d0: 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 20 20 75 6e  KING_STYLE).  un
68e0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
68f0: 20 73 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a   sharedByte;  /*
6900: 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74   for AFP simulat
6910: 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a  ed shared lock *
6920: 2f 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75 63  /.#endif.  struc
6930: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a  t unixLockInfo *
6940: 70 4e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4c 69  pNext;     /* Li
6950: 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 4c 6f  st of all unixLo
6960: 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a  ckInfo objects *
6970: 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c  /.  struct unixL
6980: 6f 63 6b 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20  ockInfo *pPrev; 
6990: 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64      /*    .... d
69a0: 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a  oubly linked */.
69b0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
69c0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
69d0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
69e0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f   is allocated fo
69f0: 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69  r each open.** i
6a00: 6e 6f 64 65 2e 20 20 54 68 69 73 20 73 74 72 75  node.  This stru
6a10: 63 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63  cture keeps trac
6a20: 6b 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  k of the number 
6a30: 6f 66 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74  of locks on that
6a40: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 49 66 20 61  .** inode.  If a
6a50: 20 63 6c 6f 73 65 20 69 73 20 61 74 74 65 6d 70   close is attemp
6a60: 74 65 64 20 61 67 61 69 6e 73 74 20 61 6e 20 69  ted against an i
6a70: 6e 6f 64 65 20 74 68 61 74 20 69 73 20 68 6f 6c  node that is hol
6a80: 64 69 6e 67 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74  ding.** locks, t
6a90: 68 65 20 63 6c 6f 73 65 20 69 73 20 64 65 66 65  he close is defe
6aa0: 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6c  rred until all l
6ab0: 6f 63 6b 73 20 63 6c 65 61 72 20 62 79 20 61 64  ocks clear by ad
6ac0: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65  ding the.** file
6ad0: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62   descriptor to b
6ae0: 65 20 63 6c 6f 73 65 64 20 74 6f 20 74 68 65 20  e closed to the 
6af0: 70 65 6e 64 69 6e 67 20 6c 69 73 74 2e 0a 2a 2a  pending list..**
6b00: 0a 2a 2a 20 54 4f 44 4f 3a 20 20 43 6f 6e 73 69  .** TODO:  Consi
6b10: 64 65 72 20 63 68 61 6e 67 69 6e 67 20 74 68 69  der changing thi
6b20: 73 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  s so that there 
6b30: 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  is only a single
6b40: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
6b50: 74 6f 72 20 66 6f 72 20 65 61 63 68 20 6f 70 65  tor for each ope
6b60: 6e 20 66 69 6c 65 2c 20 65 76 65 6e 20 77 68 65  n file, even whe
6b70: 6e 20 69 74 20 69 73 20 6f 70 65 6e 65 64 20 6d  n it is opened m
6b80: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a  ultiple times..*
6b90: 2a 20 54 68 65 20 63 6c 6f 73 65 28 29 20 73 79  * The close() sy
6ba0: 73 74 65 6d 20 63 61 6c 6c 20 77 6f 75 6c 64 20  stem call would 
6bb0: 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e 20  only occur when 
6bc0: 74 68 65 20 6c 61 73 74 20 64 61 74 61 62 61 73  the last databas
6bd0: 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 66  e.** using the f
6be0: 69 6c 65 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 73  ile closes..*/.s
6bf0: 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e  truct unixOpenCn
6c00: 74 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  t {.  struct uni
6c10: 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20  xFileId fileId; 
6c20: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
6c30: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  key */.  int nRe
6c40: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
6c50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6c60: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
6c70: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
6c80: 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20    int nLock;    
6c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ca0: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   Number of outst
6cb0: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 2a 2f 0a  anding locks */.
6cc0: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
6cd0: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 2f 2a  pUnused;      /*
6ce0: 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   Unused file des
6cf0: 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73  criptors to clos
6d00: 65 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f  e */.#if OS_VXWO
6d10: 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  RKS.  sem_t *pSe
6d20: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
6d30: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20         /* Named 
6d40: 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20  POSIX semaphore 
6d50: 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61  */.  char aSemNa
6d60: 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
6d70: 32 5d 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  2];   /* Name of
6d80: 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20   that semaphore 
6d90: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75  */.#endif.  stru
6da0: 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
6db0: 70 4e 65 78 74 2c 20 2a 70 50 72 65 76 3b 20 20  pNext, *pPrev;  
6dc0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
6dd0: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 6f 62 6a 65  unixOpenCnt obje
6de0: 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  cts */.};../*.**
6df0: 20 4c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e   Lists of all un
6e00: 69 78 4c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 75  ixLockInfo and u
6e10: 6e 69 78 4f 70 65 6e 43 6e 74 20 6f 62 6a 65 63  nixOpenCnt objec
6e20: 74 73 2e 20 20 54 68 65 73 65 20 75 73 65 64 20  ts.  These used 
6e30: 74 6f 20 62 65 20 68 61 73 68 0a 2a 2a 20 74 61  to be hash.** ta
6e40: 62 6c 65 73 2e 20 20 42 75 74 20 74 68 65 20 6e  bles.  But the n
6e50: 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
6e60: 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20   is rarely more 
6e70: 74 68 61 6e 20 61 20 64 6f 7a 65 6e 20 61 6e 64  than a dozen and
6e80: 0a 2a 2a 20 6e 65 76 65 72 20 65 78 63 65 65 64  .** never exceed
6e90: 73 20 61 20 66 65 77 20 74 68 6f 75 73 61 6e 64  s a few thousand
6ea0: 2e 20 20 41 6e 64 20 6c 6f 6f 6b 75 70 20 69 73  .  And lookup is
6eb0: 20 6e 6f 74 20 6f 6e 20 61 20 63 72 69 74 69 63   not on a critic
6ec0: 61 6c 0a 2a 2a 20 70 61 74 68 20 73 6f 20 61 20  al.** path so a 
6ed0: 73 69 6d 70 6c 65 20 6c 69 6e 6b 65 64 20 6c 69  simple linked li
6ee0: 73 74 20 77 69 6c 6c 20 73 75 66 66 69 63 65 2e  st will suffice.
6ef0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
6f00: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a  t unixLockInfo *
6f10: 6c 6f 63 6b 4c 69 73 74 20 3d 20 30 3b 0a 73 74  lockList = 0;.st
6f20: 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69 78  atic struct unix
6f30: 4f 70 65 6e 43 6e 74 20 2a 6f 70 65 6e 4c 69 73  OpenCnt *openLis
6f40: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  t = 0;../*.** Th
6f50: 69 73 20 76 61 72 69 61 62 6c 65 20 72 65 6d 65  is variable reme
6f60: 6d 62 65 72 73 20 77 68 65 74 68 65 72 20 6f 72  mbers whether or
6f70: 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e   not threads can
6f80: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
6f90: 74 68 65 72 73 0a 2a 2a 20 6c 6f 63 6b 73 2e 0a  thers.** locks..
6fa0: 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 4e 6f 2e  **.**    0:  No.
6fb0: 20 20 54 68 72 65 61 64 73 20 63 61 6e 6e 6f 74    Threads cannot
6fc0: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
6fd0: 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20 28 4c  thers locks.  (L
6fe0: 69 6e 75 78 54 68 72 65 61 64 73 29 0a 2a 2a 20  inuxThreads).** 
6ff0: 20 20 20 31 3a 20 20 59 65 73 2e 20 20 54 68 72     1:  Yes.  Thr
7000: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
7010: 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f  e each others lo
7020: 63 6b 73 2e 20 20 28 50 6f 73 69 78 20 26 20 4e  cks.  (Posix & N
7030: 4c 50 54 29 0a 2a 2a 20 20 20 2d 31 3a 20 20 57  LPT).**   -1:  W
7040: 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20 79 65 74  e don't know yet
7050: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20  ..**.** On some 
7060: 73 79 73 74 65 6d 73 2c 20 77 65 20 6b 6e 6f 77  systems, we know
7070: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
7080: 20 69 66 20 74 68 72 65 61 64 73 20 63 61 6e 20   if threads can 
7090: 6f 76 65 72 72 69 64 65 20 65 61 63 68 0a 2a 2a  override each.**
70a0: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20   others locks.  
70b0: 4f 6e 20 74 68 6f 73 65 20 73 79 73 74 65 6d 73  On those systems
70c0: 2c 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48 52  , the SQLITE_THR
70d0: 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43  EAD_OVERRIDE_LOC
70e0: 4b 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6c 6c 20  K macro.** will 
70f0: 62 65 20 73 65 74 20 61 70 70 72 6f 70 72 69 61  be set appropria
7100: 74 65 6c 79 2e 20 20 4f 6e 20 6f 74 68 65 72 20  tely.  On other 
7110: 73 79 73 74 65 6d 73 2c 20 77 65 20 68 61 76 65  systems, we have
7120: 20 74 6f 20 63 68 65 63 6b 20 61 74 0a 2a 2a 20   to check at.** 
7130: 72 75 6e 74 69 6d 65 2e 20 20 4f 6e 20 74 68 65  runtime.  On the
7140: 73 65 20 6c 61 74 74 65 72 20 73 79 73 74 65 6d  se latter system
7150: 73 2c 20 53 51 4c 54 49 45 5f 54 48 52 45 41 44  s, SQLTIE_THREAD
7160: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 69  _OVERRIDE_LOCK i
7170: 73 0a 2a 2a 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s.** undefined..
7180: 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61  **.** This varia
7190: 62 6c 65 20 6e 6f 72 6d 61 6c 6c 79 20 68 61 73  ble normally has
71a0: 20 66 69 6c 65 20 73 63 6f 70 65 20 6f 6e 6c 79   file scope only
71b0: 2e 20 20 42 75 74 20 64 75 72 69 6e 67 20 74 65  .  But during te
71c0: 73 74 69 6e 67 2c 20 77 65 20 6d 61 6b 65 0a 2a  sting, we make.*
71d0: 2a 20 69 74 20 61 20 67 6c 6f 62 61 6c 20 73 6f  * it a global so
71e0: 20 74 68 61 74 20 74 68 65 20 74 65 73 74 20 63   that the test c
71f0: 6f 64 65 20 63 61 6e 20 63 68 61 6e 67 65 20 69  ode can change i
7200: 74 73 20 76 61 6c 75 65 20 69 6e 20 6f 72 64 65  ts value in orde
7210: 72 20 74 6f 20 76 65 72 69 66 79 0a 2a 2a 20 74  r to verify.** t
7220: 68 61 74 20 74 68 65 20 72 69 67 68 74 20 73 74  hat the right st
7230: 75 66 66 20 68 61 70 70 65 6e 73 20 69 6e 20 65  uff happens in e
7240: 69 74 68 65 72 20 63 61 73 65 2e 0a 2a 2f 0a 23  ither case..*/.#
7250: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
7260: 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28  SAFE && defined(
7270: 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20 20 69 66  __linux__).#  if
7280: 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 48 52 45  ndef SQLITE_THRE
7290: 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b  AD_OVERRIDE_LOCK
72a0: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
72b0: 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  ITE_THREAD_OVERR
72c0: 49 44 45 5f 4c 4f 43 4b 20 2d 31 0a 23 20 20 65  IDE_LOCK -1.#  e
72d0: 6e 64 69 66 0a 23 20 20 69 66 64 65 66 20 53 51  ndif.#  ifdef SQ
72e0: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 74 68  LITE_TEST.int th
72f0: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
7300: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53  hOthersLocks = S
7310: 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLITE_THREAD_OVE
7320: 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 20 20 65  RRIDE_LOCK;.#  e
7330: 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 74  lse.static int t
7340: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
7350: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20  chOthersLocks = 
7360: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56  SQLITE_THREAD_OV
7370: 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 20 20  ERRIDE_LOCK;.#  
7380: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
7390: 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74 75  .** This structu
73a0: 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61  re holds informa
73b0: 74 69 6f 6e 20 70 61 73 73 65 64 20 69 6e 74 6f  tion passed into
73c0: 20 69 6e 64 69 76 69 64 75 61 6c 20 74 65 73 74   individual test
73d0: 0a 2a 2a 20 74 68 72 65 61 64 73 20 62 79 20 74  .** threads by t
73e0: 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63  he testThreadLoc
73f0: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20 72  kingBehavior() r
7400: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63  outine..*/.struc
7410: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
7420: 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20   {.  int fd;    
7430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
7440: 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
7450: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f   */.  struct flo
7460: 63 6b 20 6c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20  ck lock;     /* 
7470: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  The locking oper
7480: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
7490: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
74a0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 74    /* Result of t
74b0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  he locking opera
74c0: 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20  tion */.};..#if 
74d0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
74e0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c  E && defined(__l
74f0: 69 6e 75 78 5f 5f 29 0a 2f 2a 0a 2a 2a 20 54 68  inux__)./*.** Th
7500: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
7510: 73 65 64 20 61 73 20 74 68 65 20 6d 61 69 6e 20  sed as the main 
7520: 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 74 68  routine for a th
7530: 72 65 61 64 20 6c 61 75 6e 63 68 65 64 20 62 79  read launched by
7540: 0a 2a 2a 20 74 65 73 74 54 68 72 65 61 64 4c 6f  .** testThreadLo
7550: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 2e  ckingBehavior().
7560: 20 49 74 20 74 65 73 74 73 20 77 68 65 74 68 65   It tests whethe
7570: 72 20 74 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  r the shared-loc
7580: 6b 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 62 79  k obtained.** by
7590: 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64   the main thread
75a0: 20 69 6e 20 74 65 73 74 54 68 72 65 61 64 4c 6f   in testThreadLo
75b0: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20  ckingBehavior() 
75c0: 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 61  conflicts with a
75d0: 0a 2a 2a 20 68 79 70 6f 74 68 65 74 69 63 61 6c  .** hypothetical
75e0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 62 74 61   write-lock obta
75f0: 69 6e 65 64 20 62 79 20 74 68 69 73 20 74 68 72  ined by this thr
7600: 65 61 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ead on the same 
7610: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
7620: 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f  write-lock is no
7630: 74 20 61 63 74 75 61 6c 6c 79 20 61 63 71 75 69  t actually acqui
7640: 72 65 64 2c 20 61 73 20 74 68 69 73 20 69 73 20  red, as this is 
7650: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 69 66 20  not possible if 
7660: 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 69 73 20  .** the file is 
7670: 6f 70 65 6e 20 69 6e 20 72 65 61 64 2d 6f 6e 6c  open in read-onl
7680: 79 20 6d 6f 64 65 20 28 73 65 65 20 74 69 63 6b  y mode (see tick
7690: 65 74 20 23 33 34 37 32 29 2e 0a 2a 2f 20 0a 73  et #3472)..*/ .s
76a0: 74 61 74 69 63 20 76 6f 69 64 20 2a 74 68 72 65  tatic void *thre
76b0: 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 28 76 6f  adLockingTest(vo
76c0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 74 72  id *pArg){.  str
76d0: 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61  uct threadTestDa
76e0: 74 61 20 2a 70 44 61 74 61 20 3d 20 28 73 74 72  ta *pData = (str
76f0: 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61  uct threadTestDa
7700: 74 61 2a 29 70 41 72 67 3b 0a 20 20 70 44 61 74  ta*)pArg;.  pDat
7710: 61 2d 3e 72 65 73 75 6c 74 20 3d 20 66 63 6e 74  a->result = fcnt
7720: 6c 28 70 44 61 74 61 2d 3e 66 64 2c 20 46 5f 47  l(pData->fd, F_G
7730: 45 54 4c 4b 2c 20 26 70 44 61 74 61 2d 3e 6c 6f  ETLK, &pData->lo
7740: 63 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 41  ck);.  return pA
7750: 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rg;.}.#endif /* 
7760: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
7770: 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c  E && defined(__l
7780: 69 6e 75 78 5f 5f 29 20 2a 2f 0a 0a 0a 23 69 66  inux__) */...#if
7790: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
77a0: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  FE && defined(__
77b0: 6c 69 6e 75 78 5f 5f 29 0a 2f 2a 0a 2a 2a 20 54  linux__)./*.** T
77c0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 61 74  his procedure at
77d0: 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d  tempts to determ
77e0: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
77f0: 6f 74 20 74 68 72 65 61 64 73 0a 2a 2a 20 63 61  ot threads.** ca
7800: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
7810: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 74 68 65  others locks the
7820: 6e 20 73 65 74 73 20 74 68 65 20 0a 2a 2a 20 74  n sets the .** t
7830: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
7840: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 76 61  chOthersLocks va
7850: 72 69 61 62 6c 65 20 61 70 70 72 6f 70 72 69 61  riable appropria
7860: 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
7870: 76 6f 69 64 20 74 65 73 74 54 68 72 65 61 64 4c  void testThreadL
7880: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 69  ockingBehavior(i
7890: 6e 74 20 66 64 5f 6f 72 69 67 29 7b 0a 20 20 69  nt fd_orig){.  i
78a0: 6e 74 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 3b  nt fd;.  int rc;
78b0: 0a 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64  .  struct thread
78c0: 54 65 73 74 44 61 74 61 20 64 3b 0a 20 20 73 74  TestData d;.  st
78d0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 3b 0a 20 20  ruct flock l;.  
78e0: 70 74 68 72 65 61 64 5f 74 20 74 3b 0a 0a 20 20  pthread_t t;..  
78f0: 66 64 20 3d 20 64 75 70 28 66 64 5f 6f 72 69 67  fd = dup(fd_orig
7900: 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 20  );.  if( fd<0 ) 
7910: 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74  return;.  memset
7920: 28 26 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c  (&l, 0, sizeof(l
7930: 29 29 3b 0a 20 20 6c 2e 6c 5f 74 79 70 65 20 3d  ));.  l.l_type =
7940: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 6c 2e 6c 5f   F_RDLCK;.  l.l_
7950: 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 2e 6c 5f 73  len = 1;.  l.l_s
7960: 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 2e 6c 5f  tart = 0;.  l.l_
7970: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
7980: 54 3b 0a 20 20 72 63 20 3d 20 66 63 6e 74 6c 28  T;.  rc = fcntl(
7990: 66 64 5f 6f 72 69 67 2c 20 46 5f 53 45 54 4c 4b  fd_orig, F_SETLK
79a0: 2c 20 26 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  , &l);.  if( rc!
79b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d  =0 ) return;.  m
79c0: 65 6d 73 65 74 28 26 64 2c 20 30 2c 20 73 69 7a  emset(&d, 0, siz
79d0: 65 6f 66 28 64 29 29 3b 0a 20 20 64 2e 66 64 20  eof(d));.  d.fd 
79e0: 3d 20 66 64 3b 0a 20 20 64 2e 6c 6f 63 6b 20 3d  = fd;.  d.lock =
79f0: 20 6c 3b 0a 20 20 64 2e 6c 6f 63 6b 2e 6c 5f 74   l;.  d.lock.l_t
7a00: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
7a10: 20 69 66 28 20 70 74 68 72 65 61 64 5f 63 72 65   if( pthread_cre
7a20: 61 74 65 28 26 74 2c 20 30 2c 20 74 68 72 65 61  ate(&t, 0, threa
7a30: 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20 26 64  dLockingTest, &d
7a40: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 74 68 72  )==0 ){.    pthr
7a50: 65 61 64 5f 6a 6f 69 6e 28 74 2c 20 30 29 3b 0a  ead_join(t, 0);.
7a60: 20 20 7d 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b    }.  close(fd);
7a70: 0a 20 20 69 66 28 20 64 2e 72 65 73 75 6c 74 21  .  if( d.result!
7a80: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 74  =0 ) return;.  t
7a90: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
7aa0: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20  chOthersLocks = 
7ab0: 28 64 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d  (d.lock.l_type==
7ac0: 46 5f 55 4e 4c 43 4b 29 3b 0a 7d 0a 23 65 6e 64  F_UNLCK);.}.#end
7ad0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52  if /* SQLITE_THR
7ae0: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
7af0: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 2a 2f  ed(__linux__) */
7b00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
7b10: 61 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73  a unixLockInfo s
7b20: 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75  tructure previou
7b30: 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
7b40: 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e   findLockInfo().
7b50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
7b60: 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74   entered using t
7b70: 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
7b80: 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
7b90: 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65  t be held.** whe
7ba0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
7bb0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
7bc0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
7bd0: 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75 63 74  eLockInfo(struct
7be0: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70   unixLockInfo *p
7bf0: 4c 6f 63 6b 29 7b 0a 20 20 61 73 73 65 72 74 28  Lock){.  assert(
7c00: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
7c10: 20 29 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 20   );.  if( pLock 
7c20: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52  ){.    pLock->nR
7c30: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c  ef--;.    if( pL
7c40: 6f 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ock->nRef==0 ){.
7c50: 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d        if( pLock-
7c60: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
7c70: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
7c80: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70  >pPrev->pNext==p
7c90: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20  Lock );.        
7ca0: 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e 70 4e  pLock->pPrev->pN
7cb0: 65 78 74 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ext = pLock->pNe
7cc0: 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
7cd0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7ce0: 20 6c 6f 63 6b 4c 69 73 74 3d 3d 70 4c 6f 63 6b   lockList==pLock
7cf0: 20 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b   );.        lock
7d00: 4c 69 73 74 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e  List = pLock->pN
7d10: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
7d20: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 4e     if( pLock->pN
7d30: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ext ){.        a
7d40: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 4e  ssert( pLock->pN
7d50: 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 4c 6f 63  ext->pPrev==pLoc
7d60: 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  k );.        pLo
7d70: 63 6b 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ck->pNext->pPrev
7d80: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 3b   = pLock->pPrev;
7d90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
7da0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
7db0: 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  k);.    }.  }.}.
7dc0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
7dd0: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72   unixOpenCnt str
7de0: 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c  ucture previousl
7df0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  y allocated by f
7e00: 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a  indLockInfo()..*
7e10: 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65  *.** The mutex e
7e20: 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65  ntered using the
7e30: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
7e40: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
7e50: 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20  be held.** when 
7e60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
7e70: 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
7e80: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4f  ic void releaseO
7e90: 70 65 6e 43 6e 74 28 73 74 72 75 63 74 20 75 6e  penCnt(struct un
7ea0: 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  ixOpenCnt *pOpen
7eb0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  ){.  assert( uni
7ec0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
7ed0: 20 20 69 66 28 20 70 4f 70 65 6e 20 29 7b 0a 20    if( pOpen ){. 
7ee0: 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d     pOpen->nRef--
7ef0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d  ;.    if( pOpen-
7f00: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
7f10: 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 70 50 72    if( pOpen->pPr
7f20: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ev ){.        as
7f30: 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 70 50 72  sert( pOpen->pPr
7f40: 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 4f 70 65 6e  ev->pNext==pOpen
7f50: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65   );.        pOpe
7f60: 6e 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  n->pPrev->pNext 
7f70: 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a  = pOpen->pNext;.
7f80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7f90: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 65       assert( ope
7fa0: 6e 4c 69 73 74 3d 3d 70 4f 70 65 6e 20 29 3b 0a  nList==pOpen );.
7fb0: 20 20 20 20 20 20 20 20 6f 70 65 6e 4c 69 73 74          openList
7fc0: 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b   = pOpen->pNext;
7fd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7fe0: 66 28 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 20  f( pOpen->pNext 
7ff0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
8000: 74 28 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 2d  t( pOpen->pNext-
8010: 3e 70 50 72 65 76 3d 3d 70 4f 70 65 6e 20 29 3b  >pPrev==pOpen );
8020: 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  .        pOpen->
8030: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
8040: 4f 70 65 6e 2d 3e 70 50 72 65 76 3b 0a 20 20 20  Open->pPrev;.   
8050: 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
8060: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65  THREADSAFE && de
8070: 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
8080: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
8090: 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64 20 7c  pOpen->pUnused |
80a0: 7c 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  | threadsOverrid
80b0: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
80c0: 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ==0 );.#endif.. 
80d0: 20 20 20 20 20 2f 2a 20 49 66 20 70 4f 70 65 6e       /* If pOpen
80e0: 2d 3e 70 55 6e 75 73 65 64 20 69 73 20 6e 6f 74  ->pUnused is not
80f0: 20 6e 75 6c 6c 2c 20 74 68 65 6e 20 6d 65 6d 6f   null, then memo
8100: 72 79 20 61 6e 64 20 66 69 6c 65 2d 64 65 73 63  ry and file-desc
8110: 72 69 70 74 6f 72 73 0a 20 20 20 20 20 20 2a 2a  riptors.      **
8120: 20 61 72 65 20 6c 65 61 6b 65 64 2e 0a 20 20 20   are leaked..   
8130: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
8140: 68 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61  his will only ha
8150: 70 70 65 6e 20 69 66 2c 20 75 6e 64 65 72 20 4c  ppen if, under L
8160: 69 6e 75 78 74 68 72 65 61 64 73 2c 20 74 68 65  inuxthreads, the
8170: 20 75 73 65 72 20 68 61 73 20 6f 70 65 6e 65 64   user has opened
8180: 0a 20 20 20 20 20 20 2a 2a 20 61 20 74 72 61 6e  .      ** a tran
8190: 73 61 63 74 69 6f 6e 20 69 6e 20 6f 6e 65 20 74  saction in one t
81a0: 68 72 65 61 64 2c 20 74 68 65 6e 20 61 74 74 65  hread, then atte
81b0: 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 68  mpts to close th
81c0: 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  e database.     
81d0: 20 2a 2a 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20   ** handle from 
81e0: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 28  another thread (
81f0: 77 69 74 68 6f 75 74 20 66 69 72 73 74 20 75 6e  without first un
8200: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 62 20 66  locking the db f
8210: 69 6c 65 29 2e 0a 20 20 20 20 20 20 2a 2a 20 54  ile)..      ** T
8220: 68 69 73 20 69 73 20 61 20 6d 69 73 75 73 65 2e  his is a misuse.
8230: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
8240: 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 29 3b 0a  e3_free(pOpen);.
8250: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
8260: 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20  ** Given a file 
8270: 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61  descriptor, loca
8280: 74 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  te unixLockInfo 
8290: 61 6e 64 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  and unixOpenCnt 
82a0: 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74 0a  structures that.
82b0: 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61  ** describes tha
82c0: 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  t file descripto
82d0: 72 2e 20 20 43 72 65 61 74 65 20 6e 65 77 20 6f  r.  Create new o
82e0: 6e 65 73 20 69 66 20 6e 65 63 65 73 73 61 72 79  nes if necessary
82f0: 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e  .  The.** return
8300: 20 76 61 6c 75 65 73 20 6d 69 67 68 74 20 62 65   values might be
8310: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69   uninitialized i
8320: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
8330: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  s..**.** The mut
8340: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
8350: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
8360: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
8370: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
8380: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
8390: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
83a0: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70  ** Return an app
83b0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
83c0: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
83d0: 6e 74 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28  nt findLockInfo(
83e0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
83f0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
8400: 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77    /* Unix file w
8410: 69 74 68 20 66 69 6c 65 20 64 65 73 63 20 75 73  ith file desc us
8420: 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f  ed in the key */
8430: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  .  struct unixLo
8440: 63 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63 6b 2c  ckInfo **ppLock,
8450: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
8460: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73 74 72  unixLockInfo str
8470: 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
8480: 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e   struct unixOpen
8490: 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20 20 20 20  Cnt **ppOpen    
84a0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e  /* Return the un
84b0: 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  ixOpenCnt struct
84c0: 75 72 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ure here */.){. 
84d0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84f0: 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72  /* System call r
8500: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
8510: 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8530: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
8540: 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20  iptor for pFile 
8550: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
8560: 4c 6f 63 6b 4b 65 79 20 6c 6f 63 6b 4b 65 79 3b  LockKey lockKey;
8570: 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65      /* Lookup ke
8580: 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 4c 6f  y for the unixLo
8590: 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ckInfo structure
85a0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
85b0: 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20  xFileId fileId; 
85c0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b       /* Lookup k
85d0: 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 4f  ey for the unixO
85e0: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 20 2a 2f  penCnt struct */
85f0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
8600: 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20  tatbuf;         
8610: 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66    /* Low-level f
8620: 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ile information 
8630: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
8640: 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 20  LockInfo *pLock 
8650: 3d 20 30 3b 2f 2a 20 43 61 6e 64 69 64 61 74 65  = 0;/* Candidate
8660: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 6f 62   unixLockInfo ob
8670: 6a 65 63 74 20 2a 2f 0a 20 20 73 74 72 75 63 74  ject */.  struct
8680: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f   unixOpenCnt *pO
8690: 70 65 6e 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64  pen;     /* Cand
86a0: 69 64 61 74 65 20 75 6e 69 78 4f 70 65 6e 43 6e  idate unixOpenCn
86b0: 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61  t object */..  a
86c0: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
86d0: 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20  Held() );..  /* 
86e0: 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e  Get low-level in
86f0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
8700: 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65  the file that we
8710: 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a   can used to.  *
8720: 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  * create a uniqu
8730: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66  e name for the f
8740: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d  ile..  */.  fd =
8750: 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20   pFile->h;.  rc 
8760: 3d 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61  = fstat(fd, &sta
8770: 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  tbuf);.  if( rc!
8780: 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  =0 ){.    pFile-
8790: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
87a0: 6e 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52  no;.#ifdef EOVER
87b0: 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69  FLOW.    if( pFi
87c0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
87d0: 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72  OVERFLOW ) retur
87e0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a  n SQLITE_NOLFS;.
87f0: 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
8800: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
8810: 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50    }..#ifdef __AP
8820: 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53  PLE__.  /* On OS
8830: 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66   X on an msdos f
8840: 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69  ilesystem, the i
8850: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72  node number is r
8860: 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63  eported.  ** inc
8870: 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72  orrectly for zer
8880: 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53  o-size files.  S
8890: 65 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e  ee ticket #3260.
88a0: 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61    To work.  ** a
88b0: 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c  round this probl
88c0: 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20  em (we consider 
88d0: 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58  it a bug in OS X
88e0: 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20  , not SQLite).  
88f0: 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63  ** we always inc
8900: 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73  rease the file s
8910: 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74  ize to 1 by writ
8920: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ing a single byt
8930: 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20  e.  ** prior to 
8940: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e  accessing the in
8950: 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ode number.  The
8960: 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65   one byte writte
8970: 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43  n is.  ** an ASC
8980: 49 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72  II 'S' character
8990: 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70   which also happ
89a0: 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69  ens to be the fi
89b0: 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e  rst byte.  ** in
89c0: 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65   the header of e
89d0: 76 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61  very SQLite data
89e0: 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77  base.  In this w
89f0: 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a  ay, if there.  *
8a00: 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64  * is a race cond
8a10: 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ition such that 
8a20: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
8a30: 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c  as already popul
8a40: 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69  ated.  ** the fi
8a50: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
8a60: 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d  database, no dam
8a70: 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a  age is done..  *
8a80: 2f 0a 20 20 69 66 20 28 28 20 73 74 61 74 62 75  /.  if (( statbu
8a90: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 20 26  f.st_size==0 ) &
8aa0: 26 20 28 30 20 21 3d 20 28 70 46 69 6c 65 2d 3e  & (0 != (pFile->
8ab0: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
8ac0: 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
8ad0: 53 29 29 29 20 7b 0a 20 20 20 20 20 20 72 63 20  S))) {.      rc 
8ae0: 3d 20 77 72 69 74 65 28 66 64 2c 20 22 53 22 2c  = write(fd, "S",
8af0: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
8b00: 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=1 ){.        
8b10: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
8b20: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
8b30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8b40: 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 7d 0a 20  IOERR;.      }. 
8b50: 20 20 20 20 20 72 63 20 3d 20 66 73 74 61 74 28       rc = fstat(
8b60: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
8b70: 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
8b80: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
8b90: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
8ba0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  no;.        retu
8bb0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
8bc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
8bd0: 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28  endif..  memset(
8be0: 26 6c 6f 63 6b 4b 65 79 2c 20 30 2c 20 73 69 7a  &lockKey, 0, siz
8bf0: 65 6f 66 28 6c 6f 63 6b 4b 65 79 29 29 3b 0a 20  eof(lockKey));. 
8c00: 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e 64 65 76   lockKey.fid.dev
8c10: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65   = statbuf.st_de
8c20: 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  v;.#if OS_VXWORK
8c30: 53 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e  S.  lockKey.fid.
8c40: 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64  pId = pFile->pId
8c50: 3b 0a 23 65 6c 73 65 0a 20 20 6c 6f 63 6b 4b 65  ;.#else.  lockKe
8c60: 79 2e 66 69 64 2e 69 6e 6f 20 3d 20 73 74 61 74  y.fid.ino = stat
8c70: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64  buf.st_ino;.#end
8c80: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  if.#if SQLITE_TH
8c90: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
8ca0: 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20  ned(__linux__). 
8cb0: 20 69 66 28 20 74 68 72 65 61 64 73 4f 76 65 72   if( threadsOver
8cc0: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
8cd0: 63 6b 73 3c 30 20 29 7b 0a 20 20 20 20 74 65 73  cks<0 ){.    tes
8ce0: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
8cf0: 68 61 76 69 6f 72 28 66 64 29 3b 0a 20 20 7d 0a  havior(fd);.  }.
8d00: 20 20 6c 6f 63 6b 4b 65 79 2e 74 69 64 20 3d 20    lockKey.tid = 
8d10: 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
8d20: 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3f  achOthersLocks ?
8d30: 20 30 20 3a 20 70 74 68 72 65 61 64 5f 73 65 6c   0 : pthread_sel
8d40: 66 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 69  f();.#endif.  fi
8d50: 6c 65 49 64 20 3d 20 6c 6f 63 6b 4b 65 79 2e 66  leId = lockKey.f
8d60: 69 64 3b 0a 20 20 69 66 28 20 70 70 4c 6f 63 6b  id;.  if( ppLock
8d70: 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  !=0 ){.    pLock
8d80: 20 3d 20 6c 6f 63 6b 4c 69 73 74 3b 0a 20 20 20   = lockList;.   
8d90: 20 77 68 69 6c 65 28 20 70 4c 6f 63 6b 20 26 26   while( pLock &&
8da0: 20 6d 65 6d 63 6d 70 28 26 6c 6f 63 6b 4b 65 79   memcmp(&lockKey
8db0: 2c 20 26 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 4b 65  , &pLock->lockKe
8dc0: 79 2c 20 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b 65  y, sizeof(lockKe
8dd0: 79 29 29 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  y)) ){.      pLo
8de0: 63 6b 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78  ck = pLock->pNex
8df0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
8e00: 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20   pLock==0 ){.   
8e10: 20 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74     pLock = sqlit
8e20: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
8e30: 66 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20 20 20  f(*pLock) );.   
8e40: 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20     if( pLock==0 
8e50: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
8e60: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8e70: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
8e80: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
8e90: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63      }.      memc
8ea0: 70 79 28 26 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 4b  py(&pLock->lockK
8eb0: 65 79 2c 26 6c 6f 63 6b 4b 65 79 2c 73 69 7a 65  ey,&lockKey,size
8ec0: 6f 66 28 6c 6f 63 6b 4b 65 79 29 29 3b 0a 20 20  of(lockKey));.  
8ed0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 20      pLock->nRef 
8ee0: 3d 20 31 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  = 1;.      pLock
8ef0: 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  ->cnt = 0;.     
8f00: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
8f10: 20 3d 20 30 3b 0a 23 69 66 20 64 65 66 69 6e 65   = 0;.#if define
8f20: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
8f30: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 20  LOCKING_STYLE). 
8f40: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 73 68 61 72       pLock->shar
8f50: 65 64 42 79 74 65 20 3d 20 30 3b 0a 23 65 6e 64  edByte = 0;.#end
8f60: 69 66 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  if.      pLock->
8f70: 70 4e 65 78 74 20 3d 20 6c 6f 63 6b 4c 69 73 74  pNext = lockList
8f80: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  ;.      pLock->p
8f90: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
8fa0: 69 66 28 20 6c 6f 63 6b 4c 69 73 74 20 29 20 6c  if( lockList ) l
8fb0: 6f 63 6b 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  ockList->pPrev =
8fc0: 20 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 6c 6f   pLock;.      lo
8fd0: 63 6b 4c 69 73 74 20 3d 20 70 4c 6f 63 6b 3b 0a  ckList = pLock;.
8fe0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8ff0: 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a   pLock->nRef++;.
9000: 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4c 6f 63      }.    *ppLoc
9010: 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 20  k = pLock;.  }. 
9020: 20 69 66 28 20 70 70 4f 70 65 6e 21 3d 30 20 29   if( ppOpen!=0 )
9030: 7b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 6f 70  {.    pOpen = op
9040: 65 6e 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c  enList;.    whil
9050: 65 28 20 70 4f 70 65 6e 20 26 26 20 6d 65 6d 63  e( pOpen && memc
9060: 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 4f 70  mp(&fileId, &pOp
9070: 65 6e 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65  en->fileId, size
9080: 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20  of(fileId)) ){. 
9090: 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 70 4f 70       pOpen = pOp
90a0: 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  en->pNext;.    }
90b0: 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d  .    if( pOpen==
90c0: 30 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e  0 ){.      pOpen
90d0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
90e0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4f 70 65 6e  c( sizeof(*pOpen
90f0: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
9100: 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Open==0 ){.     
9110: 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
9120: 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  fo(pLock);.     
9130: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
9140: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f  OMEM;.        go
9150: 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b  to exit_findlock
9160: 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  info;.      }.  
9170: 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 65 6e      memset(pOpen
9180: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 70  , 0, sizeof(*pOp
9190: 65 6e 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 65  en));.      pOpe
91a0: 6e 2d 3e 66 69 6c 65 49 64 20 3d 20 66 69 6c 65  n->fileId = file
91b0: 49 64 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d  Id;.      pOpen-
91c0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
91d0: 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 20 3d 20   pOpen->pNext = 
91e0: 6f 70 65 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20  openList;.      
91f0: 69 66 28 20 6f 70 65 6e 4c 69 73 74 20 29 20 6f  if( openList ) o
9200: 70 65 6e 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  penList->pPrev =
9210: 20 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 6f 70   pOpen;.      op
9220: 65 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e 3b 0a  enList = pOpen;.
9230: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9240: 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b 3b 0a   pOpen->nRef++;.
9250: 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4f 70 65      }.    *ppOpe
9260: 6e 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 7d 0a 0a  n = pOpen;.  }..
9270: 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66  exit_findlockinf
9280: 6f 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  o:.  return rc;.
9290: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
92a0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  re currently in 
92b0: 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65  a different thre
92c0: 61 64 20 74 68 61 6e 20 74 68 65 20 74 68 72 65  ad than the thre
92d0: 61 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 75  ad that the.** u
92e0: 6e 69 78 46 69 6c 65 20 61 72 67 75 6d 65 6e 74  nixFile argument
92f0: 20 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 74 68 65   belongs to, the
9300: 6e 20 74 72 61 6e 73 66 65 72 20 6f 77 6e 65 72  n transfer owner
9310: 73 68 69 70 20 6f 66 20 74 68 65 20 75 6e 69 78  ship of the unix
9320: 46 69 6c 65 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  File.** over to 
9330: 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
9340: 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69 78  ad..**.** A unix
9350: 46 69 6c 65 20 69 73 20 6f 6e 6c 79 20 6f 77 6e  File is only own
9360: 65 64 20 62 79 20 61 20 74 68 72 65 61 64 20 6f  ed by a thread o
9370: 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 75  n systems that u
9380: 73 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e  se LinuxThreads.
9390: 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65 72 73 68 69 70  .**.** Ownership
93a0: 20 74 72 61 6e 73 66 65 72 20 69 73 20 6f 6e 6c   transfer is onl
93b0: 79 20 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65  y allowed if the
93c0: 20 75 6e 69 78 46 69 6c 65 20 69 73 20 63 75 72   unixFile is cur
93d0: 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e  rently unlocked.
93e0: 0a 2a 2a 20 49 66 20 74 68 65 20 75 6e 69 78 46  .** If the unixF
93f0: 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 61 6e  ile is locked an
9400: 64 20 61 6e 20 6f 77 6e 65 72 73 68 69 70 20 69  d an ownership i
9410: 73 20 77 72 6f 6e 67 2c 20 74 68 65 6e 20 72 65  s wrong, then re
9420: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  turn.** SQLITE_M
9430: 49 53 55 53 45 2e 20 20 53 51 4c 49 54 45 5f 4f  ISUSE.  SQLITE_O
9440: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
9450: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
9460: 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  s..*/.#if SQLITE
9470: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64  _THREADSAFE && d
9480: 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
9490: 29 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61  ).static int tra
94a0: 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 75  nsferOwnership(u
94b0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
94c0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 74 68  .  int rc;.  pth
94d0: 72 65 61 64 5f 74 20 68 53 65 6c 66 3b 0a 20 20  read_t hSelf;.  
94e0: 69 66 28 20 74 68 72 65 61 64 73 4f 76 65 72 72  if( threadsOverr
94f0: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
9500: 6b 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 77 6e  ks ){.    /* Own
9510: 65 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 73  ership transfers
9520: 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 74   not needed on t
9530: 68 69 73 20 73 79 73 74 65 6d 20 2a 2f 0a 20 20  his system */.  
9540: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9550: 4f 4b 3b 0a 20 20 7d 0a 20 20 68 53 65 6c 66 20  OK;.  }.  hSelf 
9560: 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  = pthread_self()
9570: 3b 0a 20 20 69 66 28 20 70 74 68 72 65 61 64 5f  ;.  if( pthread_
9580: 65 71 75 61 6c 28 70 46 69 6c 65 2d 3e 74 69 64  equal(pFile->tid
9590: 2c 20 68 53 65 6c 66 29 20 29 7b 0a 20 20 20 20  , hSelf) ){.    
95a0: 2f 2a 20 57 65 20 61 72 65 20 73 74 69 6c 6c 20  /* We are still 
95b0: 69 6e 20 74 68 65 20 73 61 6d 65 20 74 68 72 65  in the same thre
95c0: 61 64 20 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43  ad */.    OSTRAC
95d0: 45 31 28 22 4e 6f 2d 74 72 61 6e 73 66 65 72 2c  E1("No-transfer,
95e0: 20 73 61 6d 65 20 74 68 72 65 61 64 5c 6e 22 29   same thread\n")
95f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
9600: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
9610: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
9620: 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  e!=NO_LOCK ){.  
9630: 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20 63    /* We cannot c
9640: 68 61 6e 67 65 20 6f 77 6e 65 72 73 68 69 70 20  hange ownership 
9650: 77 68 69 6c 65 20 77 65 20 61 72 65 20 68 6f 6c  while we are hol
9660: 64 69 6e 67 20 61 20 6c 6f 63 6b 21 20 2a 2f 0a  ding a lock! */.
9670: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9680: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
9690: 4f 53 54 52 41 43 45 34 28 22 54 72 61 6e 73 66  OSTRACE4("Transf
96a0: 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  er ownership of 
96b0: 25 64 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64  %d from %d to %d
96c0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
96d0: 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
96e0: 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29 3b 0a 20  ->tid, hSelf);. 
96f0: 20 70 46 69 6c 65 2d 3e 74 69 64 20 3d 20 68 53   pFile->tid = hS
9700: 65 6c 66 3b 0a 20 20 69 66 20 28 70 46 69 6c 65  elf;.  if (pFile
9710: 2d 3e 70 4c 6f 63 6b 20 21 3d 20 4e 55 4c 4c 29  ->pLock != NULL)
9720: 20 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f   {.    releaseLo
9730: 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c  ckInfo(pFile->pL
9740: 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ock);.    rc = f
9750: 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c  indLockInfo(pFil
9760: 65 2c 20 26 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  e, &pFile->pLock
9770: 2c 20 30 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  , 0);.    OSTRAC
9780: 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 69  E5("LOCK    %d i
9790: 73 20 6e 6f 77 20 25 73 28 25 73 2c 25 64 29 5c  s now %s(%s,%d)\
97a0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
97b0: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
97c0: 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  eName(pFile->loc
97d0: 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20 20 20  ktype),.        
97e0: 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28     locktypeName(
97f0: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f  pFile->pLock->lo
9800: 63 6b 74 79 70 65 29 2c 20 70 46 69 6c 65 2d 3e  cktype), pFile->
9810: 70 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20  pLock->cnt);.   
9820: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
9830: 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
9840: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
9850: 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 69 66 20  .}.#else  /* if 
9860: 6e 6f 74 20 53 51 4c 49 54 45 5f 54 48 52 45 41  not SQLITE_THREA
9870: 44 53 41 46 45 20 2a 2f 0a 20 20 2f 2a 20 4f 6e  DSAFE */.  /* On
9880: 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
9890: 20 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68   builds, ownersh
98a0: 69 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 61  ip transfer is a
98b0: 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69   no-op */.# defi
98c0: 6e 65 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72  ne transferOwner
98d0: 73 68 69 70 28 58 29 20 53 51 4c 49 54 45 5f 4f  ship(X) SQLITE_O
98e0: 4b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  K.#endif /* SQLI
98f0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 2a 2f  TE_THREADSAFE */
9900: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
9910: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
9920: 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
9930: 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
9940: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
9950: 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
9960: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
9970: 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
9980: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
9990: 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
99a0: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
99b0: 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
99c0: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
99d0: 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
99e0: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
99f0: 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
9a00: 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
9a10: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
9a20: 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
9a30: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
9a40: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
9a50: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
9a60: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
9a70: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
9a80: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
9a90: 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
9aa0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
9ab0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
9ac0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
9ad0: 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
9ae0: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
9af0: 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20  ERVEDLOCK; );.. 
9b00: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
9b10: 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
9b20: 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
9b30: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73   pFile->pLock is
9b40: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
9b50: 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20  hreads */..  /* 
9b60: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
9b70: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
9b80: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
9b90: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
9ba0: 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  le->pLock->lockt
9bb0: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
9bc0: 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
9bd0: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  = 1;.  }..  /* O
9be0: 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
9bf0: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
9c00: 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a  ss holds it..  *
9c10: 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50  /.#ifndef __DJGP
9c20: 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72  P__.  if( !reser
9c30: 76 65 64 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ved ){.    struc
9c40: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
9c50: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
9c60: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
9c70: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
9c80: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
9c90: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
9ca0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
9cb0: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
9cc0: 20 69 66 20 28 2d 31 20 3d 3d 20 66 63 6e 74 6c   if (-1 == fcntl
9cd0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54  (pFile->h, F_GET
9ce0: 4c 4b 2c 20 26 6c 6f 63 6b 29 29 20 7b 0a 20 20  LK, &lock)) {.  
9cf0: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
9d00: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
9d10: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
9d20: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
9d30: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
9d40: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
9d50: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  OCK);.      pFil
9d60: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
9d70: 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73  Errno;.    } els
9d80: 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70  e if( lock.l_typ
9d90: 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e!=F_UNLCK ){.  
9da0: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
9db0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
9dc0: 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76  if.  .  unixLeav
9dd0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
9de0: 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE4("TEST WR-LO
9df0: 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20  CK %d %d %d\n", 
9e00: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
9e10: 73 65 72 76 65 64 29 3b 0a 0a 20 20 2a 70 52 65  served);..  *pRe
9e20: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
9e30: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9e40: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
9e50: 4e 41 42 4c 45 5f 4e 46 53 5f 52 41 4e 47 45 4c  NABLE_NFS_RANGEL
9e60: 4f 43 4b 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72  OCK./*.** Perfor
9e70: 6d 20 61 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  m a file locking
9e80: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 61 20   operation on a 
9e90: 72 61 6e 67 65 20 6f 66 20 62 79 74 65 73 20 69  range of bytes i
9ea0: 6e 20 61 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65  n a file..** The
9eb0: 20 22 6f 70 22 20 70 61 72 61 6d 65 74 65 72 20   "op" parameter 
9ec0: 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66  should be one of
9ed0: 20 46 5f 52 44 4c 43 4b 2c 20 46 5f 57 52 4c 43   F_RDLCK, F_WRLC
9ee0: 4b 2c 20 6f 72 20 46 5f 55 4e 4c 43 4b 2e 0a 2a  K, or F_UNLCK..*
9ef0: 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75  * Return 0 on su
9f00: 63 63 65 73 73 20 6f 72 20 2d 31 20 66 6f 72 20  ccess or -1 for 
9f10: 66 61 69 6c 75 72 65 2e 20 20 4f 6e 20 66 61 69  failure.  On fai
9f20: 6c 75 72 65 2c 20 77 72 69 74 65 20 74 68 65 20  lure, write the 
9f30: 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 6e  error.** code in
9f40: 74 6f 20 2a 70 45 72 72 63 6f 64 65 2e 0a 2a 2a  to *pErrcode..**
9f50: 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54  .** If the SQLIT
9f60: 45 5f 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43  E_WHOLE_FILE_LOC
9f70: 4b 49 4e 47 20 62 69 74 20 69 73 20 63 6c 65 61  KING bit is clea
9f80: 72 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6c 6f 63  r, then only loc
9f90: 6b 0a 2a 2a 20 74 68 65 20 72 61 6e 67 65 20 6f  k.** the range o
9fa0: 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6c  f bytes on the l
9fb0: 6f 63 6b 69 6e 67 20 70 61 67 65 20 62 65 74 77  ocking page betw
9fc0: 65 65 6e 20 53 48 41 52 45 44 5f 46 49 52 53 54  een SHARED_FIRST
9fd0: 20 61 6e 64 0a 2a 2a 20 53 48 41 52 45 44 5f 53   and.** SHARED_S
9fe0: 49 5a 45 2e 20 20 49 66 20 53 51 4c 49 54 45 5f  IZE.  If SQLITE_
9ff0: 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49  WHOLE_FILE_LOCKI
a000: 4e 47 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  NG is set, then 
a010: 6c 6f 63 6b 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  lock all.** byte
a020: 73 20 66 72 6f 6d 20 30 20 75 70 20 74 6f 20 62  s from 0 up to b
a030: 75 74 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  ut not including
a040: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 61   PENDING_BYTE, a
a050: 6e 64 20 61 6c 6c 20 62 79 74 65 73 0a 2a 2a 20  nd all bytes.** 
a060: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 53 48 41 52  that follow SHAR
a070: 45 44 5f 46 49 52 53 54 2e 0a 2a 2a 0a 2a 2a 20  ED_FIRST..**.** 
a080: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
a090: 6f 66 20 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f  of SQLITE_WHOLE_
a0a0: 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 20 69 66 20  FILE_LOCKING if 
a0b0: 66 61 6c 73 65 20 28 74 68 65 20 68 69 73 74 6f  false (the histo
a0c0: 72 69 63 61 6c 0a 2a 2a 20 64 65 66 61 75 6c 74  rical.** default
a0d0: 20 63 61 73 65 29 20 74 68 65 6e 20 6f 6e 6c 79   case) then only
a0e0: 20 6c 6f 63 6b 20 61 20 73 6d 61 6c 6c 20 72 61   lock a small ra
a0f0: 6e 67 65 20 6f 66 20 62 79 74 65 73 20 66 72 6f  nge of bytes fro
a100: 6d 20 53 48 41 52 45 44 5f 46 49 52 53 54 0a 2a  m SHARED_FIRST.*
a110: 2a 20 74 68 72 6f 75 67 68 20 53 48 41 52 45 44  * through SHARED
a120: 5f 46 49 52 53 54 2b 53 48 41 52 45 44 5f 53 49  _FIRST+SHARED_SI
a130: 5a 45 2d 31 2e 20 20 42 75 74 20 69 66 20 53 51  ZE-1.  But if SQ
a140: 4c 49 54 45 5f 57 48 4f 4c 45 5f 46 49 4c 45 5f  LITE_WHOLE_FILE_
a150: 4c 4f 43 4b 49 4e 47 20 69 73 0a 2a 2a 20 74 72  LOCKING is.** tr
a160: 75 65 20 74 68 65 6e 20 6c 6f 63 6b 20 65 76 65  ue then lock eve
a170: 72 79 20 62 79 74 65 20 69 6e 20 74 68 65 20 66  ry byte in the f
a180: 69 6c 65 20 65 78 63 65 70 74 20 66 6f 72 20 50  ile except for P
a190: 45 4e 44 49 4e 47 5f 42 59 54 45 20 61 6e 64 0a  ENDING_BYTE and.
a1a0: 2a 2a 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  ** RESERVED_BYTE
a1b0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 57  ..**.** SQLITE_W
a1c0: 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e  HOLE_FILE_LOCKIN
a1d0: 47 3d 74 72 75 65 20 6f 76 65 72 6c 61 70 73 20  G=true overlaps 
a1e0: 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f 46 49 4c  SQLITE_WHOLE_FIL
a1f0: 45 5f 4c 4f 43 4b 49 4e 47 3d 66 61 6c 73 65 0a  E_LOCKING=false.
a200: 2a 2a 20 61 6e 64 20 73 6f 20 74 68 65 20 6c 6f  ** and so the lo
a210: 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72  cking schemes ar
a220: 65 20 63 6f 6d 70 61 74 69 62 6c 65 2e 20 20 4f  e compatible.  O
a230: 6e 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20  ne type of lock 
a240: 77 69 6c 6c 0a 2a 2a 20 65 66 66 65 63 74 69 76  will.** effectiv
a250: 65 6c 79 20 65 78 63 6c 75 64 65 20 74 68 65 20  ely exclude the 
a260: 6f 74 68 65 72 20 74 79 70 65 2e 20 20 54 68 65  other type.  The
a270: 20 72 65 61 73 6f 6e 20 66 6f 72 20 75 73 69 6e   reason for usin
a280: 67 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  g the.** SQLITE_
a290: 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49  WHOLE_FILE_LOCKI
a2a0: 4e 47 3d 74 72 75 65 20 69 73 20 74 68 61 74 20  NG=true is that 
a2b0: 62 79 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  by indicating th
a2c0: 65 20 66 75 6c 6c 20 72 61 6e 67 65 0a 2a 2a 20  e full range.** 
a2d0: 6f 66 20 62 79 74 65 73 20 74 6f 20 62 65 20 72  of bytes to be r
a2e0: 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2c 20  ead or written, 
a2f0: 77 65 20 67 69 76 65 20 68 69 6e 74 73 20 74 6f  we give hints to
a300: 20 4e 46 53 20 74 6f 20 68 65 6c 70 20 69 74 0a   NFS to help it.
a310: 2a 2a 20 6d 61 69 6e 74 61 69 6e 20 63 61 63 68  ** maintain cach
a320: 65 20 63 6f 68 65 72 65 6e 63 79 2e 20 20 4f 6e  e coherency.  On
a330: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
a340: 20 77 68 6f 6c 65 20 66 69 6c 65 20 6c 6f 63 6b   whole file lock
a350: 69 6e 67 0a 2a 2a 20 69 73 20 73 6c 6f 77 65 72  ing.** is slower
a360: 2c 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 77 61  , so we don't wa
a370: 6e 74 20 74 6f 20 75 73 65 20 69 74 20 65 78 63  nt to use it exc
a380: 65 70 74 20 66 6f 72 20 4e 46 53 2e 0a 2a 2f 0a  ept for NFS..*/.
a390: 73 74 61 74 69 63 20 69 6e 74 20 72 61 6e 67 65  static int range
a3a0: 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
a3b0: 46 69 6c 65 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  File, int op, in
a3c0: 74 20 2a 70 45 72 72 63 6f 64 65 29 7b 0a 20 20  t *pErrcode){.  
a3d0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
a3e0: 6b 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6c  k;.  int rc;.  l
a3f0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 6f 70 3b  ock.l_type = op;
a400: 0a 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20  .  lock.l_start 
a410: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
a420: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
a430: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66  = SEEK_SET;.  if
a440: 28 20 28 70 46 69 6c 65 2d 3e 66 69 6c 65 46 6c  ( (pFile->fileFl
a450: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 48 4f  ags & SQLITE_WHO
a460: 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 29  LE_FILE_LOCKING)
a470: 3d 3d 30 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e  ==0 ){.    lock.
a480: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
a490: 49 5a 45 3b 0a 20 20 20 20 72 63 20 3d 20 66 63  IZE;.    rc = fc
a4a0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
a4b0: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
a4c0: 20 20 20 2a 70 45 72 72 63 6f 64 65 20 3d 20 65     *pErrcode = e
a4d0: 72 72 6e 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rrno;.  }else{. 
a4e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
a4f0: 30 3b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e 74  0;.    rc = fcnt
a500: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
a510: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20  TLK, &lock);.   
a520: 20 2a 70 45 72 72 63 6f 64 65 20 3d 20 65 72 72   *pErrcode = err
a530: 6e 6f 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  no;.    if( NEVE
a540: 52 28 6f 70 3d 3d 46 5f 55 4e 4c 43 4b 29 20 7c  R(op==F_UNLCK) |
a550: 7c 20 72 63 21 3d 28 2d 31 29 20 29 7b 0a 20 20  | rc!=(-1) ){.  
a560: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
a570: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c 6f 63 6b   = 0;.      lock
a580: 2e 6c 5f 6c 65 6e 20 3d 20 50 45 4e 44 49 4e 47  .l_len = PENDING
a590: 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 72 63 20  _BYTE;.      rc 
a5a0: 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  = fcntl(pFile->h
a5b0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
a5c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  );.      if( ALW
a5d0: 41 59 53 28 6f 70 21 3d 46 5f 55 4e 4c 43 4b 29  AYS(op!=F_UNLCK)
a5e0: 20 26 26 20 72 63 3d 3d 28 2d 31 29 20 29 7b 0a   && rc==(-1) ){.
a5f0: 20 20 20 20 20 20 20 20 2a 70 45 72 72 63 6f 64          *pErrcod
a600: 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  e = errno;.     
a610: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
a620: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
a630: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
a640: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
a650: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
a660: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  n = 0;.        f
a670: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
a680: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
a690: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a6a0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
a6b0: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
a6c0: 54 45 5f 45 4e 41 42 4c 45 5f 4e 46 53 5f 52 41  TE_ENABLE_NFS_RA
a6d0: 4e 47 45 4c 4f 43 4b 20 2a 2f 0a 2f 2a 0a 2a 2a  NGELOCK */./*.**
a6e0: 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
a6f0: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
a700: 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
a710: 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f  ter locktype - o
a720: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
a730: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
a740: 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
a750: 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
a760: 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
a770: 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
a780: 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
a790: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
a7a0: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
a7b0: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
a7c0: 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
a7d0: 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
a7e0: 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
a7f0: 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
a800: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
a810: 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
a820: 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
a830: 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
a840: 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
a850: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
a860: 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
a870: 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
a880: 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
a890: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
a8a0: 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
a8b0: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
a8c0: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
a8d0: 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
a8e0: 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
a8f0: 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
a900: 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
a910: 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
a920: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
a930: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
a940: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
a950: 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
a960: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
a970: 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
a980: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
a990: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a9a0: 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
a9b0: 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
a9c0: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
a9d0: 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
a9e0: 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
a9f0: 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
aa00: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
aa10: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
aa20: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
aa30: 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ){.  /* The foll
aa40: 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20  owing describes 
aa50: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
aa60: 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  on of the variou
aa70: 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a  s locks and.  **
aa80: 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e   lock transition
aa90: 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  s in terms of th
aaa0: 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  e POSIX advisory
aab0: 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c   shared and excl
aac0: 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  usive.  ** lock 
aad0: 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c  primitives (call
aae0: 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e  ed read-locks an
aaf0: 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65  d write-locks be
ab00: 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20  low, to avoid.  
ab10: 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74  ** confusion wit
ab20: 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61  h SQLite lock na
ab30: 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69  mes). The algori
ab40: 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63  thms are complic
ab50: 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74  ated.  ** slight
ab60: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ly in order to b
ab70: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
ab80: 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  h windows system
ab90: 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79  s simultaneously
aba0: 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20  .  ** accessing 
abb0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
abc0: 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20  e file, in case 
abd0: 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71  that is ever req
abe0: 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  uired..  **.  **
abf0: 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64   Symbols defined
ac00: 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69   in os.h indenti
ac10: 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  fy the 'pending 
ac20: 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72  byte' and the 'r
ac30: 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74  eserved.  ** byt
ac40: 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20  e', each single 
ac50: 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e  bytes at well kn
ac60: 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64  own offsets, and
ac70: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
ac80: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61  e.  ** range', a
ac90: 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79   range of 510 by
aca0: 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e  tes at a well kn
acb0: 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a  own offset..  **
acc0: 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20  .  ** To obtain 
acd0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61  a SHARED lock, a
ace0: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62   read-lock is ob
acf0: 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70  tained on the 'p
ad00: 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65  ending.  ** byte
ad10: 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  '.  If this is s
ad20: 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e  uccessful, a ran
ad30: 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68  dom byte from th
ad40: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
ad50: 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65   ** range' is re
ad60: 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68  ad-locked and th
ad70: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70  e lock on the 'p
ad80: 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c  ending byte' rel
ad90: 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  eased..  **.  **
ada0: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
adb0: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53  nly obtain a RES
adc0: 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72  ERVED lock after
add0: 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44   it has a SHARED
ade0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45   lock..  ** A RE
adf0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69  SERVED lock is i
ae00: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72  mplemented by gr
ae10: 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  abbing a write-l
ae20: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
ae30: 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e  'reserved byte'.
ae40: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72   .  **.  ** A pr
ae50: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
ae60: 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20  btain a PENDING 
ae70: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
ae80: 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a  s obtained a.  *
ae90: 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41  * SHARED lock. A
aea0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
aeb0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
aec0: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
aed0: 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  e-lock.  ** on t
aee0: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
aef0: 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  '. This ensures 
af00: 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52  that no new SHAR
af10: 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a  ED locks can be.
af20: 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62    ** obtained, b
af30: 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52  ut existing SHAR
af40: 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c  ED locks are all
af50: 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e  owed to persist.
af60: 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20   A process.  ** 
af70: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
af80: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
af90: 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77  ED lock on the w
afa0: 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20  ay to a PENDING 
afb0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20  lock..  ** This 
afc0: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
afd0: 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68   by the algorith
afe0: 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  m for rolling ba
aff0: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
b000: 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63  e.  ** after a c
b010: 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rash..  **.  ** 
b020: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  An EXCLUSIVE loc
b030: 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65  k, obtained afte
b040: 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  r a PENDING lock
b050: 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a   is held, is.  *
b060: 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  * implemented by
b070: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
b080: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65  te-lock on the e
b090: 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79  ntire 'shared by
b0a0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20  te.  ** range'. 
b0b0: 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20  Since all other 
b0c0: 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20  locks require a 
b0d0: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65  read-lock on one
b0e0: 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20   of the bytes.  
b0f0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72  ** within this r
b100: 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72  ange, this ensur
b110: 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
b120: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20   locks are held 
b130: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
b140: 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  base. .  **.  **
b150: 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69   The reason a si
b160: 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74  ngle byte cannot
b170: 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
b180: 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64 20   of the 'shared 
b190: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
b1a0: 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65   is that some ve
b1b0: 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77  rsions of window
b1c0: 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  s do not support
b1d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a   read-locks. By.
b1e0: 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72    ** locking a r
b1f0: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
b200: 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72  a range, concurr
b210: 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ent SHARED locks
b220: 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20   may exist.  ** 
b230: 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b  even if the lock
b240: 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75 73  ing primitive us
b250: 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 77  ed is always a w
b260: 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  rite-lock..  */.
b270: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
b280: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
b290: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
b2a0: 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74 72 75 63  ile*)id;.  struc
b2b0: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a  t unixLockInfo *
b2c0: 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70  pLock = pFile->p
b2d0: 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66  Lock;.  struct f
b2e0: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
b2f0: 20 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 74 45   s = 0;.  int tE
b300: 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  rrno;..  assert(
b310: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
b320: 41 43 45 37 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE7("LOCK    %d
b330: 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
b340: 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69  ) pid=%d\n", pFi
b350: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 6c 6f 63  le->h,.      loc
b360: 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
b370: 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d  pe), locktypeNam
b380: 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  e(pFile->locktyp
b390: 65 29 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79  e),.      lockty
b3a0: 70 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f  peName(pLock->lo
b3b0: 63 6b 74 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e  cktype), pLock->
b3c0: 63 6e 74 20 2c 20 67 65 74 70 69 64 28 29 29 3b  cnt , getpid());
b3d0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
b3e0: 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
b3f0: 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
b400: 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
b410: 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75  ve on the.  ** u
b420: 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68  nixFile, do noth
b430: 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
b440: 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
b450: 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
b460: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
b470: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
b480: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
b490: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
b4a0: 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype>=locktype ){
b4b0: 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 4c  .    OSTRACE3("L
b4c0: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20  OCK    %d %s ok 
b4d0: 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 5c 6e  (already held)\n
b4e0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
b4f0: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
b500: 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29  eName(locktype))
b510: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
b520: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
b530: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
b540: 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
b550: 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
b560: 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
b570: 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
b580: 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
b590: 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
b5a0: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
b5b0: 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
b5c0: 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
b5d0: 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
b5e0: 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
b5f0: 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
b600: 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
b610: 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
b620: 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
b630: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
b640: 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
b650: 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK || locktype==
b660: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
b670: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
b680: 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e!=PENDING_LOCK 
b690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
b6a0: 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f  ktype!=RESERVED_
b6b0: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c  LOCK || pFile->l
b6c0: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
b6d0: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
b6e0: 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
b6f0: 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
b700: 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65  ->pLock is share
b710: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
b720: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
b730: 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  rMutex();..  /* 
b740: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75  Make sure the cu
b750: 72 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77 6e  rrent thread own
b760: 73 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20 2a  s the pFile..  *
b770: 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66 65  /.  rc = transfe
b780: 72 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c 65  rOwnership(pFile
b790: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
b7a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e  ITE_OK ){.    un
b7b0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
b7c0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
b7d0: 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69   }.  pLock = pFi
b7e0: 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a  le->pLock;..  /*
b7f0: 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
b800: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
b810: 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
b820: 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69  different unixFi
b830: 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
b840: 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
b850: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
b860: 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
b870: 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
b880: 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 70 4c 6f  e->locktype!=pLo
b890: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 26 26 20  ck->locktype && 
b8a0: 0a 20 20 20 20 20 20 20 20 20 20 28 70 4c 6f 63  .          (pLoc
b8b0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e  k->locktype>=PEN
b8c0: 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  DING_LOCK || loc
b8d0: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
b8e0: 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  K)).  ){.    rc 
b8f0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
b900: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
b910: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
b920: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
b930: 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
b940: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
b950: 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
b960: 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
b970: 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
b980: 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
b990: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
b9a0: 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
b9b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
b9c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
b9d0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
b9e0: 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 4c 6f  K && .      (pLo
b9f0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  ck->locktype==SH
ba00: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f  ARED_LOCK || pLo
ba10: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  ck->locktype==RE
ba20: 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a  SERVED_LOCK) ){.
ba30: 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
ba40: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
ba50: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
ba60: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
ba70: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
ba80: 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20  t( pLock->cnt>0 
ba90: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  );.    pFile->lo
baa0: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
bab0: 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  LOCK;.    pLock-
bac0: 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 70 46 69 6c  >cnt++;.    pFil
bad0: 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b  e->pOpen->nLock+
bae0: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  +;.    goto end_
baf0: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  lock;.  }...  /*
bb00: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
bb10: 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
bb20: 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
bb30: 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
bb40: 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
bb50: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
bb60: 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
bb70: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
bb80: 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
bb90: 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
bba0: 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e   */.  lock.l_len
bbb0: 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f   = 1L;.  lock.l_
bbc0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
bbd0: 54 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  T;.  if( locktyp
bbe0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  e==SHARED_LOCK .
bbf0: 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79        || (lockty
bc00: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
bc10: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK && pFile->loc
bc20: 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f  ktype<PENDING_LO
bc30: 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63  CK).  ){.    loc
bc40: 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 6c 6f 63 6b  k.l_type = (lock
bc50: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
bc60: 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43  K?F_RDLCK:F_WRLC
bc70: 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  K);.    lock.l_s
bc80: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
bc90: 59 54 45 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e  YTE;.    s = fcn
bca0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
bcb0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
bcc0: 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b    if( s==(-1) ){
bcd0: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
bce0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
bcf0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
bd00: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
bd10: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
bd20: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
bd30: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
bd40: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
bd50: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
bd60: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
bd70: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
bd80: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
bd90: 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  ...  /* If contr
bda0: 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
bdb0: 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
bdc0: 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
bdd0: 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72  d make.  ** oper
bde0: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c  ating system cal
bdf0: 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ls for the speci
be00: 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  fied lock..  */.
be10: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
be20: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
be30: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
be40: 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20  ->cnt==0 );.    
be50: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c  assert( pLock->l
be60: 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 0a 20  ocktype==0 );.. 
be70: 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
be80: 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20  e read-lock */. 
be90: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
bea0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
beb0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
bec0: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
bed0: 20 20 69 66 28 20 28 73 20 3d 20 66 63 6e 74 6c    if( (s = fcntl
bee0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
bef0: 4c 4b 2c 20 26 6c 6f 63 6b 29 29 3d 3d 28 2d 31  LK, &lock))==(-1
bf00: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
bf10: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d  o = errno;.    }
bf20: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
bf30: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
bf40: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
bf50: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
bf60: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
bf70: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
bf80: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
bf90: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
bfa0: 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  if( fcntl(pFile-
bfb0: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
bfc0: 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)!=0 ){.      
bfd0: 69 66 28 20 73 20 21 3d 20 2d 31 20 29 7b 0a 20  if( s != -1 ){. 
bfe0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
bff0: 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68  ould happen with
c000: 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74   a network mount
c010: 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 45 72 72   */.        tErr
c020: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 0a 20 20 20  no = errno; .   
c030: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c040: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
c050: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
c060: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
c070: 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  ; .        if( I
c080: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
c090: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
c0a0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
c0b0: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
c0c0: 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
c0d0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  end_lock;.      
c0e0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
c0f0: 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  s==(-1) ){.     
c100: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
c110: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
c120: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
c130: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
c140: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
c150: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
c160: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
c170: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
c180: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
c190: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
c1a0: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
c1b0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c  LOCK;.      pFil
c1c0: 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b  e->pOpen->nLock+
c1d0: 2b 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  +;.      pLock->
c1e0: 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  cnt = 1;.    }. 
c1f0: 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74   }else if( lockt
c200: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
c210: 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e  OCK && pLock->cn
c220: 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  t>1 ){.    /* We
c230: 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20   are trying for 
c240: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
c250: 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68  k but another th
c260: 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20  read in this.   
c270: 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73   ** same process
c280: 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e   is still holdin
c290: 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  g a shared lock.
c2a0: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
c2b0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73  ITE_BUSY;.  }els
c2c0: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
c2d0: 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20  quest was for a 
c2e0: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
c2f0: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20  USIVE lock.  It 
c300: 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65  is.    ** assume
c310: 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  d that there is 
c320: 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61  a SHARED or grea
c330: 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
c340: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65  file.    ** alre
c350: 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
c360: 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
c370: 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20  ->locktype );.  
c380: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
c390: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69  F_WRLCK;.    swi
c3a0: 74 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b  tch( locktype ){
c3b0: 0a 20 20 20 20 20 20 63 61 73 65 20 52 45 53 45  .      case RESE
c3c0: 52 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20  RVED_LOCK:.     
c3d0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
c3e0: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
c3f0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
c400: 20 20 20 20 20 20 63 61 73 65 20 45 58 43 4c 55        case EXCLU
c410: 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20  SIVE_LOCK:.     
c420: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
c430: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
c440: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
c450: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
c460: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
c470: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
c480: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 30          assert(0
c490: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d  );.    }.    s =
c4a0: 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c   fcntl(pFile->h,
c4b0: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
c4c0: 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31  ;.    if( s==(-1
c4d0: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
c4e0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
c4f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
c500: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
c510: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
c520: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
c530: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
c540: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
c550: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
c560: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
c570: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c580: 20 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    ..#ifndef NDEB
c590: 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74  UG.  /* Set up t
c5a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63  he transaction-c
c5b0: 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68  ounter change ch
c5c0: 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65  ecking flags whe
c5d0: 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f  n.  ** transitio
c5e0: 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52  ning from a SHAR
c5f0: 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45 44  ED to a RESERVED
c600: 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e   lock.  The chan
c610: 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41  ge.  ** from SHA
c620: 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 20  RED to RESERVED 
c630: 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e  marks the beginn
c640: 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a  ing of a normal.
c650: 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61    ** write opera
c660: 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20  tion (not a hot 
c670: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
c680: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  )..  */.  if( rc
c690: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
c6a0: 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
c6b0: 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20  e<=SHARED_LOCK. 
c6c0: 20 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 52    && locktype==R
c6d0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29  ESERVED_LOCK.  )
c6e0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61  {.    pFile->tra
c6f0: 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a  nsCntrChng = 0;.
c700: 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
c710: 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ate = 0;.    pFi
c720: 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
c730: 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  e = 1;.  }.#endi
c740: 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  f...  if( rc==SQ
c750: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
c760: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
c770: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 70   locktype;.    p
c780: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
c790: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c   locktype;.  }el
c7a0: 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  se if( locktype=
c7b0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
c7c0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  ){.    pFile->lo
c7d0: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
c7e0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b  _LOCK;.    pLock
c7f0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ->locktype = PEN
c800: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  DING_LOCK;.  }..
c810: 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
c820: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
c830: 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20  OSTRACE4("LOCK  
c840: 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70    %d %s %s\n", p
c850: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
c860: 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c  eName(locktype),
c870: 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49   .      rc==SQLI
c880: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
c890: 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75  failed");.  retu
c8a0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c8b0: 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64  Close all file d
c8c0: 65 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d  escriptors accum
c8d0: 75 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69  uated in the uni
c8e0: 78 4f 70 65 6e 43 6e 74 2d 3e 70 55 6e 75 73 65  xOpenCnt->pUnuse
c8f0: 64 20 6c 69 73 74 2e 0a 2a 2a 20 49 66 20 61 6c  d list..** If al
c900: 6c 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63  l such file desc
c910: 72 69 70 74 6f 72 73 20 61 72 65 20 63 6c 6f 73  riptors are clos
c920: 65 64 20 77 69 74 68 6f 75 74 20 65 72 72 6f 72  ed without error
c930: 2c 20 74 68 65 20 6c 69 73 74 20 69 73 0a 2a 2a  , the list is.**
c940: 20 63 6c 65 61 72 65 64 20 61 6e 64 20 53 51 4c   cleared and SQL
c950: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
c960: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
c970: 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
c980: 63 75 72 73 2c 20 74 68 65 6e 20 73 75 63 63 65  curs, then succe
c990: 73 73 66 75 6c 6c 79 20 63 6c 6f 73 65 64 20 66  ssfully closed f
c9a0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
c9b0: 2a 20 65 6e 74 72 69 65 73 20 61 72 65 20 72 65  * entries are re
c9c0: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 6c  moved from the l
c9d0: 69 73 74 2c 20 61 6e 64 20 53 51 4c 49 54 45 5f  ist, and SQLITE_
c9e0: 49 4f 45 52 52 5f 43 4c 4f 53 45 20 72 65 74 75  IOERR_CLOSE retu
c9f0: 72 6e 65 64 2e 20 0a 2a 2a 20 6e 6f 74 20 64 65  rned. .** not de
ca00: 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
ca10: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 20 72 65 74  _IOERR_CLOSE ret
ca20: 75 72 6e 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69  urned..*/ .stati
ca30: 63 20 69 6e 74 20 63 6c 6f 73 65 50 65 6e 64 69  c int closePendi
ca40: 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a  ngFds(unixFile *
ca50: 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63  pFile){.  int rc
ca60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
ca70: 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43  struct unixOpenC
ca80: 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69 6c  nt *pOpen = pFil
ca90: 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 55 6e 69 78  e->pOpen;.  Unix
caa0: 55 6e 75 73 65 64 46 64 20 2a 70 45 72 72 6f 72  UnusedFd *pError
cab0: 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73   = 0;.  UnixUnus
cac0: 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55  edFd *p;.  UnixU
cad0: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a  nusedFd *pNext;.
cae0: 20 20 66 6f 72 28 70 3d 70 4f 70 65 6e 2d 3e 70    for(p=pOpen->p
caf0: 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65  Unused; p; p=pNe
cb00: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
cb10: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69   p->pNext;.    i
cb20: 66 28 20 63 6c 6f 73 65 28 70 2d 3e 66 64 29 20  f( close(p->fd) 
cb30: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
cb40: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
cb50: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  o;.      rc = SQ
cb60: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
cb70: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74  ;.      p->pNext
cb80: 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20   = pError;.     
cb90: 20 70 45 72 72 6f 72 20 3d 20 70 3b 0a 20 20 20   pError = p;.   
cba0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
cbb0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
cbc0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4f 70 65 6e     }.  }.  pOpen
cbd0: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 45 72 72  ->pUnused = pErr
cbe0: 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  or;.  return rc;
cbf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68  .}../*.** Add th
cc00: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
cc10: 72 20 75 73 65 64 20 62 79 20 66 69 6c 65 20 68  r used by file h
cc20: 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74  andle pFile to t
cc30: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
cc40: 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74  .** pUnused list
cc50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
cc60: 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e   setPendingFd(un
cc70: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
cc80: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65    struct unixOpe
cc90: 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46  nCnt *pOpen = pF
cca0: 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 55 6e  ile->pOpen;.  Un
ccb0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20  ixUnusedFd *p = 
ccc0: 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  pFile->pUnused;.
ccd0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 70    p->pNext = pOp
cce0: 65 6e 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70  en->pUnused;.  p
ccf0: 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64 20 3d 20  Open->pUnused = 
cd00: 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  p;.  pFile->h = 
cd10: 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e  -1;.  pFile->pUn
cd20: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
cd30: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
cd40: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
cd50: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
cd60: 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e  ile to locktype.
cd70: 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75    locktype.** mu
cd80: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
cd90: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
cda0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
cdb0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
cdc0: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
cdd0: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
cde0: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
cdf0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
ce00: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
ce10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
ce20: 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  no-op..** .** If
ce30: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
ce40: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f   is true, then o
ce50: 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e  n downgrading an
ce60: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
ce70: 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65  to SHARED.** the
ce80: 20 62 79 74 65 20 72 61 6e 67 65 20 69 73 20 64   byte range is d
ce90: 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61  ivided into 2 pa
cea0: 72 74 73 20 61 6e 64 20 74 68 65 20 66 69 72 73  rts and the firs
ceb0: 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b  t part is unlock
cec0: 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74  ed then.** set t
ced0: 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74  o a read lock, t
cee0: 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61  hen the other pa
cef0: 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c  rt is simply unl
cf00: 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72  ocked.  This wor
cf10: 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20  ks .** around a 
cf20: 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c  bug in BSD NFS l
cf30: 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20  ockd (also seen 
cf40: 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29  on MacOSX 10.3+)
cf50: 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a   that fails to .
cf60: 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72  ** remove the wr
cf70: 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65  ite lock on a re
cf80: 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64  gion when a read
cf90: 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f   lock is set..*/
cfa0: 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 70 6f 73  .static int _pos
cfb0: 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ixUnlock(sqlite3
cfc0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
cfd0: 6f 63 6b 74 79 70 65 2c 20 69 6e 74 20 68 61 6e  ocktype, int han
cfe0: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20  dleNFSUnlock){. 
cff0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
d000: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
d010: 3b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c  ;.  struct unixL
d020: 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a  ockInfo *pLock;.
d030: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
d040: 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ock;.  int rc = 
d050: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
d060: 20 68 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f   h;.  int tErrno
d070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d080: 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
d090: 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d  code from system
d0a0: 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a   call errors */.
d0b0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
d0c0: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22   );.  OSTRACE7("
d0d0: 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
d0e0: 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d  s %d(%d,%d) pid=
d0f0: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
d100: 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20   locktype,.     
d110: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
d120: 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e  , pFile->pLock->
d130: 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
d140: 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65 74  >pLock->cnt, get
d150: 70 69 64 28 29 29 3b 0a 0a 20 20 61 73 73 65 72  pid());..  asser
d160: 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
d170: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RED_LOCK );.  if
d180: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
d190: 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e<=locktype ){. 
d1a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d1b0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43  _OK;.  }.  if( C
d1c0: 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70 46  HECK_THREADID(pF
d1d0: 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ile) ){.    retu
d1e0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
d1f0: 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
d200: 72 4d 75 74 65 78 28 29 3b 0a 20 20 68 20 3d 20  rMutex();.  h = 
d210: 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 70 4c 6f 63  pFile->h;.  pLoc
d220: 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  k = pFile->pLock
d230: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63  ;.  assert( pLoc
d240: 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69  k->cnt!=0 );.  i
d250: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
d260: 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
d270: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
d280: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70  ock->locktype==p
d290: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29  File->locktype )
d2a0: 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
d2b0: 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
d2c0: 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
d2d0: 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
d2e0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
d2f0: 72 42 65 6e 69 67 6e 28 30 29 3b 0a 0a 23 69 66  rBenign(0);..#if
d300: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
d310: 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67  /* When reducing
d320: 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61   a lock such tha
d330: 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  t other processe
d340: 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20  s can start.    
d350: 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  ** reading the d
d360: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61  atabase file aga
d370: 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
d380: 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  at the.    ** tr
d390: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
d3a0: 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66  r was updated if
d3b0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
d3c0: 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
d3d0: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20   file changed.  
d3e0: 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
d3f0: 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f  on counter is no
d400: 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a  t updated,.    *
d410: 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
d420: 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ons to the same 
d430: 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72  file might not r
d440: 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20  ealize that.    
d450: 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ** the file has 
d460: 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63  changed and henc
d470: 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77  e might not know
d480: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a   to flush their.
d490: 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54      ** cache.  T
d4a0: 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c  he use of a stal
d4b0: 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64  e cache can lead
d4c0: 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
d4d0: 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ruption..    */.
d4e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
d4f0: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
d500: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
d510: 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d  pFile->dbUpdate=
d520: 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
d530: 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
d540: 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46  hng==1 );.    pF
d550: 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
d560: 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  te = 0;.#endif..
d570: 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69      /* downgradi
d580: 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c  ng to a shared l
d590: 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c  ock on NFS invol
d5a0: 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65  ves clearing the
d5b0: 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20   write lock.    
d5c0: 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62   ** before estab
d5d0: 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65 61 64  lishing the read
d5e0: 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20  lock - to avoid 
d5f0: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
d600: 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20   we downgrade.  
d610: 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69     ** the lock i
d620: 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74  n 2 blocks, so t
d630: 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  hat part of the 
d640: 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f  range will be co
d650: 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20 20  vered by a .    
d660: 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75   ** write lock u
d670: 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73  ntil the rest is
d680: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65   covered by a re
d690: 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 20 2a 2a  ad lock:.     **
d6a0: 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20    1:   [WWWWW]. 
d6b0: 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e      **  2:   [..
d6c0: 2e 2e 57 5d 0a 20 20 20 20 20 2a 2a 20 20 33 3a  ..W].     **  3:
d6d0: 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 20     [RRRRW].     
d6e0: 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d  **  4:   [RRRR.]
d6f0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  .     */.    if(
d700: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
d710: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  D_LOCK ){.      
d720: 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  if( handleNFSUnl
d730: 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  ock ){.        o
d740: 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53  ff_t divSize = S
d750: 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a  HARED_SIZE - 1;.
d760: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
d770: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
d780: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _UNLCK;.        
d790: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
d7a0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
d7b0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
d7c0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
d7d0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
d7e0: 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
d7f0: 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68       if( fcntl(h
d800: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
d810: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
d820: 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
d830: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
d840: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
d850: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
d860: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
d870: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
d880: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53            if( IS
d890: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
d8a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
d8b0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
d8c0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
d8d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d8e0: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
d8f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d900: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
d910: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
d920: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
d930: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
d940: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
d950: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
d960: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
d970: 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20  len = divSize;. 
d980: 20 20 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c         if( fcntl
d990: 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  (h, F_SETLK, &lo
d9a0: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
d9b0: 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e         int tErrn
d9c0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
d9d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d9e0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
d9f0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
da00: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29  TE_IOERR_RDLOCK)
da10: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
da20: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
da30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
da40: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
da50: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
da60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
da70: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
da80: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
da90: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
daa0: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
dab0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
dac0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
dad0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
dae0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
daf0: 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  T+divSize;.     
db00: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
db10: 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53  SHARED_SIZE-divS
db20: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
db30: 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c   fcntl(h, F_SETL
db40: 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  K, &lock)==(-1) 
db50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
db60: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
db70: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
db80: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
db90: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
dba0: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
dbb0: 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  NLOCK);.        
dbc0: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
dbd0: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
dbe0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
dbf0: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
dc00: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
dc10: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
dc20: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
dc30: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
dc40: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
dc50: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
dc60: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
dc70: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
dc80: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
dc90: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
dca0: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
dcb0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
dcc0: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  D_SIZE;.        
dcd0: 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  if( fcntl(h, F_S
dce0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  ETLK, &lock)==(-
dcf0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
dd00: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
dd10: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
dd20: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
dd30: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
dd40: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
dd50: 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_RDLOCK);.     
dd60: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
dd70: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
dd80: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
dd90: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
dda0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
ddb0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
ddc0: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
ddd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
dde0: 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74    }.    lock.l_t
ddf0: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
de00: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
de10: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
de20: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
de30: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
de40: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32    lock.l_len = 2
de50: 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44  L;  assert( PEND
de60: 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45  ING_BYTE+1==RESE
de70: 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20  RVED_BYTE );.   
de80: 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f   if( fcntl(h, F_
de90: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28  SETLK, &lock)!=(
dea0: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  -1) ){.      pLo
deb0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53  ck->locktype = S
dec0: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
ded0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74 45 72  }else{.      tEr
dee0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
def0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
df00: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
df10: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
df20: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
df30: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
df40: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
df50: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
df60: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
df70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
df80: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
df90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
dfa0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
dfb0: 43 4b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  CK ){.    struct
dfc0: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f   unixOpenCnt *pO
dfd0: 70 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63  pen;..    /* Dec
dfe0: 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
dff0: 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
e000: 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
e010: 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
e020: 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
e030: 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
e040: 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
e050: 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
e060: 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
e070: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ck..    */.    p
e080: 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20  Lock->cnt--;.   
e090: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d   if( pLock->cnt=
e0a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 ){.      lock
e0b0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
e0c0: 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
e0d0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
e0e0: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
e0f0: 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c  start = lock.l_l
e100: 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53  en = 0L;.      S
e110: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
e120: 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53  nign(1);.      S
e130: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
e140: 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53  h=(-1) ).      S
e150: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
e160: 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
e170: 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45  f( fcntl(h, F_SE
e180: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31  TLK, &lock)!=(-1
e190: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  ) ){.        pLo
e1a0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e  ck->locktype = N
e1b0: 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65  O_LOCK;.      }e
e1c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 45 72  lse{.        tEr
e1d0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e1e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e1f0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
e200: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
e210: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
e220: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53  ;.        if( IS
e230: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
e240: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
e250: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
e260: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
e270: 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d  }.        pLock-
e280: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c  >locktype = NO_L
e290: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
e2a0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e  le->locktype = N
e2b0: 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  O_LOCK;.      }.
e2c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
e2d0: 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e  crement the coun
e2e0: 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e  t of locks again
e2f0: 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c  st this same fil
e300: 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20  e.  When the.   
e310: 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65   ** count reache
e320: 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e  s zero, close an
e330: 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  y other file des
e340: 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63  criptors whose c
e350: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20  lose.    ** was 
e360: 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65  deferred because
e370: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
e380: 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  locks..    */.  
e390: 20 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d    pOpen = pFile-
e3a0: 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 70 4f 70 65  >pOpen;.    pOpe
e3b0: 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20  n->nLock--;.    
e3c0: 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e  assert( pOpen->n
e3d0: 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69  Lock>=0 );.    i
e3e0: 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d  f( pOpen->nLock=
e3f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
e400: 72 63 32 20 3d 20 63 6c 6f 73 65 50 65 6e 64 69  rc2 = closePendi
e410: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
e420: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e430: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
e440: 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
e450: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 09 0a 65   }.    }.  }...e
e460: 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69  nd_unlock:.  uni
e470: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
e480: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e490: 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  OK ) pFile->lock
e4a0: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
e4b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e4c0: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
e4d0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
e4e0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
e4f0: 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74  r pFile to lockt
e500: 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a  ype.  locktype.*
e510: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
e520: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
e530: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
e540: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
e550: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
e560: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
e570: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
e580: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
e590: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
e5a0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
e5b0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
e5c0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c  atic int unixUnl
e5d0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
e5e0: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
e5f0: 70 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 5f 70  pe){.  return _p
e600: 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 6c  osixUnlock(id, l
e610: 6f 63 6b 74 79 70 65 2c 20 30 29 3b 0a 7d 0a 0a  ocktype, 0);.}..
e620: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
e630: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
e640: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
e650: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
e660: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
e670: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
e680: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
e690: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
e6a0: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
e6b0: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
e6c0: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
e6d0: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
e6e0: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
e6f0: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
e700: 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
e710: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
e720: 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
e730: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
e740: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
e750: 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
e760: 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
e770: 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
e780: 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
e790: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
e7a0: 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
e7b0: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
e7c0: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
e7d0: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
e7e0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
e7f0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
e800: 20 69 66 28 20 70 46 69 6c 65 20 29 7b 0a 20 20   if( pFile ){.  
e810: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
e820: 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  fd>=0 ){.      i
e830: 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70  nt err = close(p
e840: 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20  File->dirfd);.  
e850: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
e860: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
e870: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
e880: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e890: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
e8a0: 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 65  _CLOSE;.      }e
e8b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 69  lse{.        pFi
e8c0: 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20 20  le->dirfd=-1;.  
e8d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e8e0: 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
e8f0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  ){.      int err
e900: 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e   = close(pFile->
e910: 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72  h);.      if( er
e920: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  r ){.        pFi
e930: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
e940: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
e950: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
e960: 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  RR_CLOSE;.      
e970: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 4f 53 5f 56  }.    }.#if OS_V
e980: 58 57 4f 52 4b 53 0a 20 20 20 20 69 66 28 20 70  XWORKS.    if( p
e990: 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20  File->pId ){.   
e9a0: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73     if( pFile->is
e9b0: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
e9c0: 20 20 75 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e    unlink(pFile->
e9d0: 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
e9e0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
e9f0: 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61      vxworksRelea
ea00: 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e  seFileId(pFile->
ea10: 70 49 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  pId);.      pFil
ea20: 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 20 20  e->pId = 0;.    
ea30: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 4f 53 54  }.#endif.    OST
ea40: 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25  RACE2("CLOSE   %
ea50: 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
ea60: 29 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74  );.    OpenCount
ea70: 65 72 28 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  er(-1);.    sqli
ea80: 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
ea90: 70 55 6e 75 73 65 64 29 3b 0a 20 20 20 20 6d 65  pUnused);.    me
eaa0: 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73  mset(pFile, 0, s
eab0: 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
eac0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
ead0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
eae0: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
eaf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
eb00: 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nixClose(sqlite3
eb10: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  _file *id){.  in
eb20: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
eb30: 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  ;.  if( id ){.  
eb40: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
eb50: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
eb60: 69 64 3b 0a 20 20 20 20 75 6e 69 78 55 6e 6c 6f  id;.    unixUnlo
eb70: 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
eb80: 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
eb90: 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70  tex();.    if( p
eba0: 46 69 6c 65 2d 3e 70 4f 70 65 6e 20 26 26 20 70  File->pOpen && p
ebb0: 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f  File->pOpen->nLo
ebc0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ck ){.      /* I
ebd0: 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
ebe0: 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
ebf0: 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
ec00: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
ec10: 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20  st.      ** yet 
ec20: 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
ec30: 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
ec40: 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
ec50: 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
ec60: 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
ec70: 20 74 6f 20 70 4f 70 65 6e 2d 3e 70 55 6e 75 73   to pOpen->pUnus
ec80: 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  ed list.  It wil
ec90: 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
eca0: 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 20  ly closed .     
ecb0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73   ** when the las
ecc0: 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
ecd0: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
ece0: 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
ecf0: 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  File);.    }.   
ed00: 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
ed10: 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a  (pFile->pLock);.
ed20: 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43      releaseOpenC
ed30: 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29  nt(pFile->pOpen)
ed40: 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65  ;.    rc = close
ed50: 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
ed60: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
ed70: 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
ed80: 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   rc;.}../*******
ed90: 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
eda0: 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
edb0: 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  y lock implement
edc0: 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
edd0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
ede0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
edf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee20: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
ee30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee70: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
ee80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee90: 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f  ******* No-op Lo
eea0: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
eeb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eec0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f  ********.**.** O
eed0: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
eee0: 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
eef0: 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c  tions available,
ef00: 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72 20   this is by far 
ef10: 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a  the.** simplest:
ef20: 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e    locking is ign
ef30: 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70  ored.  No attemp
ef40: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63  t is made to loc
ef50: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  k the database.*
ef60: 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  * file for readi
ef70: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  ng or writing..*
ef80: 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e  *.** This lockin
ef90: 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70  g mode is approp
efa0: 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e  riate for use on
efb0: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
efc0: 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74  ases.** (ex: dat
efd0: 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65 20  abases that are 
efe0: 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52  burned into CD-R
eff0: 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  OM, for example.
f000: 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73  )  It can.** als
f010: 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  o be used if the
f020: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70   application emp
f030: 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e  loys some extern
f040: 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a  al mechanism to.
f050: 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c  ** prevent simul
f060: 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f  taneous access o
f070: 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  f the same datab
f080: 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f  ase by two or mo
f090: 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  re.** database c
f0a0: 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74  onnections.  But
f0b0: 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72 69   there is a seri
f0c0: 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61  ous risk of data
f0d0: 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69  base.** corrupti
f0e0: 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69  on if this locki
f0f0: 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
f100: 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68  in situations wh
f110: 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ere multiple.** 
f120: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
f130: 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73 69  ions are accessi
f140: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
f150: 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
f160: 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e   same.** time an
f170: 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  d one or more of
f180: 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f   those connectio
f190: 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a  ns are writing..
f1a0: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  */..static int n
f1b0: 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
f1c0: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
f1d0: 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
f1e0: 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55  t *pResOut){.  U
f1f0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
f200: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65  NotUsed);.  *pRe
f210: 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  sOut = 0;.  retu
f220: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f230: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
f240: 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
f250: 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
f260: 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
f270: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
f280: 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
f290: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
f2a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
f2b0: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63   int nolockUnloc
f2c0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f2d0: 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
f2e0: 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
f2f0: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
f300: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
f310: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f320: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
f330: 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  se the file..*/.
f340: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
f350: 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
f360: 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74  ile *id) {.  ret
f370: 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
f380: 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  e(id);.}../*****
f390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
f3a0: 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20  nd of the no-op 
f3b0: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
f3c0: 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
f3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
f3e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f420: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
f430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
f480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f490: 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66  **** Begin dot-f
f4a0: 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ile Locking ****
f4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
f4d0: 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63   The dotfile loc
f4e0: 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
f4f0: 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78 69  ion uses the exi
f500: 73 74 61 6e 63 65 20 6f 66 20 73 65 70 61 72 61  stance of separa
f510: 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73  te lock.** files
f520: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
f530: 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74  trol access to t
f540: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
f550: 69 73 20 77 6f 72 6b 73 20 6f 6e 20 6a 75 73 74  is works on just
f560: 0a 2a 2a 20 61 62 6f 75 74 20 65 76 65 72 79 20  .** about every 
f570: 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69  filesystem imagi
f580: 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72  nable.  But ther
f590: 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f  e are serious do
f5a0: 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  wnsides:.**.**  
f5b0: 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20    (1)  There is 
f5c0: 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79  zero concurrency
f5d0: 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64  .  A single read
f5e0: 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74  er blocks all ot
f5f0: 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  her.**         c
f600: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
f610: 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
f620: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
f630: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41  .**.**    (2)  A
f640: 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72  n application cr
f650: 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73  ash or power los
f660: 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c  s can leave stal
f670: 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20  e lock files.** 
f680: 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20          sitting 
f690: 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64  around that need
f6a0: 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d   to be cleared m
f6b0: 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  anually..**.** N
f6c0: 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64  evertheless, a d
f6d0: 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70  otlock is an app
f6e0: 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
f6f0: 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66   mode for use if
f700: 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63   no.** other loc
f710: 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73  king strategy is
f720: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
f730: 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
f740: 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74  g works by creat
f750: 69 6e 67 20 61 20 66 69 6c 65 20 69 6e 20 74 68  ing a file in th
f760: 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
f770: 20 61 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   as the.** datab
f780: 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65  ase and with the
f790: 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77   same name but w
f7a0: 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78  ith a ".lock" ex
f7b0: 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  tension added..*
f7c0: 2a 20 54 68 65 20 65 78 69 73 74 61 6e 63 65 20  * The existance 
f7d0: 6f 66 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 69  of a lock file i
f7e0: 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53  mplies an EXCLUS
f7f0: 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f  IVE lock.  All o
f800: 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70  ther lock.** typ
f810: 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45  es (SHARED, RESE
f820: 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61  RVED, PENDING) a
f830: 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45  re mapped into E
f840: 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a  XCLUSIVE..*/../*
f850: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66  .** The file suf
f860: 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65  fix added to the
f870: 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e   data base filen
f880: 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ame in order to 
f890: 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f  create the.** lo
f8a0: 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66  ck file..*/.#def
f8b0: 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  ine DOTLOCK_SUFF
f8c0: 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a  IX ".lock"../*.*
f8d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
f8e0: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
f8f0: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
f900: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
f910: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
f920: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
f930: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
f940: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
f950: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
f960: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
f970: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
f980: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
f990: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
f9a0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
f9b0: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
f9c0: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
f9d0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
f9e0: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
f9f0: 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  cking..**.** In 
fa00: 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
fa10: 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65   either a lock e
fa20: 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73  xists or it does
fa30: 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69   not.  So in thi
fa40: 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f  s.** variation o
fa50: 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  f CheckReservedL
fa60: 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20  ock(), *pResOut 
fa70: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69  is set to true i
fa80: 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f any lock.** is
fa90: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
faa0: 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74  e and false if t
fab0: 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  he file is unloc
fac0: 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ked..*/.static i
fad0: 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  nt dotlockCheckR
fae0: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
faf0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
fb00: 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
fb10: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
fb20: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
fb30: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
fb40: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
fb50: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
fb60: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
fb70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
fb80: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
fb90: 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
fba0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
fbb0: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
fbc0: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
fbd0: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
fbe0: 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
fbf0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
fc00: 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  e>SHARED_LOCK ){
fc10: 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
fc20: 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
fc30: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e  r some other con
fc40: 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  nection in the s
fc50: 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20  ame process.    
fc60: 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20  ** holds a lock 
fc70: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f  on the file.  No
fc80: 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66   need to check f
fc90: 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72  urther. */.    r
fca0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
fcb0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
fcc0: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69 66   lock is held if
fcd0: 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65   and only if the
fce0: 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74 73   lockfile exists
fcf0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
fd00: 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
fd10: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69  (const char*)pFi
fd20: 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
fd30: 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64  xt;.    reserved
fd40: 20 3d 20 61 63 63 65 73 73 28 7a 4c 6f 63 6b 46   = access(zLockF
fd50: 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a  ile, 0)==0;.  }.
fd60: 20 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54    OSTRACE4("TEST
fd70: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
fd80: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
fd90: 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 20  rc, reserved);. 
fda0: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
fdb0: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
fdc0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
fdd0: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
fde0: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
fdf0: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
fe00: 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
fe10: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
fe20: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
fe30: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
fe40: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
fe50: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
fe60: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
fe70: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
fe80: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
fe90: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
fea0: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
feb0: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
fec0: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
fed0: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
fee0: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
fef0: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
ff00: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
ff10: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
ff20: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
ff30: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
ff40: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
ff50: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
ff60: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
ff70: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
ff80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
ff90: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
ffa0: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
ffb0: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
ffc0: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
ffd0: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
ffe0: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
fff0: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
10000 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
10010 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
10020 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
10030 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
10040 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
10050 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
10060 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
10070 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
10080 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
10090 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
100a0 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
100b0 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
100c0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
100d0 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
100e0 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  evel..**.** With
100f0 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
10100 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  , we really only
10110 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28   support state (
10120 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  4): EXCLUSIVE..*
10130 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74  * But we track t
10140 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  he other locking
10150 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c   levels internal
10160 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
10170 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
10180 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
10190 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
101a0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
101b0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
101c0 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63  d;.  int fd;.  c
101d0 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
101e0 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
101f0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
10200 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10210 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20  E_OK;...  /* If 
10220 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b  we have any lock
10230 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
10240 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  file already exi
10250 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76  sts.  All we hav
10260 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
10270 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72  adjust our inter
10280 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
10290 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20  e lock level..  
102a0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
102b0 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f  locktype > NO_LO
102c0 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
102d0 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
102e0 74 79 70 65 3b 0a 23 69 66 20 21 4f 53 5f 56 58  type;.#if !OS_VX
102f0 57 4f 52 4b 53 0a 20 20 20 20 2f 2a 20 41 6c 77  WORKS.    /* Alw
10300 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74  ays update the t
10310 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20  imestamp on the 
10320 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  old file */.    
10330 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65  utimes(zLockFile
10340 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
10350 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10360 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
10370 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
10380 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64  ive lock */.  fd
10390 20 3d 20 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c   = open(zLockFil
103a0 65 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45  e,O_RDONLY|O_CRE
103b0 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b  AT|O_EXCL,0600);
103c0 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
103d0 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20     /* failed to 
103e0 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20  open/create the 
103f0 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c  file, someone el
10400 73 65 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c  se may have stol
10410 65 6e 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  en the lock */. 
10420 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
10430 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45  errno;.    if( E
10440 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20  EXIST == tErrno 
10450 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
10460 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
10470 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63   else {.      rc
10480 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
10490 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
104a0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
104b0 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
104c0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
104d0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
104e0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
104f0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
10500 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
10510 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 69  urn rc;.  } .  i
10520 66 28 20 63 6c 6f 73 65 28 66 64 29 20 29 7b 0a  f( close(fd) ){.
10530 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
10540 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
10550 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
10560 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 7d 0a 20  ERR_CLOSE;.  }. 
10570 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73   .  /* got it, s
10580 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
10590 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
105a0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
105b0 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74   locktype;.  ret
105c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
105d0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
105e0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
105f0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
10600 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20  e to locktype.  
10610 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74  locktype.** must
10620 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
10630 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
10640 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
10650 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
10660 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
10670 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
10680 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
10690 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
106a0 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
106b0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
106c0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  -op..**.** When 
106d0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
106e0 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43  l reaches NO_LOC
106f0 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f  K, delete the lo
10700 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ck file..*/.stat
10710 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e  ic int dotlockUn
10720 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
10730 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
10740 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ype) {.  unixFil
10750 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
10760 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
10770 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
10780 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
10790 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  kingContext;..  
107a0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
107b0 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c  .  OSTRACE5("UNL
107c0 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
107d0 64 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69  d pid=%d\n", pFi
107e0 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
107f0 0a 09 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ..   pFile->lock
10800 74 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b  type, getpid());
10810 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
10820 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
10830 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
10840 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
10850 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
10860 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65  cktype==locktype
10870 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10880 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
10890 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65   /* To downgrade
108a0 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70   to shared, simp
108b0 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  ly update our in
108c0 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66  ternal notion of
108d0 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73   the.  ** lock s
108e0 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74  tate.  No need t
108f0 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68 65 20  o mess with the 
10900 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
10910 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
10920 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
10930 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
10940 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
10950 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
10960 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10970 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20   .  /* To fully 
10980 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
10990 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ase, delete the 
109a0 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61  lock file */.  a
109b0 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d  ssert( locktype=
109c0 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  =NO_LOCK );.  if
109d0 28 20 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69  ( unlink(zLockFi
109e0 6c 65 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  le) ){.    int r
109f0 63 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74  c = 0;.    int t
10a00 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
10a10 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d     if( ENOENT !=
10a20 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
10a30 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
10a40 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
10a50 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
10a60 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
10a70 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c    }.    if( IS_L
10a80 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
10a90 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
10aa0 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
10ab0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
10ac0 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46  rn rc; .  }.  pF
10ad0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
10ae0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
10af0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10b00 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
10b10 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  le.  Make sure t
10b20 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
10b30 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65   released before
10b40 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61   closing..*/.sta
10b50 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
10b60 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
10b70 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
10b80 63 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  c;.  if( id ){. 
10b90 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
10ba0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
10bb0 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55  id;.    dotlockU
10bc0 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
10bd0 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  K);.    sqlite3_
10be0 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  free(pFile->lock
10bf0 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  ingContext);.  }
10c00 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69  .  rc = closeUni
10c10 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 72 65 74  xFile(id);.  ret
10c20 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  urn rc;.}./*****
10c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
10c40 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c  d of the dot-fil
10c50 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
10c60 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
10c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
10c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10cc0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
10cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
10d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d30 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63  ***** Begin floc
10d40 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  k Locking ******
10d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
10d70 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29   Use the flock()
10d80 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
10d90 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e  do file locking.
10da0 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c  .**.** flock() l
10db0 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
10dc0 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  ot-file locking 
10dd0 69 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69  in that the vari
10de0 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69  ous.** fine-grai
10df0 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  n locking levels
10e00 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51   supported by SQ
10e10 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73  Lite are collaps
10e20 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ed into.** a sin
10e30 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  gle exclusive lo
10e40 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ck.  In other wo
10e50 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53  rds, SHARED, RES
10e60 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45  ERVED, and.** PE
10e70 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20  NDING locks are 
10e80 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61  the same thing a
10e90 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
10ea0 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20  ock.  SQLite.** 
10eb0 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e  still works when
10ec0 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75   you do this, bu
10ed0 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73  t concurrency is
10ee0 20 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a   reduced since.*
10ef0 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
10f00 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72  process can be r
10f10 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
10f20 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a  ase at a time..*
10f30 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73  *.** Omit this s
10f40 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45  ection if SQLITE
10f50 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
10f60 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20  STYLE is turned 
10f70 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d  off or if.** com
10f80 70 69 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52  piling for VXWOR
10f90 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  KS..*/.#if SQLIT
10fa0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
10fb0 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
10fc0 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  WORKS../*.** Thi
10fd0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
10fe0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
10ff0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
11000 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
11010 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
11020 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
11030 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
11040 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
11050 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
11060 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
11070 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
11080 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
11090 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
110a0 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
110b0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
110c0 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
110d0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
110e0 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
110f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11100 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  flockCheckReserv
11110 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
11120 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
11130 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
11140 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11150 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
11160 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
11170 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
11180 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61  )id;.  .  Simula
11190 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
111a0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
111b0 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
111c0 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
111d0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20  ( pFile );.  .  
111e0 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
111f0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
11200 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
11210 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
11220 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
11230 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
11240 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
11250 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
11260 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
11270 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
11280 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20   holds it. */.  
11290 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
112a0 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20  .    /* attempt 
112b0 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20  to get the lock 
112c0 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d  */.    int lrc =
112d0 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c   flock(pFile->h,
112e0 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
112f0 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72  NB);.    if( !lr
11300 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f  c ){.      /* go
11310 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  t the lock, unlo
11320 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c  ck it */.      l
11330 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65  rc = flock(pFile
11340 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20  ->h, LOCK_UN);. 
11350 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20       if ( lrc ) 
11360 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
11370 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
11380 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20        /* unlock 
11390 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65  failed with an e
113a0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
113b0 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
113c0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
113d0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
113e0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20  OERR_UNLOCK); . 
113f0 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
11400 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
11410 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
11420 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
11430 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
11440 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20  rc = lrc;.      
11450 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11460 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69  } else {.      i
11470 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
11480 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  o;.      reserve
11490 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  d = 1;.      /* 
114a0 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67  someone else mig
114b0 68 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72  ht have it reser
114c0 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ved */.      lrc
114d0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
114e0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
114f0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
11500 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20  R_LOCK); .      
11510 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
11520 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
11530 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11540 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
11550 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
11560 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11570 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 45 53  .  OSTRACE4("TES
11580 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
11590 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
115a0 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a   rc, reserved);.
115b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
115c0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
115d0 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72  _ERRORS.  if( (r
115e0 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c & SQLITE_IOERR
115f0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
11600 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  R ){.    rc = SQ
11610 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73  LITE_OK;.    res
11620 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e  erved=1;.  }.#en
11630 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
11640 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
11650 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65  ERRORS */.  *pRe
11660 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
11670 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11680 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
11690 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
116a0 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
116b0 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79  parameter lockty
116c0 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  pe - one.** of t
116d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
116e0 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
116f0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
11700 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
11710 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
11720 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
11730 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
11740 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
11750 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
11760 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
11770 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
11780 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
11790 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
117a0 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
117b0 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
117c0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
117d0 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
117e0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
117f0 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
11800 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
11810 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
11820 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
11830 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
11840 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
11850 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
11860 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
11870 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
11880 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
11890 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
118a0 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
118b0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
118c0 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
118d0 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
118e0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
118f0 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
11900 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
11910 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
11920 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
11930 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29  VE.**.** flock()
11940 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70   only really sup
11950 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c  port EXCLUSIVE l
11960 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20  ocks.  We track 
11970 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20  intermediate.** 
11980 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74  lock states in t
11990 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
119a0 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61  structure, but a
119b0 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20  ll locks SHARED 
119c0 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20  or.** above are 
119d0 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45  really EXCLUSIVE
119e0 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75   locks and exclu
119f0 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f  de all other pro
11a00 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61  cesses from.** a
11a10 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a  ccess the file..
11a20 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11a30 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
11a40 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
11a50 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
11a60 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
11a70 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
11a80 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
11a90 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
11aa0 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
11ab0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
11ac0 74 79 70 65 29 20 7b 0a 20 20 69 6e 74 20 72 63  type) {.  int rc
11ad0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11ae0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11af0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11b00 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
11b10 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  e );..  /* if we
11b20 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
11b30 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
11b40 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
11b50 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
11b60 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
11b70 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
11b80 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
11b90 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20   > NO_LOCK) {.  
11ba0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
11bb0 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
11bc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11bd0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
11be0 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
11bf0 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69  e lock */.  .  i
11c00 66 20 28 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  f (flock(pFile->
11c10 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43  h, LOCK_EX | LOC
11c20 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74  K_NB)) {.    int
11c30 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
11c40 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67  .    /* didn't g
11c50 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79  et, must be busy
11c60 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
11c70 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
11c80 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
11c90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
11ca0 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
11cb0 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
11cc0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
11cd0 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
11ce0 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20  .    }.  } else 
11cf0 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c  {.    /* got it,
11d00 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
11d10 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
11d20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
11d30 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
11d40 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c   }.  OSTRACE4("L
11d50 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c  OCK    %d %s %s\
11d60 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
11d70 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
11d80 79 70 65 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ype), .         
11d90 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
11da0 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
11db0 22 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ");.#ifdef SQLIT
11dc0 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
11dd0 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28  OCK_ERRORS.  if(
11de0 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f   (rc & SQLITE_IO
11df0 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ERR) == SQLITE_I
11e00 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d  OERR ){.    rc =
11e10 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
11e20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11e30 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
11e40 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
11e50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
11e60 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
11e70 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
11e80 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11e90 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79   pFile to lockty
11ea0 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a  pe.  locktype.**
11eb0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
11ec0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
11ed0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
11ee0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
11ef0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
11f00 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
11f10 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
11f20 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
11f30 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
11f40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
11f50 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
11f60 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c  tic int flockUnl
11f70 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
11f80 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
11f90 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
11fa0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11fb0 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73  ile*)id;.  .  as
11fc0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
11fd0 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43   OSTRACE5("UNLOC
11fe0 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
11ff0 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  pid=%d\n", pFile
12000 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20  ->h, locktype,. 
12010 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
12020 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69  >locktype, getpi
12030 64 28 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d());.  assert( 
12040 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
12050 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
12060 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
12070 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
12080 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63  e->locktype==loc
12090 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74  ktype ){.    ret
120a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
120b0 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65   }.  .  /* share
120c0 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65  d can just be se
120d0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77  t because we alw
120e0 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c  ays have an excl
120f0 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c  usive */.  if (l
12100 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
12110 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
12120 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
12130 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75  cktype;.    retu
12140 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12150 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
12160 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  ally, unlock. */
12170 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63  .  int rc = floc
12180 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
12190 5f 55 4e 29 3b 0a 20 20 69 66 20 28 72 63 29 20  _UN);.  if (rc) 
121a0 7b 0a 20 20 20 20 69 6e 74 20 72 2c 20 74 45 72  {.    int r, tEr
121b0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
121c0 20 72 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72   r = sqliteError
121d0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
121e0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
121f0 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
12200 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
12210 4f 52 28 72 29 20 29 7b 0a 20 20 20 20 20 20 70  OR(r) ){.      p
12220 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
12230 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
12240 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
12250 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
12260 45 52 52 4f 52 53 0a 20 20 20 20 69 66 28 20 28  ERRORS.    if( (
12270 72 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  r & SQLITE_IOERR
12280 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
12290 52 20 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 53  R ){.      r = S
122a0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
122b0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
122c0 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
122d0 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
122e0 20 20 20 0a 20 20 20 20 72 65 74 75 72 6e 20 72     .    return r
122f0 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
12300 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
12310 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
12320 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12330 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
12340 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
12350 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
12360 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
12370 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
12380 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55  id ){.    flockU
12390 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
123a0 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  K);.  }.  return
123b0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
123c0 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  d);.}..#endif /*
123d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
123e0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
123f0 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f  !OS_VXWORK */../
12400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12410 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66  *** End of the f
12420 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  lock lock implem
12430 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
12440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
12450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 2f 0a 0a  *************/..
124a0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
124d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
124e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
124f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12500 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
12510 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c  amed Semaphore L
12520 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
12530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
12540 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  **.** Named sema
12550 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
12560 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20   only supported 
12570 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
12580 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
12590 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
125a0 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69  lock and flock i
125b0 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79  n that it really
125c0 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74   only.** support
125d0 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  s EXCLUSIVE lock
125e0 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e  ing.  Only a sin
125f0 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
12600 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a  read or write.**
12610 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12620 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54  le at a time.  T
12630 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65  his reduces pote
12640 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63  ntial concurrenc
12650 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20  y, but.** makes 
12660 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  the lock impleme
12670 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73  ntation much eas
12680 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56  ier..*/.#if OS_V
12690 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68  XWORKS../*.** Th
126a0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
126b0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
126c0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
126d0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
126e0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
126f0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
12700 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
12710 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
12720 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
12730 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
12740 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
12750 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
12760 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
12770 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
12780 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
12790 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
127a0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
127b0 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
127c0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
127d0 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65   semCheckReserve
127e0 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
127f0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
12800 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
12810 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12820 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
12830 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
12840 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
12850 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
12860 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
12870 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
12880 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
12890 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
128a0 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
128b0 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
128c0 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
128d0 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
128e0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
128f0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  e->locktype>SHAR
12900 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
12910 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
12920 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
12930 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
12940 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
12950 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ds it. */.  if( 
12960 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
12970 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
12980 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65  File->pOpen->pSe
12990 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  m;.    struct st
129a0 61 74 20 73 74 61 74 42 75 66 3b 0a 0a 20 20 20  at statBuf;..   
129b0 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74   if( sem_trywait
129c0 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20  (pSem)==-1 ){.  
129d0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
129e0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66   errno;.      if
129f0 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72  ( EAGAIN != tErr
12a00 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
12a10 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
12a20 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
12a30 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
12a40 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
12a50 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 46  OCK);.        pF
12a60 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12a70 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
12a80 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
12a90 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
12aa0 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65  has the lock whe
12ab0 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c  n we are in NO_L
12ac0 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  OCK */.        r
12ad0 65 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65  eserved = (pFile
12ae0 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 53 48 41  ->locktype < SHA
12af0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
12b00 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
12b10 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20      /* we could 
12b20 68 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61  have it if we wa
12b30 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73  nt it */.      s
12b40 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20  em_post(pSem);. 
12b50 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
12b60 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE4("TEST WR-LOC
12b70 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 70  K %d %d %d\n", p
12b80 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
12b90 65 72 76 65 64 29 3b 0a 0a 20 20 2a 70 52 65 73  erved);..  *pRes
12ba0 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
12bb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12bc0 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
12bd0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
12be0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
12bf0 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
12c00 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
12c10 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
12c20 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
12c30 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
12c40 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
12c50 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
12c60 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
12c70 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
12c80 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
12c90 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
12ca0 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
12cb0 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
12cc0 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
12cd0 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
12ce0 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
12cf0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
12d00 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
12d10 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
12d20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
12d30 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
12d40 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
12d50 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
12d60 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
12d70 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
12d80 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
12d90 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
12da0 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
12db0 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
12dc0 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
12dd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
12de0 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
12df0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
12e00 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
12e10 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
12e20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
12e30 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
12e40 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
12e50 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
12e60 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
12e70 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72  E.**.** Semaphor
12e80 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61  e locks only rea
12e90 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
12ea0 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
12eb0 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
12ec0 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
12ed0 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
12ee0 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
12ef0 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
12f00 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
12f10 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
12f20 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
12f30 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
12f40 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
12f50 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
12f60 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
12f70 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
12f80 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
12f90 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
12fa0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
12fb0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
12fc0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
12fd0 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
12fe0 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74  nt semLock(sqlit
12ff0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
13000 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75   locktype) {.  u
13010 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
13020 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
13030 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f    int fd;.  sem_
13040 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
13050 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a 20 20  >pOpen->pSem;.  
13060 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13070 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20  OK;..  /* if we 
13080 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
13090 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
130a0 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
130b0 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
130c0 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
130d0 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
130e0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
130f0 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
13100 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
13110 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
13120 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13130 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
13140 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
13150 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f   /* lock semapho
13160 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20  re now but bail 
13170 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79  out when already
13180 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66   locked. */.  if
13190 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
131a0 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72  em)==-1 ){.    r
131b0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
131c0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
131d0 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
131e0 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
131f0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
13200 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
13210 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
13220 74 79 70 65 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f  type;.. sem_end_
13230 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72  lock:.  return r
13240 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
13250 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
13260 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
13270 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
13280 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
13290 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
132a0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
132b0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
132c0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
132d0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
132e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
132f0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
13300 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
13310 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
13320 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
13330 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
13340 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
13350 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  mUnlock(sqlite3_
13360 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
13370 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78  cktype) {.  unix
13380 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
13390 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
133a0 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
133b0 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b  le->pOpen->pSem;
133c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
133d0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
133e0 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  Sem );.  OSTRACE
133f0 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  5("UNLOCK  %d %d
13400 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 5c 6e   was %d pid=%d\n
13410 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
13420 6b 74 79 70 65 2c 0a 09 20 20 20 70 46 69 6c 65  ktype,..   pFile
13430 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70  ->locktype, getp
13440 69 64 28 29 29 3b 0a 20 20 61 73 73 65 72 74 28  id());.  assert(
13450 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45   locktype<=SHARE
13460 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
13470 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
13480 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
13490 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f  le->locktype==lo
134a0 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65  cktype ){.    re
134b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
134c0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
134d0 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
134e0 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
134f0 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
13500 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
13510 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
13520 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
13530 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
13540 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74  ocktype;.    ret
13550 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13560 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
13570 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  eally unlock. */
13580 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74  .  if ( sem_post
13590 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20  (pSem)==-1 ) {. 
135a0 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e     int rc, tErrn
135b0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
135c0 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
135d0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
135e0 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
135f0 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
13600 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
13610 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
13620 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
13630 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
13640 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a      return rc; .
13650 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
13660 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  ktype = NO_LOCK;
13670 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13680 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43  _OK;.}../*. ** C
13690 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f  lose a file.. */
136a0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43  .static int semC
136b0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
136c0 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
136d0 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
136e0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
136f0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65  File*)id;.    se
13700 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  mUnlock(id, NO_L
13710 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OCK);.    assert
13720 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75  ( pFile );.    u
13730 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
13740 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b  .    releaseLock
13750 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63  Info(pFile->pLoc
13760 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f  k);.    releaseO
13770 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f  penCnt(pFile->pO
13780 70 65 6e 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  pen);.    unixLe
13790 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
137a0 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
137b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
137c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
137d0 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
137e0 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  KS */./*.** Name
137f0 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
13800 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
13810 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73  lable on VxWorks
13820 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
13830 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
13840 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
13850 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
13860 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
13870 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
13880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138c0 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ***/.../********
138d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13910 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
13920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13930 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63  ** Begin AFP Loc
13940 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
13950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13960 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50  ******.**.** AFP
13970 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69   is the Apple Fi
13980 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20  ling Protocol.  
13990 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b  AFP is a network
139a0 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e   filesystem foun
139b0 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61  d.** on Apple Ma
139c0 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72  cintosh computer
139d0 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64  s - both OS9 and
139e0 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72   OSX..**.** Thir
139f0 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e  d-party implemen
13a00 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61  tations of AFP a
13a10 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42  re available.  B
13a20 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72  ut this code her
13a30 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  e.** only works 
13a40 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20  on OSX..*/..#if 
13a50 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
13a60 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
13a70 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
13a80 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c  E./*.** The afpL
13a90 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74  ockingContext st
13aa0 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
13ab0 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70   all afp lock sp
13ac0 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a  ecific state.*/.
13ad0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61  typedef struct a
13ae0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
13af0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13b00 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f  xt;.struct afpLo
13b10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
13b20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20   int reserved;. 
13b30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50   const char *dbP
13b40 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
13b50 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
13b60 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  open file */.};.
13b70 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67  .struct ByteRang
13b80 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73  eLockPB2.{.  uns
13b90 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
13ba0 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
13bb0 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * offset to firs
13bc0 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a  t byte to lock *
13bd0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
13be0 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20  g long length;  
13bf0 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20        /* nbr of 
13c00 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
13c10 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
13c20 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74   long retRangeSt
13c30 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31  art; /* nbr of 1
13c40 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69  st byte locked i
13c50 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a  f successful */.
13c60 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
13c70 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20  unLockFlag;     
13c80 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63      /* 1 = unloc
13c90 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20  k, 0 = lock */. 
13ca0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73   unsigned char s
13cb0 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20  tartEndFlag;    
13cc0 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65     /* 1=rel to e
13cd0 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65  nd of fork, 0=re
13ce0 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20  l to start */.  
13cf0 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
13d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d10 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74    /* file desc t
13d20 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63  o assoc this loc
13d30 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64  k with */.};..#d
13d40 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52  efine afpfsByteR
13d50 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20  angeLock2FSCTL  
13d60 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c        _IOWR('z',
13d70 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
13d80 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f  RangeLockPB2)../
13d90 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
13da0 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69  tility for setti
13db0 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61  ng or clearing a
13dc0 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20   bit-range lock 
13dd0 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c  on an.** AFP fil
13de0 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20  esystem..** .** 
13df0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
13e00 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c   on success, SQL
13e10 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c  ITE_BUSY on fail
13e20 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
13e30 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20  nt afpSetLock(. 
13e40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
13e50 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
13e60 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
13e70 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
13e80 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a   or unlocked */.
13e90 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
13ea0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
13eb0 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
13ec0 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68  scriptor on path
13ed0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
13ee0 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c  ong long offset,
13ef0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
13f00 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  te to be locked 
13f10 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
13f20 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20  ng long length, 
13f30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13f40 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
13f50 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46  /.  int setLockF
13f60 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
13f70 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65     /* True to se
13f80 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74  t lock.  False t
13f90 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a  o clear lock */.
13fa0 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65  ){.  struct Byte
13fb0 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b  RangeLockPB2 pb;
13fc0 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20  .  int err;.  . 
13fd0 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d   pb.unLockFlag =
13fe0 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30   setLockFlag ? 0
13ff0 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74   : 1;.  pb.start
14000 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70  EndFlag = 0;.  p
14010 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  b.offset = offse
14020 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d  t;.  pb.length =
14030 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66   length; .  pb.f
14040 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
14050 0a 20 20 4f 53 54 52 41 43 45 36 28 22 41 46 50  .  OSTRACE6("AFP
14060 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72  SETLOCK [%s] for
14070 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25   %d%s in range %
14080 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20  llx:%llx\n", .  
14090 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22    (setLockFlag?"
140a0 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c  ON":"OFF"), pFil
140b0 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31  e->h, (pb.fd==-1
140c0 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22  ?"[testval-1]":"
140d0 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20  "),.    offset, 
140e0 6c 65 6e 67 74 68 29 3b 0a 20 20 65 72 72 20 3d  length);.  err =
140f0 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70   fsctl(path, afp
14100 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
14110 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a  FSCTL, &pb, 0);.
14120 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29    if ( err==-1 )
14130 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20   {.    int rc;. 
14140 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
14150 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41  errno;.    OSTRA
14160 43 45 34 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE4("AFPSETLOCK 
14170 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28  failed to fsctl(
14180 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c  ) '%s' %d %s\n",
14190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61  .             pa
141a0 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65  th, tErrno, stre
141b0 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 3b 0a 23  rror(tErrno));.#
141c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
141d0 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52  ORE_AFP_LOCK_ERR
141e0 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ORS.    rc = SQL
141f0 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a  ITE_BUSY;.#else.
14200 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
14210 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
14220 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  or(tErrno,.     
14230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
14240 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c  etLockFlag ? SQL
14250 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a  ITE_IOERR_LOCK :
14260 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
14270 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  LOCK);.#endif /*
14280 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
14290 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  FP_LOCK_ERRORS *
142a0 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  /.    if( IS_LOC
142b0 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
142c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
142d0 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
142e0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
142f0 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   rc;.  } else {.
14300 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14310 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
14320 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14330 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
14340 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
14350 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
14360 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
14370 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
14380 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
14390 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
143a0 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
143b0 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
143c0 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
143d0 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
143e0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
143f0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
14400 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
14410 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
14420 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
14430 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
14440 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
14450 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65  c int afpCheckRe
14460 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
14470 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14480 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
14490 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
144a0 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
144b0 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
144c0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
144d0 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
144e0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
144f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
14500 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
14510 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
14520 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
14530 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
14540 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
14550 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
14560 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
14570 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28  ngContext;.  if(
14580 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
14590 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f  ed ){.    *pResO
145a0 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ut = 1;.    retu
145b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
145c0 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
145d0 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
145e0 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73   pFile->pLock is
145f0 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
14600 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f  hreads */.  .  /
14610 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
14620 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
14630 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
14640 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
14650 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
14660 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
14670 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
14680 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
14690 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
146a0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
146b0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
146c0 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  .   */.  if( !re
146d0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
146e0 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56   lock the RESERV
146f0 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  ED byte */.    i
14700 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c  nt lrc = afpSetL
14710 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
14720 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
14730 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
14740 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54    .    if( SQLIT
14750 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20  E_OK==lrc ){.   
14760 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63     /* if we succ
14770 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20  eeded in taking 
14780 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
14790 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20  k, unlock it to 
147a0 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a  restore.      **
147b0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74   the original st
147c0 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ate */.      lrc
147d0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
147e0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
147f0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
14800 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
14810 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f  } else {.      /
14820 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74  * if we failed t
14830 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74  o get the lock t
14840 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  hen someone else
14850 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f   must have it */
14860 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
14870 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
14880 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
14890 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72  (lrc) ){.      r
148a0 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  c=lrc;.    }.  }
148b0 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
148c0 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
148d0 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E4("TEST WR-LOCK
148e0 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 70 46   %d %d %d\n", pF
148f0 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
14900 72 76 65 64 29 3b 0a 20 20 0a 20 20 2a 70 52 65  rved);.  .  *pRe
14910 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
14920 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14930 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
14940 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
14950 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
14960 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79  parameter lockty
14970 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  pe - one.** of t
14980 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
14990 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
149a0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
149b0 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
149c0 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
149d0 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
149e0 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
149f0 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
14a00 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
14a10 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
14a20 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
14a30 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
14a40 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
14a50 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
14a60 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
14a70 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
14a80 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
14a90 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
14aa0 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
14ab0 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
14ac0 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
14ad0 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
14ae0 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
14af0 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
14b00 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
14b10 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
14b20 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
14b30 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
14b40 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
14b50 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
14b60 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
14b70 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
14b80 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
14b90 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
14ba0 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
14bb0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
14bc0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
14bd0 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
14be0 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
14bf0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
14c00 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
14c10 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
14c20 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
14c30 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
14c40 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
14c50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
14c60 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  fpLock(sqlite3_f
14c70 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
14c80 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
14c90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14ca0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
14cb0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
14cc0 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  .  struct unixLo
14cd0 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20  ckInfo *pLock = 
14ce0 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  pFile->pLock;.  
14cf0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
14d00 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
14d10 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
14d20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
14d30 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61  gContext;.  .  a
14d40 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
14d50 20 20 4f 53 54 52 41 43 45 37 28 22 4c 4f 43 4b    OSTRACE7("LOCK
14d60 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73      %d %s was %s
14d70 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e  (%s,%d) pid=%d\n
14d80 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
14d90 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
14da0 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
14db0 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69  locktypeName(pFi
14dc0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20  le->locktype),. 
14dd0 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
14de0 70 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f  peName(pLock->lo
14df0 63 6b 74 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e  cktype), pLock->
14e00 63 6e 74 20 2c 20 67 65 74 70 69 64 28 29 29 3b  cnt , getpid());
14e10 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
14e20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
14e30 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
14e40 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
14e50 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75  ve on the.  ** u
14e60 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68  nixFile, do noth
14e70 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
14e80 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a  he afp_end_lock:
14e90 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
14ea0 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
14eb0 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
14ec0 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
14ed0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
14ee0 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70  ocktype>=locktyp
14ef0 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  e ){.    OSTRACE
14f00 33 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  3("LOCK    %d %s
14f10 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
14f20 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  d)\n", pFile->h,
14f30 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  .           lock
14f40 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
14f50 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e));.    return 
14f60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
14f70 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
14f80 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
14f90 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
14fa0 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
14fb0 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
14fc0 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
14fd0 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
14fe0 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
14ff0 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
15000 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
15010 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
15020 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
15030 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
15040 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
15050 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
15060 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
15070 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
15080 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
15090 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
150a0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
150b0 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
150c0 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype!=PENDING_LOC
150d0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
150e0 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45  ocktype!=RESERVE
150f0 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
15100 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
15110 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
15120 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
15130 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70  needed because p
15140 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73  File->pLock is s
15150 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
15160 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
15170 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  EnterMutex();.. 
15180 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
15190 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
151a0 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e   owns the pFile.
151b0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61  .  */.  rc = tra
151c0 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70  nsferOwnership(p
151d0 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
151e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
151f0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
15200 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ();.    return r
15210 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d  c;.  }.  pLock =
15220 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a   pFile->pLock;..
15230 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
15240 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
15250 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
15260 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e  a a different un
15270 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  ixFile*.  ** han
15280 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
15290 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
152a0 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
152b0 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
152c0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
152d0 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  =pLock->locktype
152e0 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 4c 6f   && .       (pLo
152f0 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45  ck->locktype>=PE
15300 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f  NDING_LOCK || lo
15310 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f  cktype>SHARED_LO
15320 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20  CK)).     ){.   
15330 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
15340 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  Y;.    goto afp_
15350 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
15360 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
15370 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
15380 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
15390 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
153a0 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
153b0 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
153c0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
153d0 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
153e0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
153f0 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
15400 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
15410 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
15420 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
15430 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63       (pLock->loc
15440 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
15450 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  CK || pLock->loc
15460 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
15470 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
15480 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  ert( locktype==S
15490 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
154a0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
154b0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a  >locktype==0 );.
154c0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
154d0 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20  k->cnt>0 );.    
154e0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
154f0 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
15500 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b     pLock->cnt++;
15510 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65  .    pFile->pOpe
15520 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  n->nLock++;.    
15530 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
15540 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 41  k;.  }.  .  /* A
15550 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
15560 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
15570 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
15580 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
15590 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
155a0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
155b0 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
155c0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
155d0 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
155e0 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
155f0 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
15600 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
15610 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70       || (locktyp
15620 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
15630 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K && pFile->lock
15640 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  type<PENDING_LOC
15650 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  K).  ){.    int 
15660 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c  failed;.    fail
15670 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
15680 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
15690 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
156a0 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20  BYTE, 1, 1);.   
156b0 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
156c0 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
156d0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
156e0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
156f0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
15700 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
15710 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
15720 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
15730 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
15740 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
15750 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
15760 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
15770 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
15780 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
15790 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31   ){.    int lrc1
157a0 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e  , lrc2, lrc1Errn
157b0 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20  o;.    long lk, 
157c0 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61  mask;.    .    a
157d0 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e  ssert( pLock->cn
157e0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t==0 );.    asse
157f0 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  rt( pLock->lockt
15800 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ype==0 );.      
15810 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73    .    mask = (s
15820 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20  izeof(long)==8) 
15830 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20  ? LARGEST_INT64 
15840 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  : 0x7fffffff;.  
15850 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
15860 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45   read-lock SHARE
15870 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a  D_LOCK */.    /*
15880 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71   note that the q
15890 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61  uality of the ra
158a0 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74  ndomness doesn't
158b0 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63   matter that muc
158c0 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61  h */.    lk = ra
158d0 6e 64 6f 6d 28 29 3b 0a 20 20 20 20 70 4c 6f 63  ndom();.    pLoc
158e0 6b 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20  k->sharedByte = 
158f0 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41  (lk & mask)%(SHA
15900 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20  RED_SIZE - 1);. 
15910 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74     lrc1 = afpSet
15920 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
15930 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20  Path, pFile, .  
15940 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
15950 49 52 53 54 2b 70 4c 6f 63 6b 2d 3e 73 68 61 72  IRST+pLock->shar
15960 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  edByte, 1, 1);. 
15970 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
15980 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20  RROR(lrc1) ){.  
15990 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20      lrc1Errno = 
159a0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
159b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44  ;.    }.    /* D
159c0 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rop the temporar
159d0 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a  y PENDING lock *
159e0 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70  /.    lrc2 = afp
159f0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
15a00 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
15a10 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c  PENDING_BYTE, 1,
15a20 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66   0);.    .    if
15a30 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
15a40 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20  lrc1) ) {.      
15a50 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15a60 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20   = lrc1Errno;.  
15a70 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
15a80 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
15a90 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
15aa0 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45  se if( IS_LOCK_E
15ab0 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20  RROR(lrc2) ){.  
15ac0 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20      rc = lrc2;. 
15ad0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
15ae0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
15af0 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53  se if( lrc1 != S
15b00 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20  QLITE_OK ) {.   
15b10 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20     rc = lrc1;.  
15b20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
15b30 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
15b40 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
15b50 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70        pFile->pOp
15b60 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  en->nLock++;.   
15b70 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20     pLock->cnt = 
15b80 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
15b90 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
15ba0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
15bb0 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b   pLock->cnt>1 ){
15bc0 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
15bd0 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
15be0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
15bf0 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
15c00 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73  n this.     ** s
15c10 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
15c20 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
15c30 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
15c40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
15c50 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  USY;.  }else{.  
15c60 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
15c70 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
15c80 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
15c90 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
15ca0 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
15cb0 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
15cc0 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
15cd0 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
15ce0 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
15cf0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66      */.    int f
15d00 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61  ailed = 0;.    a
15d10 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
15d20 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
15d30 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 20 3e 3d   if (locktype >=
15d40 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26   RESERVED_LOCK &
15d50 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
15d60 65 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  e < RESERVED_LOC
15d70 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K) {.        /* 
15d80 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
15d90 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ED lock */.     
15da0 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
15db0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15dc0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
15dd0 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
15de0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66  1);.      if( !f
15df0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
15e00 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
15e10 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ed = 1;.      }.
15e20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66      }.    if (!f
15e30 61 69 6c 65 64 20 26 26 20 6c 6f 63 6b 74 79 70  ailed && locktyp
15e40 65 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  e == EXCLUSIVE_L
15e50 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20  OCK) {.      /* 
15e60 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55  Acquire an EXCLU
15e70 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  SIVE lock */.   
15e80 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52       .      /* R
15e90 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64  emove the shared
15ea0 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79   lock before try
15eb0 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20  ing the range.  
15ec0 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20  we'll need to . 
15ed0 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c       ** reestabl
15ee0 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
15ef0 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20  ock if we can't 
15f00 67 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f  get the  afpUnlo
15f10 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ck.      */.    
15f20 20 20 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d    if( !(failed =
15f30 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
15f40 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
15f50 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
15f60 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
15f70 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 63              pLoc
15f80 6b 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  k->sharedByte, 1
15f90 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 0)) ){.       
15fa0 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53   int failed2 = S
15fb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
15fc0 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70    /* now attemmp
15fd0 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63  t to get the exc
15fe0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67  lusive lock rang
15ff0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  e */.        fai
16000 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
16010 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16020 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
16030 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20  FIRST, .        
16040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16050 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
16060 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ZE, 1);.        
16070 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66  if( failed && (f
16080 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c  ailed2 = afpSetL
16090 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
160a0 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
160d0 20 2b 20 70 4c 6f 63 6b 2d 3e 73 68 61 72 65 64   + pLock->shared
160e0 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a  Byte, 1, 1)) ){.
160f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e            /* Can
16100 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  't reestablish t
16110 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20  he shared lock. 
16120 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65   Sqlite can't de
16130 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20  al, this is.    
16140 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69        ** a criti
16150 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20  cal I/O error.  
16160 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
16170 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c       rc = ((fail
16180 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  ed & SQLITE_IOER
16190 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
161a0 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20  RR) ? failed2 : 
161b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
161c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
161d0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
161e0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
161f0 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
16200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16210 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20  rc = failed; .  
16220 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16230 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20  if( failed ){.  
16240 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
16250 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
16260 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16270 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
16280 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
16290 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  ype;.    pLock->
162a0 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
162b0 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ype;.  }else if(
162c0 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
162d0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
162e0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
162f0 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
16300 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  .    pLock->lock
16310 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  type = PENDING_L
16320 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f  OCK;.  }.  .afp_
16330 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
16340 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
16350 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20  OSTRACE4("LOCK  
16360 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70    %d %s %s\n", p
16370 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
16380 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c  eName(locktype),
16390 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53   .         rc==S
163a0 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
163b0 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72  : "failed");.  r
163c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
163d0 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
163e0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
163f0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
16400 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e  ile to locktype.
16410 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75    locktype.** mu
16420 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
16430 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
16440 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
16450 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
16460 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
16470 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
16480 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
16490 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
164a0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
164b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
164c0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
164d0 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73   int afpUnlock(s
164e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
164f0 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
16500 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16510 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
16520 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
16530 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74 72 75  File*)id;.  stru
16540 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  ct unixLockInfo 
16550 2a 70 4c 6f 63 6b 3b 0a 20 20 61 66 70 4c 6f 63  *pLock;.  afpLoc
16560 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
16570 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
16580 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
16590 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
165a0 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68  xt;.  int skipSh
165b0 61 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66  ared = 0;.#ifdef
165c0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
165d0 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  nt h = pFile->h;
165e0 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 61 73 73  .#endif.  .  ass
165f0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
16600 4f 53 54 52 41 43 45 37 28 22 55 4e 4c 4f 43 4b  OSTRACE7("UNLOCK
16610 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25    %d %d was %d(%
16620 64 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c  d,%d) pid=%d\n",
16630 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
16640 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ype,.           
16650 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
16660 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c   pFile->pLock->l
16670 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
16680 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70  pLock->cnt, getp
16690 69 64 28 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  id());..  assert
166a0 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ( locktype<=SHAR
166b0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  ED_LOCK );.  if(
166c0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
166d0 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  <=locktype ){.  
166e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
166f0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 48  OK;.  }.  if( CH
16700 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70 46 69  ECK_THREADID(pFi
16710 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  le) ){.    retur
16720 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
16730 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
16740 4d 75 74 65 78 28 29 3b 0a 20 20 70 4c 6f 63 6b  Mutex();.  pLock
16750 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b   = pFile->pLock;
16760 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b  .  assert( pLock
16770 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66  ->cnt!=0 );.  if
16780 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
16790 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  e>SHARED_LOCK ){
167a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
167b0 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70 46  ck->locktype==pF
167c0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b  ile->locktype );
167d0 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
167e0 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
167f0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
16800 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20  or( h=(-1) ).   
16810 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
16820 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a  Benign(0);.    .
16830 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
16840 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63     /* When reduc
16850 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20  ing a lock such 
16860 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65  that other proce
16870 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20  sses can start. 
16880 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74      ** reading t
16890 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
168a0 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72   again, make sur
168b0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
168c0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
168d0 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
168e0 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
168f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
16900 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
16910 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
16920 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
16930 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
16940 0a 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  .     ** other c
16950 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
16960 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
16970 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
16980 61 74 0a 20 20 20 20 20 2a 2a 20 74 68 65 20 66  at.     ** the f
16990 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20  ile has changed 
169a0 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20  and hence might 
169b0 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73  not know to flus
169c0 68 20 74 68 65 69 72 0a 20 20 20 20 20 2a 2a 20  h their.     ** 
169d0 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
169e0 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
169f0 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
16a00 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
16a10 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  ..     */.    as
16a20 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e  sert( pFile->inN
16a30 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20  ormalWrite==0.  
16a40 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
16a50 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20  e->dbUpdate==0. 
16a60 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69            || pFi
16a70 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
16a80 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c  g==1 );.    pFil
16a90 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
16aa0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
16ab0 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d   .    if( pFile-
16ac0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55  >locktype==EXCLU
16ad0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
16ae0 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
16af0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
16b00 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45  th, pFile, SHARE
16b10 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f  D_FIRST, SHARED_
16b20 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20  SIZE, 0);.      
16b30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16b40 4b 20 26 26 20 28 6c 6f 63 6b 74 79 70 65 3d 3d  K && (locktype==
16b50 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
16b60 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 29 20 29 7b 0a  Lock->cnt>1) ){.
16b70 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20          /* only 
16b80 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65  re-establish the
16b90 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20   shared lock if 
16ba0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
16bb0 20 20 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c       int sharedL
16bc0 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
16bd0 5f 46 49 52 53 54 2b 70 4c 6f 63 6b 2d 3e 73 68  _FIRST+pLock->sh
16be0 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20  aredByte;.      
16bf0 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
16c00 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
16c10 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64  h, pFile, shared
16c20 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b  LockByte, 1, 1);
16c30 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
16c40 20 20 20 20 20 20 20 20 73 6b 69 70 53 68 61 72          skipShar
16c50 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ed = 1;.      }.
16c60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
16c70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
16c80 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
16c90 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
16ca0 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
16cb0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
16cc0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
16cd0 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
16ce0 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66  );.    } .    if
16cf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16d00 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
16d10 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe>=RESERVED_LOC
16d20 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65  K && context->re
16d30 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20  served ){.      
16d40 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
16d50 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16d60 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
16d70 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
16d80 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a      if( !rc ){ .
16d90 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
16da0 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a  >reserved = 0; .
16db0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16dc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16dd0 5f 4f 4b 20 26 26 20 28 6c 6f 63 6b 74 79 70 65  _OK && (locktype
16de0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
16df0 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 29 29 7b   pLock->cnt>1)){
16e00 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f  .      pLock->lo
16e10 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
16e20 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
16e30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16e40 5f 4f 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  _OK && locktype=
16e50 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20  =NO_LOCK ){..   
16e60 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
16e70 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
16e80 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
16e90 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
16ea0 6e 0a 20 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c  n.     ** OS cal
16eb0 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20  l only when all 
16ec0 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20  threads in this 
16ed0 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76  same process hav
16ee0 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20  e released.     
16ef0 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
16f00 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65    */.    unsigne
16f10 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72  d long long shar
16f20 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41  edLockByte = SHA
16f30 52 45 44 5f 46 49 52 53 54 2b 70 4c 6f 63 6b 2d  RED_FIRST+pLock-
16f40 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
16f50 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20   pLock->cnt--;. 
16f60 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e     if( pLock->cn
16f70 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69  t==0 ){.      Si
16f80 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
16f90 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69  ign(1);.      Si
16fa0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
16fb0 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69  =(-1) ).      Si
16fc0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
16fd0 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
16fe0 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b  ( !skipShared ){
16ff0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
17000 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17010 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17020 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
17030 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
17040 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
17050 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  .        pLock->
17060 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f  locktype = NO_LO
17070 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  CK;.        pFil
17080 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f  e->locktype = NO
17090 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
170a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
170b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
170c0 20 20 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f      struct unixO
170d0 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20  penCnt *pOpen = 
170e0 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20  pFile->pOpen;.  
170f0 20 20 20 20 20 20 0a 20 20 20 20 20 20 70 4f 70        .      pOp
17100 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20  en->nLock--;.   
17110 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e     assert( pOpen
17120 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
17130 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e      if( pOpen->n
17140 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
17150 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 50 65 6e     rc = closePen
17160 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
17170 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17180 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  }.  .  unixLeave
17190 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
171a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
171b0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
171c0 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74   locktype;.  ret
171d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
171e0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20   Close a file & 
171f0 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63  cleanup AFP spec
17200 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e  ific locking con
17210 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20  text .*/.static 
17220 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c  int afpClose(sql
17230 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
17240 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17250 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20  TE_OK;.  if( id 
17260 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
17270 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
17280 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55  le*)id;.    afpU
17290 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
172a0 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65  K);.    unixEnte
172b0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66  rMutex();.    if
172c0 28 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 20 26  ( pFile->pOpen &
172d0 26 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e  & pFile->pOpen->
172e0 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  nLock ){.      /
172f0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
17300 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
17310 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
17320 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
17330 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79   just.      ** y
17340 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
17350 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
17360 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
17370 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
17380 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
17390 74 6f 72 20 74 6f 20 70 4f 70 65 6e 2d 3e 61 50  tor to pOpen->aP
173a0 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c  ending.  It will
173b0 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
173c0 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20  y closed when.  
173d0 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20      ** the last 
173e0 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e  lock is cleared.
173f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17400 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
17410 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  le);.    }.    r
17420 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70  eleaseLockInfo(p
17430 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20  File->pLock);.  
17440 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74    releaseOpenCnt
17450 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a  (pFile->pOpen);.
17460 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
17470 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
17480 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20  ontext);.    rc 
17490 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
174a0 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61  id);.    unixLea
174b0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20  veMutex();.  }. 
174c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
174d0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
174e0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
174f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
17500 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
17510 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
17520 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f  ve is the AFP lo
17530 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
17540 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
17550 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
17560 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
17570 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
17580 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
17590 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
175a0 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
175b0 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20  .  If you don't 
175c0 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61  compile for a ma
175d0 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69  c, then the "uni
175e0 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73  x-afp".** VFS is
175f0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a   not available..
17600 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
17610 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
17620 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
17630 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
17640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17650 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
17660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176a0 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
176b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176f0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
17700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
17710 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e  Begin NFS Lockin
17720 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
17730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17740 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  **/..#if defined
17750 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
17760 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
17770 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a  KING_STYLE./*. *
17780 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
17790 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
177a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
177b0 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  le to locktype. 
177c0 20 6c 6f 63 6b 74 79 70 65 0a 20 2a 2a 20 6d 75   locktype. ** mu
177d0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
177e0 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
177f0 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20  OCK.. **. ** If 
17800 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
17810 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
17820 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
17830 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
17840 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65   ** the requeste
17850 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
17860 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
17870 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74   a no-op.. */.st
17880 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f  atic int nfsUnlo
17890 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
178a0 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
178b0 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 5f 70 6f  e){.  return _po
178c0 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 6c 6f  sixUnlock(id, lo
178d0 63 6b 74 79 70 65 2c 20 31 29 3b 0a 7d 0a 0a 23  cktype, 1);.}..#
178e0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
178f0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
17900 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
17910 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
17920 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
17930 76 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f  ve is the NFS lo
17940 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
17950 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
17960 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
17970 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
17980 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
17990 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
179a0 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
179b0 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
179c0 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .  .**.*********
179d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
179e0 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b   of the NFS lock
179f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
17a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a10 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
17a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a60 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
17a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ab0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
17ac0 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63  ******** Non-loc
17ad0 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c  king sqlite3_fil
17ae0 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e methods ******
17af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b00 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
17b10 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20  e next division 
17b20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65  contains impleme
17b30 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c  ntations for all
17b40 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
17b50 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
17b60 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68   object other th
17b70 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  an the locking m
17b80 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63  ethods.  The loc
17b90 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20  king.** methods 
17ba0 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20  were defined in 
17bb0 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20  divisions above 
17bc0 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  (one locking met
17bd0 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73  hod per.** divis
17be0 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74  ion).  Those met
17bf0 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f  hods that are co
17c00 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
17c10 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65  ing modes.** are
17c20 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72   gather together
17c30 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73   into this divis
17c40 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ion..*/../*.** S
17c50 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
17c60 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
17c70 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
17c80 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a   then read cnt .
17c90 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  ** bytes into pB
17ca0 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  uf. Return the n
17cb0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
17cc0 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a  ctually read..**
17cd0 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20  .** NB:  If you 
17ce0 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
17cf0 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c   or USE_PREAD64,
17d00 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61   then it might a
17d10 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  lso.** be necess
17d20 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  ary to define _X
17d30 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62  OPEN_SOURCE to b
17d40 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72  e 500.  This var
17d50 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20  ies from.** one 
17d60 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65  system to anothe
17d70 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65  r.  Since SQLite
17d80 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65   does not define
17d90 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e   USE_PREAD.** an
17da0 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65  y any form by de
17db0 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e  fault, we will n
17dc0 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65  ot attempt to de
17dd0 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
17de0 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65  CE..** See ticke
17df0 74 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36  ts #2741 and #26
17e00 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  81..**.** To avo
17e10 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
17e20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
17e30 20 66 61 69 6c 65 64 20 72 65 61 64 20 74 68 65   failed read the
17e40 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65   lastErrno value
17e50 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72  .** is set befor
17e60 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
17e70 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
17e80 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20  ndRead(unixFile 
17e90 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
17ea0 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20  64 offset, void 
17eb0 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
17ec0 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20  .  int got;.#if 
17ed0 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  (!defined(USE_PR
17ee0 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64  EAD) && !defined
17ef0 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20  (USE_PREAD64)). 
17f00 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
17f10 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53  #endif.  TIMER_S
17f20 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65  TART;.#if define
17f30 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 67  d(USE_PREAD).  g
17f40 6f 74 20 3d 20 70 72 65 61 64 28 69 64 2d 3e 68  ot = pread(id->h
17f50 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
17f60 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  set);.  Simulate
17f70 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d  IOError( got = -
17f80 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  1 );.#elif defin
17f90 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
17fa0 20 20 67 6f 74 20 3d 20 70 72 65 61 64 36 34 28    got = pread64(
17fb0 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
17fc0 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69 6d  , offset);.  Sim
17fd0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
17fe0 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a  t = -1 );.#else.
17ff0 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
18000 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
18010 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
18020 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18030 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a   newOffset-- );.
18040 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21    if( newOffset!
18050 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69  =offset ){.    i
18060 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20  f( newOffset == 
18070 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e  -1 ){.      ((un
18080 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
18090 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
180a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
180b0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
180c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
180d0 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ....    }.    re
180e0 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67  turn -1;.  }.  g
180f0 6f 74 20 3d 20 72 65 61 64 28 69 64 2d 3e 68 2c  ot = read(id->h,
18100 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e   pBuf, cnt);.#en
18110 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b  dif.  TIMER_END;
18120 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  .  if( got<0 ){.
18130 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
18140 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
18150 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 4f 53   errno;.  }.  OS
18160 54 52 41 43 45 35 28 22 52 45 41 44 20 20 20 20  TRACE5("READ    
18170 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25  %-3d %5d %7lld %
18180 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67  llu\n", id->h, g
18190 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45  ot, offset, TIME
181a0 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72 65  R_ELAPSED);.  re
181b0 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a  turn got;.}../*.
181c0 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
181d0 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
181e0 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
181f0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
18200 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
18210 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
18220 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
18230 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
18240 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
18250 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
18260 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
18270 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64  ile *id, .  void
18280 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
18290 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
182a0 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20  t64 offset.){.  
182b0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
182c0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
182d0 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61  ;.  int got;.  a
182e0 73 73 65 72 74 28 20 69 64 20 29 3b 0a 0a 20 20  ssert( id );..  
182f0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
18300 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
18310 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61  ot a journal, ma
18320 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20  ster-journal or 
18330 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c  temp.  ** file),
18340 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
18350 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
18360 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
18370 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
18380 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
18390 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a  ile->pUnused==0.
183a0 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
183b0 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35  >=PENDING_BYTE+5
183c0 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  12.       || off
183d0 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47  set+amt<=PENDING
183e0 5f 42 59 54 45 20 0a 20 20 29 3b 0a 0a 20 20 67  _BYTE .  );..  g
183f0 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  ot = seekAndRead
18400 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
18410 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66  pBuf, amt);.  if
18420 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20  ( got==amt ){.  
18430 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18440 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
18450 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  got<0 ){.    /* 
18460 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
18470 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
18480 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18490 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
184a0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
184b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
184c0 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d   /* not a system
184d0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a   error */.    /*
184e0 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66   Unread parts of
184f0 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74   the buffer must
18500 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20   be zero-filled 
18510 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28  */.    memset(&(
18520 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74  (char*)pBuf)[got
18530 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a  ], 0, amt-got);.
18540 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18550 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
18560 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  AD;.  }.}../*.**
18570 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66   Seek to the off
18580 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65  set in id->offse
18590 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20  t then read cnt 
185a0 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
185b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
185c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
185d0 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55  ctually read.  U
185e0 70 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74  pdate the offset
185f0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
18600 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72   stomping the er
18610 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66  rno value on a f
18620 61 69 6c 65 64 20 77 72 69 74 65 20 74 68 65 20  ailed write the 
18630 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a  lastErrno value.
18640 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65  ** is set before
18650 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
18660 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
18670 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20  dWrite(unixFile 
18680 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *id, i64 offset,
18690 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
186a0 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
186b0 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65  nt got;.#if (!de
186c0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
186d0 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45   && !defined(USE
186e0 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34  _PREAD64)).  i64
186f0 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64   newOffset;.#end
18700 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  if.  TIMER_START
18710 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ;.#if defined(US
18720 45 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d  E_PREAD).  got =
18730 20 70 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70   pwrite(id->h, p
18740 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
18750 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
18760 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
18770 67 6f 74 20 3d 20 70 77 72 69 74 65 36 34 28 69  got = pwrite64(i
18780 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
18790 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 73 65 0a   offset);.#else.
187a0 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
187b0 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
187c0 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
187d0 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f  if( newOffset!=o
187e0 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66 28  ffset ){.    if(
187f0 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31   newOffset == -1
18800 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78   ){.      ((unix
18810 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
18820 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
18830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 28    }else{.      (
18840 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
18850 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09  lastErrno = 0;..
18860 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ..    }.    retu
18870 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74  rn -1;.  }.  got
18880 20 3d 20 77 72 69 74 65 28 69 64 2d 3e 68 2c 20   = write(id->h, 
18890 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64  pBuf, cnt);.#end
188a0 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  if.  TIMER_END;.
188b0 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20    if( got<0 ){. 
188c0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
188d0 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
188e0 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53  errno;.  }..  OS
188f0 54 52 41 43 45 35 28 22 57 52 49 54 45 20 20 20  TRACE5("WRITE   
18900 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25  %-3d %5d %7lld %
18910 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67  llu\n", id->h, g
18920 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45  ot, offset, TIME
18930 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72 65  R_ELAPSED);.  re
18940 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a  turn got;.}.../*
18950 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
18960 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
18970 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
18980 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
18990 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
189a0 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
189b0 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
189c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
189d0 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  xWrite(.  sqlite
189e0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63  3_file *id, .  c
189f0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
18a00 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
18a10 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
18a20 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69  set .){.  unixFi
18a30 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
18a40 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
18a50 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73   wrote = 0;.  as
18a60 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73  sert( id );.  as
18a70 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a  sert( amt>0 );..
18a80 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
18a90 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
18aa0 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
18ab0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
18ac0 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
18ad0 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
18ae0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
18af0 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
18b00 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
18b10 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
18b20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d  pFile->pUnused==
18b30 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  0.       || offs
18b40 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et>=PENDING_BYTE
18b50 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f  +512.       || o
18b60 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49  ffset+amt<=PENDI
18b70 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 0a 23  NG_BYTE .  );..#
18b80 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
18b90 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
18ba0 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74  ng a normal writ
18bb0 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  e to a database 
18bc0 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64  file (as opposed
18bd0 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61   to.  ** doing a
18be0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
18bf0 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65  lback or a write
18c00 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74   to some file ot
18c10 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20  her than a.  ** 
18c20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
18c30 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72  file) then recor
18c40 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
18c50 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
18c60 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20  * has changed.  
18c70 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
18c80 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f  on counter is mo
18c90 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74  dified, record t
18ca0 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f  hat.  ** fact to
18cb0 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  o..  */.  if( pF
18cc0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
18cd0 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  te ){.    pFile-
18ce0 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20  >dbUpdate = 1;  
18cf0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
18d00 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
18d10 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66  d */.    if( off
18d20 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65  set<=24 && offse
18d30 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20  t+amt>=27 ){.   
18d40 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
18d50 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d   char oldCntr[4]
18d60 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
18d70 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
18d80 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65  ;.      rc = see
18d90 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
18da0 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b  24, oldCntr, 4);
18db0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
18dc0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
18dd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34  .      if( rc!=4
18de0 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e   || memcmp(oldCn
18df0 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75  tr, &((char*)pBu
18e00 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34  f)[24-offset], 4
18e10 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
18e20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
18e30 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68  Chng = 1;  /* Th
18e40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
18e50 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65  unter has change
18e60 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  d */.      }.   
18e70 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
18e80 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26   while( amt>0 &&
18e90 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e   (wrote = seekAn
18ea0 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66  dWrite(pFile, of
18eb0 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
18ec0 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d  )>0 ){.    amt -
18ed0 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66  = wrote;.    off
18ee0 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20  set += wrote;.  
18ef0 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
18f00 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
18f10 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f    }.  SimulateIO
18f20 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d  Error(( wrote=(-
18f30 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20  1), amt=1 ));.  
18f40 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
18f50 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c  Error(( wrote=0,
18f60 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69 66 28   amt=1 ));.  if(
18f70 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66   amt>0 ){.    if
18f80 28 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20 20  ( wrote<0 ){.   
18f90 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
18fa0 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72  set by seekAndWr
18fb0 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ite */.      ret
18fc0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
18fd0 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  _WRITE;.    }els
18fe0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
18ff0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f  lastErrno = 0; /
19000 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65  * not a system e
19010 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65  rror */.      re
19020 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
19030 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
19040 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19050 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
19060 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  _TEST./*.** Coun
19070 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
19080 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f  fullsyncs and no
19090 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69  rmal syncs.  Thi
190a0 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  s is used to tes
190b0 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20  t.** that syncs 
190c0 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72  and fullsyncs ar
190d0 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74  e occurring at t
190e0 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a  he right times..
190f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
19100 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69  ync_count = 0;.i
19110 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  nt sqlite3_fulls
19120 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ync_count = 0;.#
19130 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20  endif../*.** We 
19140 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73  do not trust sys
19150 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20  tems to provide 
19160 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73  a working fdatas
19170 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e  ync().  Some do.
19180 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f  .** Others do no
19190 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77  .  To be safe, w
191a0 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74  e will stick wit
191b0 68 20 74 68 65 20 28 73 6c 6f 77 65 72 29 20 66  h the (slower) f
191c0 73 79 6e 63 28 29 2e 0a 2a 2a 20 49 66 20 79 6f  sync()..** If yo
191d0 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72  u know that your
191e0 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70   system does sup
191f0 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28 29  port fdatasync()
19200 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74   correctly,.** t
19210 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69  hen simply compi
19220 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61 73  le with -Dfdatas
19230 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a 2f  ync=fdatasync.*/
19240 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66 64  .#if !defined(fd
19250 61 74 61 73 79 6e 63 29 20 26 26 20 21 64 65 66  atasync) && !def
19260 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a  ined(__linux__).
19270 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79  # define fdatasy
19280 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a  nc fsync.#endif.
19290 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41  ./*.** Define HA
192a0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20  VE_FULLFSYNC to 
192b0 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67  0 or 1 depending
192c0 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
192d0 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c  ot.** the F_FULL
192e0 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64  FSYNC macro is d
192f0 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46  efined.  F_FULLF
19300 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c  SYNC is currentl
19310 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61  y.** only availa
19320 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e  ble on Mac OS X.
19330 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64    But that could
19340 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64   change..*/.#ifd
19350 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23  ef F_FULLFSYNC.#
19360 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
19370 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23  LFSYNC 1.#else.#
19380 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
19390 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a  LFSYNC 0.#endif.
193a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e  ../*.** The fsyn
193b0 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  c() system call 
193c0 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73  does not work as
193d0 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d   advertised on m
193e0 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74  any.** unix syst
193f0 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ems.  The follow
19400 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73  ing procedure is
19410 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d   an attempt to m
19420 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62  ake.** it work b
19430 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etter..**.** The
19440 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
19450 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61  macro disables a
19460 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68  ll fsync()s.  Th
19470 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20  is is useful.** 
19480 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e  for testing when
19490 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20   we want to run 
194a0 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74  through the test
194b0 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a   suite quickly..
194c0 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e  ** You are stron
194d0 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74  gly advised *not
194e0 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68  * to deploy with
194f0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
19500 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65  ** enabled, howe
19510 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20  ver, since with 
19520 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
19530 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72  nabled, an OS cr
19540 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  ash.** or power 
19550 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b  failure will lik
19560 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20  ely corrupt the 
19570 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
19580 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73  *.** SQLite sets
19590 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
195a0 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f  ag if the size o
195b0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
195c0 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20  changed..** The 
195d0 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61  idea behind data
195e0 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20  Only is that it 
195f0 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74  should only writ
19600 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65  e the file conte
19610 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e  nt.** to disk, n
19620 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57  ot the inode.  W
19630 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f  e only set dataO
19640 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20  nly if the file 
19650 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68  size is .** unch
19660 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20  anged since the 
19670 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72  file size is par
19680 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20  t of the inode. 
19690 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65   However, .** Te
196a0 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20  d Ts'o tells us 
196b0 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29  that fdatasync()
196c0 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65   will also write
196d0 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68   the inode if th
196e0 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68  e.** file size h
196f0 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65  as changed.  The
19700 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65   only real diffe
19710 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64  rence between fd
19720 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64  atasync().** and
19730 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65   fsync(), Ted te
19740 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20  lls us, is that 
19750 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c  fdatasync() will
19760 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a   not flush the.*
19770 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d  * inode if the m
19780 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72  time or owner or
19790 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74   other inode att
197a0 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61  ributes have cha
197b0 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79  nged..** We only
197c0 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
197d0 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74  file size, not t
197e0 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74  he other file at
197f0 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20  tributes, so.** 
19800 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65  as far as SQLite
19810 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61   is concerned, a
19820 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73  n fdatasync() is
19830 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65   always adequate
19840 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61  ..** So, we alwa
19850 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63  ys use fdatasync
19860 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69  () if it is avai
19870 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73  lable, regardles
19880 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75  s of.** the valu
19890 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c  e of the dataOnl
198a0 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69  y flag..*/.stati
198b0 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  c int full_fsync
198c0 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c  (int fd, int ful
198d0 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f  lSync, int dataO
198e0 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
198f0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
19900 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f  ing "ifdef/elif/
19910 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73  else/" block has
19920 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74   the same struct
19930 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ure as.  ** the 
19940 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73  one below. It is
19950 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65   replicated here
19960 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64   solely to avoid
19970 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a   cluttering .  *
19980 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f  * up the real co
19990 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53  de with the UNUS
199a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d  ED_PARAMETER() m
199b0 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  acros..  */.#ifd
199c0 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
199d0 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
199e0 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
199f0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c  ED_PARAMETER(ful
19a00 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44  lSync);.  UNUSED
19a10 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
19a20 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45  nly);.#elif HAVE
19a30 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55  _FULLFSYNC.  UNU
19a40 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
19a50 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20  taOnly);.#else. 
19a60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
19a70 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55  R(fullSync);.  U
19a80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
19a90 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69  dataOnly);.#endi
19aa0 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  f..  /* Record t
19ab0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
19ac0 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20  es that we do a 
19ad0 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61  normal fsync() a
19ae0 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e  nd .  ** FULLSYN
19af0 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  C.  This is used
19b00 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20   during testing 
19b10 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
19b20 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20  his procedure.  
19b30 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ** gets called w
19b40 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
19b50 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  arguments..  */.
19b60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
19b70 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  ST.  if( fullSyn
19b80 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  c ) sqlite3_full
19b90 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sync_count++;.  
19ba0 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
19bb0 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
19bc0 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  /* If we compile
19bd0 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
19be0 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20  E_NO_SYNC flag, 
19bf0 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20  then syncing is 
19c00 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a  a.  ** no-op.  *
19c10 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19c20 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53  NO_SYNC.  rc = S
19c30 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20  QLITE_OK;.#elif 
19c40 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
19c50 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b   if( fullSync ){
19c60 0a 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 28  .    rc = fcntl(
19c70 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c  fd, F_FULLFSYNC,
19c80 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
19c90 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20    rc = 1;.  }.  
19ca0 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53  /* If the FULLFS
19cb0 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c  YNC failed, fall
19cc0 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74   back to attempt
19cd0 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a  ing an fsync()..
19ce0 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27    ** It shouldn'
19cf0 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f  t be possible fo
19d00 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66  r fullfsync to f
19d10 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ail on the local
19d20 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74   .  ** file syst
19d30 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20  em (on OSX), so 
19d40 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65  failure indicate
19d50 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43  s that FULLFSYNC
19d60 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70  .  ** isn't supp
19d70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20 66  orted for this f
19d80 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20  ile system. So, 
19d90 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63  attempt an fsync
19da0 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20   .  ** and (for 
19db0 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20  now) ignore the 
19dc0 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73 75  overhead of a su
19dd0 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20  perfluous fcntl 
19de0 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27  call.  .  ** It'
19df0 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20 64  d be better to d
19e00 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20  etect fullfsync 
19e10 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64  support once and
19e20 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65   avoid .  ** the
19e30 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72   fcntl call ever
19e40 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63  y time sync is c
19e50 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  alled..  */.  if
19e60 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e  ( rc ) rc = fsyn
19e70 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65  c(fd);..#elif de
19e80 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
19e90 0a 20 20 2f 2f 20 66 64 61 74 61 73 79 6e 63 28  .  // fdatasync(
19ea0 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27  ) on HFS+ doesn'
19eb0 74 20 79 65 74 20 66 6c 75 73 68 20 74 68 65 20  t yet flush the 
19ec0 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20  file size if it 
19ed0 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c  changed correctl
19ee0 79 0a 09 2f 2f 20 73 6f 20 63 75 72 72 65 6e 74  y..// so current
19ef0 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f  ly we default to
19f00 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20   the macro that 
19f10 72 65 64 65 66 69 6e 65 73 20 66 64 61 74 61 73  redefines fdatas
19f20 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 72  ync to fsync.  r
19f30 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 23  c = fsync(fd);.#
19f40 65 6c 73 65 0a 20 20 72 63 20 3d 20 66 64 61 74  else.  rc = fdat
19f50 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f  async(fd);.#if O
19f60 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
19f70 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d  rc==-1 && errno=
19f80 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20  =ENOTSUP ){.    
19f90 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
19fa0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53    }.#endif /* OS
19fb0 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64  _VXWORKS */.#end
19fc0 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49  if /* ifdef SQLI
19fd0 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20  TE_NO_SYNC elif 
19fe0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a  HAVE_FULLFSYNC *
19ff0 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f  /..  if( OS_VXWO
1a000 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29  RKS && rc!= -1 )
1a010 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20  {.    rc = 0;.  
1a020 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a030 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1a040 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
1a050 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
1a060 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
1a070 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49  to disk..**.** I
1a080 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68  f dataOnly==0 th
1a090 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65  en both the file
1a0a0 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20   itself and its 
1a0b0 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a  metadata (file.*
1a0c0 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74  * size, access t
1a0d0 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79  ime, etc) are sy
1a0e0 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e  nced.  If dataOn
1a0f0 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20  ly!=0 then only 
1a100 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61  the.** file data
1a110 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
1a120 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c  * Under Unix, al
1a130 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  so make sure tha
1a140 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  t the directory 
1a150 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
1a160 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
1a170 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d  reated by fsync-
1a180 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
1a190 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
1a1a0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20  the file..** If 
1a1b0 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  we do not do thi
1a1c0 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74  s and we encount
1a1d0 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
1a1e0 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72  re, the director
1a1f0 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74  y.** entry for t
1a200 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1a210 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72   not exist after
1a220 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65   we reboot.  The
1a230 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20   next.** SQLite 
1a240 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69  to access the fi
1a250 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77  le will not know
1a260 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1a270 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73  l exists (becaus
1a280 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f  e.** the directo
1a290 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1a2a0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76   journal was nev
1a2b0 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20  er created) and 
1a2c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
1a2d0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
1a2e0 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79   back - possibly
1a2f0 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61   leading to data
1a300 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1a310 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1a320 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  nixSync(sqlite3_
1a330 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
1a340 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
1a350 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1a360 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1a370 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61  d;..  int isData
1a380 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51  Only = (flags&SQ
1a390 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
1a3a0 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c  LY);.  int isFul
1a3b0 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30  lsync = (flags&0
1a3c0 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1a3d0 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68  C_FULL;..  /* Ch
1a3e0 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
1a3f0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1a400 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
1a410 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
1a420 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
1a430 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1a440 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
1a450 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
1a460 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
1a470 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
1a480 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
1a490 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
1a4a0 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
1a4b0 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
1a4c0 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
1a4d0 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
1a4e0 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
1a4f0 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
1a500 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
1a510 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
1a520 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
1a530 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
1a540 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 53  );.  OSTRACE2("S
1a550 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20  YNC    %-3d\n", 
1a560 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 72 63 20  pFile->h);.  rc 
1a570 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  = full_fsync(pFi
1a580 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e  le->h, isFullsyn
1a590 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a  c, isDataOnly);.
1a5a0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1a5b0 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
1a5c0 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
1a5d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1a5e0 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
1a5f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
1a600 4e 43 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46  NC;.  }.  if( pF
1a610 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b  ile->dirfd>=0 ){
1a620 0a 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  .    int err;.  
1a630 20 20 4f 53 54 52 41 43 45 34 28 22 44 49 52 53    OSTRACE4("DIRS
1a640 59 4e 43 20 25 2d 33 64 20 28 68 61 76 65 5f 66  YNC %-3d (have_f
1a650 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c  ullfsync=%d full
1a660 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69  sync=%d)\n", pFi
1a670 6c 65 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20 20  le->dirfd,.     
1a680 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c         HAVE_FULL
1a690 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e  FSYNC, isFullsyn
1a6a0 63 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  c);.#ifndef SQLI
1a6b0 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
1a6c0 4e 43 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69  NC.    /* The di
1a6d0 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20  rectory sync is 
1a6e0 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
1a6f0 66 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a  f full_fsync is.
1a700 20 20 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66      ** turned of
1a710 66 20 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c 65  f or unavailable
1a720 2e 20 20 49 66 20 61 20 66 75 6c 6c 5f 66 73 79  .  If a full_fsy
1a730 6e 63 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76  nc occurred abov
1a740 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  e,.    ** then t
1a750 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e  he directory syn
1a760 63 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73  c is superfluous
1a770 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1a780 20 28 21 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e   (!HAVE_FULLFSYN
1a790 43 20 7c 7c 20 21 69 73 46 75 6c 6c 73 79 6e 63  C || !isFullsync
1a7a0 29 20 26 26 20 66 75 6c 6c 5f 66 73 79 6e 63 28  ) && full_fsync(
1a7b0 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 30 2c 30  pFile->dirfd,0,0
1a7c0 29 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 0a 20  ) ){.       /*. 
1a7d0 20 20 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65        ** We have
1a7e0 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70   received multip
1a7f0 6c 65 20 72 65 70 6f 72 74 73 20 6f 66 20 66 73  le reports of fs
1a800 79 6e 63 28 29 20 72 65 74 75 72 6e 69 6e 67 0a  ync() returning.
1a810 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73         ** errors
1a820 20 77 68 65 6e 20 61 70 70 6c 69 65 64 20 74 6f   when applied to
1a830 20 64 69 72 65 63 74 6f 72 69 65 73 20 6f 6e 20   directories on 
1a840 63 65 72 74 61 69 6e 20 66 69 6c 65 20 73 79 73  certain file sys
1a850 74 65 6d 73 2e 0a 20 20 20 20 20 20 20 2a 2a 20  tems..       ** 
1a860 41 20 66 61 69 6c 65 64 20 64 69 72 65 63 74 6f  A failed directo
1a870 72 79 20 73 79 6e 63 20 69 73 20 6e 6f 74 20 61  ry sync is not a
1a880 20 62 69 67 20 64 65 61 6c 2e 20 20 53 6f 20 69   big deal.  So i
1a890 74 20 73 65 65 6d 73 0a 20 20 20 20 20 20 20 2a  t seems.       *
1a8a0 2a 20 62 65 74 74 65 72 20 74 6f 20 69 67 6e 6f  * better to igno
1a8b0 72 65 20 74 68 65 20 65 72 72 6f 72 2e 20 20 54  re the error.  T
1a8c0 69 63 6b 65 74 20 23 31 36 35 37 0a 20 20 20 20  icket #1657.    
1a8d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20     */.       /* 
1a8e0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1a8f0 20 3d 20 65 72 72 6e 6f 3b 20 2a 2f 0a 20 20 20   = errno; */.   
1a900 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53 51      /* return SQ
1a910 4c 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20  LITE_IOERR; */. 
1a920 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1a930 65 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c  err = close(pFil
1a940 65 2d 3e 64 69 72 66 64 29 3b 20 2f 2a 20 4f 6e  e->dirfd); /* On
1a950 6c 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20  ly need to sync 
1a960 6f 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74  once, so close t
1a970 68 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 72  he */.    if( er
1a980 72 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  r==0 ){         
1a990 20 20 20 20 20 2f 2a 20 64 69 72 65 63 74 6f 72       /* director
1a9a0 79 20 77 68 65 6e 20 77 65 20 61 72 65 20 64 6f  y when we are do
1a9b0 6e 65 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c  ne */.      pFil
1a9c0 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  e->dirfd = -1;. 
1a9d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a9e0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1a9f0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
1aa00 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
1aa10 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20  R_DIR_CLOSE;.   
1aa20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1aa30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
1aa40 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
1aa50 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
1aa60 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
1aa70 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
1aa80 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1aa90 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  id, i64 nByte){.
1aaa0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1aab0 72 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75  rt( id );.  Simu
1aac0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
1aad0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1aae0 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 20 20 72  _TRUNCATE );.  r
1aaf0 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28 28  c = ftruncate(((
1ab00 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
1ab10 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b  , (off_t)nByte);
1ab20 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1ab30 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1ab40 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1ab50 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
1ab60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1ab70 4e 43 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NCATE;.  }else{.
1ab80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ab90 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
1aba0 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
1abb0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1abc0 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
1abd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1abe0 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  nixFileSize(sqli
1abf0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36  te3_file *id, i6
1ac00 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  4 *pSize){.  int
1ac10 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74   rc;.  struct st
1ac20 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74  at buf;.  assert
1ac30 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 66  ( id );.  rc = f
1ac40 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a  stat(((unixFile*
1ac50 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  )id)->h, &buf);.
1ac60 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1ac70 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
1ac80 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 28 28   rc!=0 ){.    ((
1ac90 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
1aca0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1acb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1acc0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
1acd0 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20  .  }.  *pSize = 
1ace0 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20  buf.st_size;..  
1acf0 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  /* When opening 
1ad00 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61  a zero-size data
1ad10 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64 4c 6f  base, the findLo
1ad20 63 6b 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75  ckInfo() procedu
1ad30 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61  re.  ** writes a
1ad40 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74   single byte int
1ad50 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f  o that file in o
1ad60 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f  rder to work aro
1ad70 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69  und a bug.  ** i
1ad80 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73  n the OS-X msdos
1ad90 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e   filesystem.  In
1ada0 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
1adb0 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70  problems with up
1adc0 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c  per.  ** layers,
1add0 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f   we need to repo
1ade0 72 74 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a  rt this file siz
1adf0 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74  e as zero even t
1ae00 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a  hough it is.  **
1ae10 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63   really 1.   Tic
1ae20 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a  ket #3260..  */.
1ae30 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20    if( *pSize==1 
1ae40 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a  ) *pSize = 0;...
1ae50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ae60 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
1ae70 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1ae80 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1ae90 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a  d(__APPLE__)./*.
1aea0 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70  ** Handler for p
1aeb0 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c  roxy-locking fil
1aec0 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e  e-control verbs.
1aed0 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20    Defined below 
1aee0 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69  in the.** proxyi
1aef0 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73  ng locking divis
1af00 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1af10 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  nt proxyFileCont
1af20 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
1af30 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65  *,int,void*);.#e
1af40 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66  ndif.../*.** Inf
1af50 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e  ormation and con
1af60 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20  trol of an open 
1af70 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  file handle..*/.
1af80 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
1af90 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
1afa0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
1afb0 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
1afc0 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  {.  switch( op )
1afd0 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1afe0 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
1aff0 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  E: {.      *(int
1b000 2a 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46  *)pArg = ((unixF
1b010 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79  ile*)id)->lockty
1b020 70 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  pe;.      return
1b030 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b040 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1b050 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a  E_LAST_ERRNO: {.
1b060 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
1b070 67 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29  g = ((unixFile*)
1b080 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  id)->lastErrno;.
1b090 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b0a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69  ITE_OK;.    }.#i
1b0b0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
1b0c0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
1b0d0 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20  lls this method 
1b0e0 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69  to signal that i
1b0f0 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a  t has done.    *
1b100 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  * a rollback and
1b110 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1b120 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  se is therefore 
1b130 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20  unchanged and.  
1b140 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74    ** it hence it
1b150 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74   is OK for the t
1b160 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67  ransaction chang
1b170 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a  e counter to be.
1b180 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64      ** unchanged
1b190 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1b1a0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  e SQLITE_FCNTL_D
1b1b0 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20  B_UNCHANGED: {. 
1b1c0 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
1b1d0 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d  )id)->dbUpdate =
1b1e0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1b1f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b200 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  }.#endif.#if SQL
1b210 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1b220 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1b230 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1b240 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
1b250 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
1b260 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
1b270 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
1b280 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ILE: {.      ret
1b290 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  urn proxyFileCon
1b2a0 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29  trol(id,op,pArg)
1b2b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1b2c0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
1b2d0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1b2e0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1b2f0 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  __) */.  }.  ret
1b300 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1b310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1b320 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  n the sector siz
1b330 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68  e in bytes of th
1b340 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f  e underlying blo
1b350 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a  ck device for.**
1b360 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
1b370 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d  ile. This is alm
1b380 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62  ost always 512 b
1b390 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65  ytes, but may be
1b3a0 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73  .** larger for s
1b3b0 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a  ome devices..**.
1b3c0 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61  ** SQLite code a
1b3d0 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63  ssumes this func
1b3e0 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tion cannot fail
1b3f0 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65  . It also assume
1b400 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f  s that.** if two
1b410 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
1b420 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66  ed in the same f
1b430 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63  ile-system direc
1b440 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20  tory (i.e..** a 
1b450 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73  database and its
1b460 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74   journal file) t
1b470 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73  hat the sector s
1b480 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a  ize will be the.
1b490 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68  ** same for both
1b4a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b4b0 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73  unixSectorSize(s
1b4c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
1b4d0 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
1b4e0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
1b4f0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d);.  return SQL
1b500 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
1b510 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  OR_SIZE;.}../*.*
1b520 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
1b530 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
1b540 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ics for the file
1b550 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73  . This is always
1b560 20 30 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a   0 for unix..*/.
1b570 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
1b580 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1b590 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  tics(sqlite3_fil
1b5a0 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  e *NotUsed){.  U
1b5b0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1b5c0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
1b5d0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  rn 0;.}../*.** H
1b5e0 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
1b5f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
1b600 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
1b610 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
1b620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b630 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
1b640 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
1b650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
1b670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b6b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
1b6c0 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
1b6d0 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
1b6e0 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
1b6f0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
1b700 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c  cts that.** impl
1b710 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69  ement various fi
1b720 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  le locking strat
1b730 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20  egies.  It also 
1b740 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
1b750 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64  ions.** of "find
1b760 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  er" functions.  
1b770 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  A finder-functio
1b780 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63  n is used to loc
1b790 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ate the appropri
1b7a0 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  ate.** sqlite3_i
1b7b0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
1b7c0 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
1b7d0 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  r database file.
1b7e0 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a    The pAppData.*
1b7f0 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73  * field of the s
1b800 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f  qlite3_vfs VFS o
1b810 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69  bjects are initi
1b820 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69  alized to be poi
1b830 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  nters to.** the 
1b840 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66  correct finder-f
1b850 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  unction for that
1b860 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74   VFS..**.** Most
1b870 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
1b880 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
1b890 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
1b8a0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1b8b0 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  .** object.  The
1b8c0 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e   only interestin
1b8d0 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  g finder-functio
1b8e0 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  n is autolockIoF
1b8f0 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20  inder, which.** 
1b900 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c  looks at the fil
1b910 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64  esystem type and
1b920 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20   tries to guess 
1b930 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
1b940 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f  .** strategy fro
1b950 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  m that..**.** Fo
1b960 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e  r finder-funtion
1b970 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20   F, two objects 
1b980 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a  are created:.**.
1b990 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72 65  **    (1) The re
1b9a0 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  al finder-functi
1b9b0 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28  on named "FImpt(
1b9c0 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  )"..**.**    (2)
1b9d0 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e   A constant poin
1b9e0 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ter to this func
1b9f0 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20  tion named just 
1ba00 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20  "F"..**.**.** A 
1ba10 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46  pointer to the F
1ba20 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64   pointer is used
1ba30 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74 61   as the pAppData
1ba40 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a   value for VFS.*
1ba50 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68  * objects.  We h
1ba60 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69  ave to do this i
1ba70 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e  nstead of lettin
1ba80 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74  g pAppData point
1ba90 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20  .** directly at 
1baa0 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  the finder-funct
1bab0 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75  ion since C90 ru
1bac0 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f  les prevent a vo
1bad0 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63  id*.** from be c
1bae0 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74  ast into a funct
1baf0 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ion pointer..**.
1bb00 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61  **.** Each insta
1bb10 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72  nce of this macr
1bb20 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20  o generates two 
1bb30 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  objects:.**.**  
1bb40 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73   *  A constant s
1bb50 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1bb60 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45  s object call ME
1bb70 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f  THOD that has lo
1bb80 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65  cking.**      me
1bb90 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43  thods CLOSE, LOC
1bba0 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53  K, UNLOCK, CKRES
1bbb0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  LOCK..**.**   * 
1bbc0 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66   An I/O method f
1bbd0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63  inder function c
1bbe0 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61  alled FINDER tha
1bbf0 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  t returns a poin
1bc00 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ter.**      to t
1bc10 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74  he METHOD object
1bc20 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
1bc30 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66   bullet..*/.#def
1bc40 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49  ine IOMETHODS(FI
1bc50 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 43 4c  NDER, METHOD, CL
1bc60 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43  OSE, LOCK, UNLOC
1bc70 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20  K, CKLOCK)      
1bc80 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69           \.stati
1bc90 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
1bca0 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f  io_methods METHO
1bcb0 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20  D = {           
1bcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcd0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 31 2c 20          \.   1, 
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcf0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
1bd00 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  sion */         
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53         \.   CLOS
1bd30 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
1bd40 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
1bd50 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
1bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd70 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52        \.   unixR
1bd80 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
1bd90 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
1bda0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1bdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdc0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72       \.   unixWr
1bdd0 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
1bde0 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
1bdf0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1be00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be10 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75      \.   unixTru
1be20 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
1be30 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
1be40 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
1be50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be60 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63     \.   unixSync
1be70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1be80 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20      /* xSync */ 
1be90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1beb0 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53    \.   unixFileS
1bec0 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
1bed0 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20     /* xFileSize 
1bee0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf00 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20   \.   LOCK,     
1bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20    /* xLock */   
1bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf50 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20  \.   UNLOCK,    
1bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf70 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20   /* xUnlock */  
1bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1bfa0 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20  .   CKLOCK,     
1bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfc0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
1bfd0 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  dLock */        
1bfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1bff0 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72     unixFileContr
1c000 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ol,            /
1c010 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
1c020 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1c030 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1c040 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65    unixSectorSize
1c050 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1c060 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20   xSectorSize */ 
1c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c080 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1c090 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
1c0a0 63 74 65 72 69 73 74 69 63 73 20 20 20 2f 2a 20  cteristics   /* 
1c0b0 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69 74  xDeviceCapabilit
1c0c0 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ies */          
1c0d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20             \.}; 
1c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c120 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
1c130 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
1c140 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e  _io_methods *FIN
1c150 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20  DER##Impl(const 
1c160 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c  char *z, unixFil
1c170 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55  e *p){   \.  UNU
1c180 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29  SED_PARAMETER(z)
1c190 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  ; UNUSED_PARAMET
1c1a0 45 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 20  ER(p);          
1c1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1c0 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75          \.  retu
1c1d0 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20  rn &METHOD;     
1c1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c210 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20         \.}      
1c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c260 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
1c270 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
1c280 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74  methods *(*const
1c290 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63   FINDER)(const c
1c2a0 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70  har*,unixFile *p
1c2b0 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e  )    \.    = FIN
1c2c0 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a  DER##Impl;../*.*
1c2d0 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f  * Here are all o
1c2e0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  f the sqlite3_io
1c2f0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
1c300 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65   for each of the
1c310 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  .** locking stra
1c320 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f  tegies.  Functio
1c330 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70  ns that return p
1c340 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65  ointers to these
1c350 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20   methods.** are 
1c360 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f  also created..*/
1c370 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f  .IOMETHODS(.  po
1c380 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  sixIoFinder,    
1c390 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
1c3a0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
1c3b0 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68  */.  posixIoMeth
1c3c0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
1c3d0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
1c3e0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
1c3f0 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
1c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c410 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
1c420 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
1c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c440 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
1c450 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c  */.  unixUnlock,
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c470 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
1c480 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
1c490 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
1c4a0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
1c4b0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
1c4c0 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e  ).IOMETHODS(.  n
1c4d0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  olockIoFinder,  
1c4e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
1c4f0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
1c500 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65   */.  nolockIoMe
1c510 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
1c520 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
1c530 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
1c540 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f  e */.  nolockClo
1c550 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
1c560 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
1c570 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63  d */.  nolockLoc
1c580 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1c590 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
1c5a0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f   */.  nolockUnlo
1c5b0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1c5c0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
1c5d0 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65  d */.  nolockChe
1c5e0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
1c5f0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
1c600 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
1c610 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
1c620 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c  dotlockIoFinder,
1c630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
1c640 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
1c650 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  e */.  dotlockIo
1c660 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
1c670 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
1c680 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
1c690 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  me */.  dotlockC
1c6a0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
1c6b0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
1c6c0 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c  od */.  dotlockL
1c6d0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1c6e0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
1c6f0 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e  d */.  dotlockUn
1c700 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
1c710 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
1c720 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  od */.  dotlockC
1c730 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1c740 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
1c750 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
1c760 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.)..#if SQLITE_
1c770 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1c780 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
1c790 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  RKS.IOMETHODS(. 
1c7a0 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20   flockIoFinder, 
1c7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1c7c0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
1c7d0 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d  me */.  flockIoM
1c7e0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
1c7f0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
1c800 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
1c810 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c  ame */.  flockCl
1c820 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
1c830 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
1c840 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f  hod */.  flockLo
1c850 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1c860 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
1c870 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c  od */.  flockUnl
1c880 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1c890 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
1c8a0 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68  hod */.  flockCh
1c8b0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1c8c0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
1c8d0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
1c8e0 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
1c8f0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45   OS_VXWORKS.IOME
1c900 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69  THODS(.  semIoFi
1c910 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
1c920 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
1c930 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
1c940 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  semIoMethods,   
1c950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
1c960 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1c970 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
1c980 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20   semClose,      
1c990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
1c9a0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
1c9b0 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20   semLock,       
1c9c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1c9d0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
1c9e0 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  semUnlock,      
1c9f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
1ca00 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
1ca10 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65   semCheckReserve
1ca20 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43  dLock      /* xC
1ca30 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1ca40 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
1ca50 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
1ca60 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
1ca70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1ca80 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
1ca90 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e  HODS(.  afpIoFin
1caa0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
1cab0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
1cac0 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61  tion name */.  a
1cad0 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  fpIoMethods,    
1cae0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
1caf0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
1cb00 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
1cb10 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  afpClose,       
1cb20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
1cb30 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
1cb40 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  afpLock,        
1cb50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
1cb60 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  ck method */.  a
1cb70 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  fpUnlock,       
1cb80 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
1cb90 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
1cba0 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
1cbb0 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68  Lock      /* xCh
1cbc0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1cbd0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
1cbe0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72  if../*.** The pr
1cbf0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  oxy locking meth
1cc00 6f 64 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d  od is a "super-m
1cc10 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65  ethod" in the se
1cc20 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f  nse that it.** o
1cc30 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66  pens secondary f
1cc40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
1cc50 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e  for the conch an
1cc60 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64  d lock files and
1cc70 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78  .** it uses prox
1cc80 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50  y, dot-file, AFP
1cc90 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f  , and flock() lo
1cca0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e  cking methods on
1ccb0 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64   those.** second
1ccc0 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20  ary files.  For 
1ccd0 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65  this reason, the
1cce0 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69   division that i
1ccf0 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f  mplements.** pro
1cd00 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f  xy locking is lo
1cd10 63 61 74 65 64 20 6d 75 63 68 20 66 75 72 74 68  cated much furth
1cd20 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66  er down in the f
1cd30 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ile.  But we nee
1cd40 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64  d.** to go ahead
1cd50 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20   and define the 
1cd60 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1cd70 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75  ds and finder fu
1cd80 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72  nction.** for pr
1cd90 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65  oxy locking here
1cda0 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64  .  So we forward
1cdb0 20 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f   declare the I/O
1cdc0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66   methods..*/.#if
1cdd0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1cde0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
1cdf0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1ce00 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  LE.static int pr
1ce10 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  oxyClose(sqlite3
1ce20 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20  _file*);.static 
1ce30 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71  int proxyLock(sq
1ce40 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
1ce50 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
1ce60 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  oxyUnlock(sqlite
1ce70 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
1ce80 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
1ce90 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1cea0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
1ceb0 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53  int*);.IOMETHODS
1cec0 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65  (.  proxyIoFinde
1ced0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
1cee0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
1cef0 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79   name */.  proxy
1cf00 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
1cf10 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
1cf20 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
1cf30 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78  t name */.  prox
1cf40 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  yClose,         
1cf50 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
1cf60 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
1cf70 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  yLock,          
1cf80 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
1cf90 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
1cfa0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
1cfb0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
1cfc0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
1cfd0 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
1cfe0 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck    /* xCheckR
1cff0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
1d000 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
1d010 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20  /* nfs lockd on 
1d020 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27  OSX 10.3+ doesn'
1d030 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f  t clear write lo
1d040 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20  cks when a read 
1d050 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23  lock is set */.#
1d060 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
1d070 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
1d080 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d090 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
1d0a0 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20    nfsIoFinder,  
1d0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d0c0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
1d0d0 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d  name */.  nfsIoM
1d0e0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
1d0f0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
1d100 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
1d110 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 75 6e 69 78  t name */.  unix
1d120 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
1d130 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
1d140 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
1d150 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  xLock,          
1d160 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
1d170 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73   method */.  nfs
1d180 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
1d190 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
1d1a0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
1d1b0 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
1d1c0 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68  Lock      /* xCh
1d1d0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1d1e0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
1d1f0 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
1d200 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
1d210 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1d220 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
1d230 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
1d240 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
1d250 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1d260 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
1d270 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
1d280 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d290 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
1d2a0 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
1d2b0 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
1d2c0 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
1d2d0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
1d2e0 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
1d2f0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
1d300 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f   MacOSX only..*/
1d310 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
1d320 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1d330 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   *autolockIoFind
1d340 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
1d350 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
1d360 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
1d370 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1d380 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
1d390 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
1d3a0 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63   open file objec
1d3b0 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  t for the databa
1d3c0 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  se file */.){.  
1d3d0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
1d3e0 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20  uct Mapping {.  
1d3f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
1d400 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20  ilesystem;      
1d410 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73          /* Files
1d420 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20  ystem type name 
1d430 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  */.    const sql
1d440 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1d450 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20  *pMethods;   /* 
1d460 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  Appropriate lock
1d470 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ing method */.  
1d480 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20  } aMap[] = {.   
1d490 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f   { "hfs",    &po
1d4a0 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
1d4b0 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20      { "ufs",    
1d4c0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
1d4d0 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22  },.    { "afpfs"
1d4e0 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
1d4f0 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73   },.    { "smbfs
1d500 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64  ",  &afpIoMethod
1d510 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64  s },.    { "webd
1d520 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  av", &nolockIoMe
1d530 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30  thods },.    { 0
1d540 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74  , 0 }.  };.  int
1d550 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
1d560 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74  tfs fsInfo;.  st
1d570 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
1d580 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
1d590 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
1d5a0 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
1d5b0 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
1d5c0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
1d5d0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
1d5e0 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
1d5f0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
1d600 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
1d610 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
1d620 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20  oMethods;.  }.  
1d630 69 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50  if( statfs(fileP
1d640 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d  ath, &fsInfo) !=
1d650 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66   -1 ){.    if( f
1d660 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20  sInfo.f_flags & 
1d670 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20  MNT_RDONLY ){.  
1d680 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
1d690 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  ckIoMethods;.   
1d6a0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
1d6b0 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
1d6c0 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  tem; i++){.     
1d6d0 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e   if( strcmp(fsIn
1d6e0 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
1d6f0 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79   aMap[i].zFilesy
1d700 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  stem)==0 ){.    
1d710 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b      return aMap[
1d720 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20  i].pMethods;.   
1d730 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1d740 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73    /* Default cas
1d750 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e  e. Handles, amon
1d760 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73  gst others, "nfs
1d770 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74  "..  ** Test byt
1d780 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69  e-range lock usi
1d790 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74  ng fcntl(). If t
1d7a0 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73  he call succeeds
1d7b0 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  , .  ** assume t
1d7c0 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73  hat the file-sys
1d7d0 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53  tem supports POS
1d7e0 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20  IX style locks. 
1d7f0 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f  .  */.  lockInfo
1d800 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
1d810 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
1d820 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
1d830 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
1d840 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
1d850 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
1d860 0a 20 20 69 66 28 20 66 63 6e 74 6c 28 70 4e 65  .  if( fcntl(pNe
1d870 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
1d880 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
1d890 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
1d8a0 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
1d8b0 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20  name, "nfs")==0 
1d8c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d8d0 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  &nfsIoMethods;. 
1d8e0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
1d8f0 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
1d900 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
1d910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
1d920 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65  urn &dotlockIoMe
1d930 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
1d940 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
1d950 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
1d960 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
1d970 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
1d980 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
1d990 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
1d9a0 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
1d9b0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
1d9c0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
1d9d0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1d9e0 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f  _STYLE */..#if O
1d9f0 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c  S_VXWORKS && SQL
1da00 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1da10 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
1da20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
1da30 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
1da40 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
1da50 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
1da60 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
1da70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da80 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
1da90 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
1daa0 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
1dab0 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
1dac0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
1dad0 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
1dae0 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
1daf0 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f  VXWorks only..*/
1db00 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
1db10 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1db20 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   *autolockIoFind
1db30 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
1db40 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
1db50 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
1db60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1db70 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
1db80 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
1db90 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f   the open file o
1dba0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  bject */.){.  st
1dbb0 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
1dbc0 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
1dbd0 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
1dbe0 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
1dbf0 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
1dc00 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
1dc10 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
1dc20 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
1dc30 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
1dc40 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
1dc50 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
1dc60 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20  oMethods;.  }.. 
1dc70 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74   /* Test if fcnt
1dc80 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64  l() is supported
1dc90 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73   and use POSIX s
1dca0 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a  tyle locks..  **
1dcb0 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
1dcc0 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65  back to the name
1dcd0 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68  d semaphore meth
1dce0 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  od..  */.  lockI
1dcf0 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
1dd00 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
1dd10 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
1dd20 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
1dd30 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
1dd40 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
1dd50 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e 74 6c 28  CK;.  if( fcntl(
1dd60 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
1dd70 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
1dd80 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
1dd90 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
1dda0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1ddb0 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f  turn &semIoMetho
1ddc0 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
1ddd0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
1dde0 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
1ddf0 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f  const autolockIo
1de00 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68  Finder)(const ch
1de10 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d  ar*,unixFile*) =
1de20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
1de30 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
1de40 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  * OS_VXWORKS && 
1de50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1de60 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
1de70 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63  /*.** An abstrac
1de80 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69  t type for a poi
1de90 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65 74  nter to a IO met
1dea0 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
1deb0 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion:.*/.typedef 
1dec0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
1ded0 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64  _methods *(*find
1dee0 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63  er_type)(const c
1def0 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b  har*,unixFile*);
1df00 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
1df10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1df20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1df30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1df40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1df50 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1df60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
1df70 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
1df80 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
1df90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
1dfa0 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
1dfb0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
1dfc0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1dfd0 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
1dfe0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
1dff0 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  object..*/../*.*
1e000 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1e010 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1e020 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
1e030 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ure pointed to b
1e040 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  y pId..*/.static
1e050 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46   int fillInUnixF
1e060 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ile(.  sqlite3_v
1e070 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
1e080 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
1e090 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
1e0a0 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
1e0b0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
1e0c0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20  e descriptor of 
1e0d0 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
1e0e0 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64  d */.  int dirfd
1e0f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1e100 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65  * Directory file
1e110 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
1e120 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
1e130 49 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74  Id,      /* Writ
1e140 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c  e to the unixFil
1e150 65 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  e structure here
1e160 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1e170 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
1e180 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
1e190 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
1e1a0 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20  /.  int noLock, 
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1e1c0 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74  mit locking if t
1e1d0 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  rue */.  int isD
1e1e0 65 6c 65 74 65 20 20 20 20 20 20 20 20 20 20 20  elete           
1e1f0 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1e200 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ose if true */.)
1e210 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
1e220 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c  3_io_methods *pL
1e230 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75  ockingStyle;.  u
1e240 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20  nixFile *pNew = 
1e250 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b  (unixFile *)pId;
1e260 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e270 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
1e280 28 20 70 4e 65 77 2d 3e 70 4c 6f 63 6b 3d 3d 4e  ( pNew->pLock==N
1e290 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ULL );.  assert(
1e2a0 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 3d 3d 4e 55   pNew->pOpen==NU
1e2b0 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 61  LL );..  /* Para
1e2c0 6d 65 74 65 72 20 69 73 44 65 6c 65 74 65 20 69  meter isDelete i
1e2d0 73 20 6f 6e 6c 79 20 75 73 65 64 20 6f 6e 20 76  s only used on v
1e2e0 78 77 6f 72 6b 73 2e 20 45 78 70 72 65 73 73 20  xworks. Express 
1e2f0 74 68 69 73 20 65 78 70 6c 69 63 69 74 6c 79 20  this explicitly 
1e300 0a 20 20 2a 2a 20 68 65 72 65 20 74 6f 20 70 72  .  ** here to pr
1e310 65 76 65 6e 74 20 63 6f 6d 70 69 6c 65 72 20 77  event compiler w
1e320 61 72 6e 69 6e 67 73 20 61 62 6f 75 74 20 75 6e  arnings about un
1e330 75 73 65 64 20 70 61 72 61 6d 65 74 65 72 73 2e  used parameters.
1e340 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  .  */.  UNUSED_P
1e350 41 52 41 4d 45 54 45 52 28 69 73 44 65 6c 65 74  ARAMETER(isDelet
1e360 65 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 33 28  e);..  OSTRACE3(
1e370 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73  "OPEN    %-3d %s
1e380 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d  \n", h, zFilenam
1e390 65 29 3b 20 20 20 20 0a 20 20 70 4e 65 77 2d 3e  e);    .  pNew->
1e3a0 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 64  h = h;.  pNew->d
1e3b0 69 72 66 64 20 3d 20 64 69 72 66 64 3b 0a 20 20  irfd = dirfd;.  
1e3c0 53 45 54 5f 54 48 52 45 41 44 49 44 28 70 4e 65  SET_THREADID(pNe
1e3d0 77 29 3b 0a 20 20 70 4e 65 77 2d 3e 66 69 6c 65  w);.  pNew->file
1e3e0 46 6c 61 67 73 20 3d 20 30 3b 0a 0a 23 69 66 20  Flags = 0;..#if 
1e3f0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65  OS_VXWORKS.  pNe
1e400 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73  w->pId = vxworks
1e410 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65  FindFileId(zFile
1e420 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65  name);.  if( pNe
1e430 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20  w->pId==0 ){.   
1e440 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20   noLock = 1;.   
1e450 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1e460 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  EM;.  }.#endif..
1e470 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a    if( noLock ){.
1e480 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c      pLockingStyl
1e490 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  e = &nolockIoMet
1e4a0 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
1e4b0 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
1e4c0 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79   = (**(finder_ty
1e4d0 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61  pe*)pVfs->pAppDa
1e4e0 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ta)(zFilename, p
1e4f0 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  New);.#if SQLITE
1e500 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1e510 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63  STYLE.    /* Cac
1e520 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20  he zFilename in 
1e530 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
1e540 65 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74  ext (AFP and dot
1e550 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66  lock override) f
1e560 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c  or.    ** proxyL
1e570 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69  ock activation i
1e580 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f  s possible (remo
1e590 74 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65  te proxy is base
1e5a0 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20  d on db name).  
1e5b0 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72    ** zFilename r
1e5c0 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
1e5d0 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  il file is close
1e5e0 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f  d, to support */
1e5f0 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
1e600 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69  ngContext = (voi
1e610 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65  d*)zFilename;.#e
1e620 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
1e630 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
1e640 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
1e650 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
1e660 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
1e670 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1e680 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c  _STYLE.    || pL
1e690 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
1e6a0 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e  nfsIoMethods.#en
1e6b0 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69  dif.  ){.    uni
1e6c0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
1e6d0 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b     rc = findLock
1e6e0 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
1e6f0 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e  ->pLock, &pNew->
1e700 70 4f 70 65 6e 29 3b 0a 20 20 20 20 69 66 28 20  pOpen);.    if( 
1e710 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e720 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20  .      /* If an 
1e730 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e  error occured in
1e740 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2c   findLockInfo(),
1e750 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
1e760 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20  descriptor.     
1e770 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c   ** immediately,
1e780 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e   before releasin
1e790 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e  g the mutex. fin
1e7a0 64 4c 6f 63 6b 49 6e 66 6f 28 29 20 6d 61 79 20  dLockInfo() may 
1e7b0 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e  fail.      ** in
1e7c0 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
1e7d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1e7e0 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74  *   (a) A call t
1e7f0 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64  o fstat() failed
1e800 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29  ..      **   (b)
1e810 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64   A malloc failed
1e820 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1e830 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29   ** Scenario (b)
1e840 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20   may only occur 
1e850 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  if the process i
1e860 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68  s holding no oth
1e870 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  er.      ** file
1e880 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
1e890 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
1e8a0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72  le. If there wer
1e8b0 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20  e other file.   
1e8c0 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
1e8d0 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  s on this file, 
1e8e0 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77  then no malloc w
1e8f0 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64  ould be required
1e900 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e   by.      ** fin
1e910 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 20 49 66 20  dLockInfo(). If 
1e920 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
1e930 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73 61  , it is quite sa
1e940 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20  fe to close.    
1e950 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20    ** handle h - 
1e960 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  as it is guarant
1e970 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69  eed that no posi
1e980 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20  x locks will be 
1e990 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a  released.      *
1e9a0 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20  * by doing so.. 
1e9b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1e9c0 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29   If scenario (a)
1e9d0 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72 6f   caused the erro
1e9e0 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72  r then things ar
1e9f0 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54  e not so safe. T
1ea00 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  he.      ** impl
1ea10 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20  icit assumption 
1ea20 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66 20  here is that if 
1ea30 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74  fstat() fails, t
1ea40 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20  hings are in.   
1ea50 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73     ** such bad s
1ea60 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70 69  hape that droppi
1ea70 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f  ng a lock or two
1ea80 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
1ea90 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  much..      */. 
1eaa0 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20       close(h);. 
1eab0 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20       h = -1;.   
1eac0 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
1ead0 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69  Mutex();.  }..#i
1eae0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1eaf0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1eb00 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1eb10 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70  __).  else if( p
1eb20 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
1eb30 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
1eb40 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b  .    /* AFP lock
1eb50 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
1eb60 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
1eb70 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
1eb80 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
1eb90 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
1eba0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66  t..    */.    af
1ebb0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
1ebc0 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d  *pCtx;.    pNew-
1ebd0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
1ebe0 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33  = pCtx = sqlite3
1ebf0 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
1ec00 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66  *pCtx) );.    if
1ec10 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pCtx==0 ){.   
1ec20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1ec30 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
1ec40 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46  .      /* NB: zF
1ec50 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61  ilename exists a
1ec60 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  nd remains valid
1ec70 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20   until the file 
1ec80 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20  is closed.      
1ec90 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ** according to 
1eca0 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31  requirement F111
1ecb0 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f  41.  So we do no
1ecc0 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61  t need to make a
1ecd0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
1ece0 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20  f the filename. 
1ecf0 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64  */.      pCtx->d
1ed00 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d  bPath = zFilenam
1ed10 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72  e;.      pCtx->r
1ed20 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20  eserved = 0;.   
1ed30 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b     srandomdev();
1ed40 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72  .      unixEnter
1ed50 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72  Mutex();.      r
1ed60 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f  c = findLockInfo
1ed70 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 4c  (pNew, &pNew->pL
1ed80 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65  ock, &pNew->pOpe
1ed90 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
1eda0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1edb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
1edc0 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e  ree(pNew->lockin
1edd0 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  gContext);.     
1ede0 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20     close(h);.   
1edf0 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20       h = -1;.   
1ee00 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c     }.      unixL
1ee10 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20  eaveMutex();    
1ee20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23      .    }.  }.#
1ee30 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66  endif..  else if
1ee40 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
1ee50 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  == &dotlockIoMet
1ee60 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44  hods ){.    /* D
1ee70 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75  otfile locking u
1ee80 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
1ee90 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
1eea0 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
1eeb0 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f      ** the dotlo
1eec0 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
1eed0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61   .    */.    cha
1eee0 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20  r *zLockFile;.  
1eef0 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b    int nFilename;
1ef00 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d  .    nFilename =
1ef10 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69   (int)strlen(zFi
1ef20 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20  lename) + 6;.   
1ef30 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68   zLockFile = (ch
1ef40 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
1ef50 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a  loc(nFilename);.
1ef60 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c      if( zLockFil
1ef70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
1ef80 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1ef90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1efa0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1efb0 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c  tf(nFilename, zL
1efc0 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f  ockFile, "%s" DO
1efd0 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46  TLOCK_SUFFIX, zF
1efe0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ilename);.    }.
1eff0 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
1f000 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b  gContext = zLock
1f010 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f  File;.  }..#if O
1f020 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65  S_VXWORKS.  else
1f030 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
1f040 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68  le == &semIoMeth
1f050 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61  ods ){.    /* Na
1f060 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
1f070 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
1f080 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
1f090 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
1f0a0 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  * included in th
1f0b0 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e semLockingCont
1f0c0 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ext.    */.    u
1f0d0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
1f0e0 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f  .    rc = findLo
1f0f0 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  ckInfo(pNew, &pN
1f100 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77  ew->pLock, &pNew
1f110 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 69 66  ->pOpen);.    if
1f120 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
1f130 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 4f 70 65  ) && (pNew->pOpe
1f140 6e 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29  n->pSem==NULL) )
1f150 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  {.      char *zS
1f160 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70  emName = pNew->p
1f170 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a  Open->aSemName;.
1f180 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
1f190 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1f1a0 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ntf(MAX_PATHNAME
1f1b0 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73  , zSemName, "/%s
1f1c0 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20  .sem",.         
1f1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
1f1e0 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69  ew->pId->zCanoni
1f1f0 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  calName);.      
1f200 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61  for( n=1; zSemNa
1f210 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20  me[n]; n++ ).   
1f220 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d       if( zSemNam
1f230 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d  e[n]=='/' ) zSem
1f240 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20  Name[n] = '_';. 
1f250 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e       pNew->pOpen
1f260 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65  ->pSem = sem_ope
1f270 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52  n(zSemName, O_CR
1f280 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20  EAT, 0666, 1);. 
1f290 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70       if( pNew->p
1f2a0 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d 3d 20 53 45  Open->pSem == SE
1f2b0 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  M_FAILED ){.    
1f2c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1f2d0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70  NOMEM;.        p
1f2e0 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d  New->pOpen->aSem
1f2f0 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  Name[0] = '\0';.
1f300 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f310 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1f320 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ();.  }.#endif. 
1f330 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72   .  pNew->lastEr
1f340 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f  rno = 0;.#if OS_
1f350 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63  VXWORKS.  if( rc
1f360 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f370 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e     unlink(zFilen
1f380 61 6d 65 29 3b 0a 20 20 20 20 69 73 44 65 6c 65  ame);.    isDele
1f390 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  te = 0;.  }.  pN
1f3a0 65 77 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20 69  ew->isDelete = i
1f3b0 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64 69 66 0a  sDelete;.#endif.
1f3c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f3d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 64  _OK ){.    if( d
1f3e0 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28  irfd>=0 ) close(
1f3f0 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e  dirfd); /* silen
1f400 74 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20  t leak if fail, 
1f410 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72  already in error
1f420 20 2a 2f 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   */.    if( h>=0
1f430 20 29 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 7d   ) close(h);.  }
1f440 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
1f450 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69  pMethod = pLocki
1f460 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65  ngStyle;.    Ope
1f470 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
1f480 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1f490 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66  ../*.** Open a f
1f4a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
1f4b0 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  o the directory 
1f4c0 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20  containing file 
1f4d0 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66  zFilename..** If
1f4e0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46   successful, *pF
1f4f0 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  d is set to the 
1f500 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63  opened file desc
1f510 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51  riptor and.** SQ
1f520 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1f530 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
1f540 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72 20   occurs, either 
1f550 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
1f560 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or SQLITE_CANTOP
1f570 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EN is returned a
1f580 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74 20 74  nd *pFd is set t
1f590 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a  o an undefined.*
1f5a0 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  * value..**.** I
1f5b0 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
1f5c0 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c  eturned, the cal
1f5d0 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
1f5e0 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a  le for closing.*
1f5f0 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  * the file descr
1f600 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67  iptor *pFd using
1f610 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61   close()..*/.sta
1f620 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65  tic int openDire
1f630 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72  ctory(const char
1f640 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74   *zFilename, int
1f650 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69   *pFd){.  int ii
1f660 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  ;.  int fd = -1;
1f670 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65  .  char zDirname
1f680 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
1f690 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
1f6a0 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41  rintf(MAX_PATHNA
1f6b0 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25  ME, zDirname, "%
1f6c0 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  s", zFilename);.
1f6d0 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74    for(ii=(int)st
1f6e0 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20  rlen(zDirname); 
1f6f0 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65  ii>1 && zDirname
1f700 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29  [ii]!='/'; ii--)
1f710 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a  ;.  if( ii>0 ){.
1f720 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d      zDirname[ii]
1f730 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20   = '\0';.    fd 
1f740 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c  = open(zDirname,
1f750 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41   O_RDONLY|O_BINA
1f760 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  RY, 0);.    if( 
1f770 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  fd>=0 ){.#ifdef 
1f780 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20 20  FD_CLOEXEC.     
1f790 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54   fcntl(fd, F_SET
1f7a0 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f  FD, fcntl(fd, F_
1f7b0 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43  GETFD, 0) | FD_C
1f7c0 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a  LOEXEC);.#endif.
1f7d0 20 20 20 20 20 20 4f 53 54 52 41 43 45 33 28 22        OSTRACE3("
1f7e0 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c  OPENDIR %-3d %s\
1f7f0 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65  n", fd, zDirname
1f800 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
1f810 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75  pFd = fd;.  retu
1f820 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45  rn (fd>=0?SQLITE
1f830 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43 41 4e 54 4f  _OK:SQLITE_CANTO
1f840 50 45 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  PEN);.}../*.** C
1f850 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
1f860 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a  y file name in z
1f870 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20  Buf.  zBuf must 
1f880 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  be allocated.** 
1f890 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  by the calling p
1f8a0 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20  rocess and must 
1f8b0 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  be big enough to
1f8c0 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a   hold at least.*
1f8d0 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  * pVfs->mxPathna
1f8e0 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  me bytes..*/.sta
1f8f0 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d 70 6e  tic int getTempn
1f900 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  ame(int nBuf, ch
1f910 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61  ar *zBuf){.  sta
1f920 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
1f930 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  azDirs[] = {.   
1f940 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20    0,.     0,.   
1f950 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20    "/var/tmp",.  
1f960 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20     "/usr/tmp",. 
1f970 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20      "/tmp",.    
1f980 20 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61   ".",.  };.  sta
1f990 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
1f9a0 65 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d  ed char zChars[]
1f9b0 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68   =.    "abcdefgh
1f9c0 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
1f9d0 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47  yz".    "ABCDEFG
1f9e0 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
1f9f0 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35  XYZ".    "012345
1fa00 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65  6789";.  unsigne
1fa10 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74  d int i, j;.  st
1fa20 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
1fa30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
1fa40 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 49  r = ".";..  /* I
1fa50 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
1fa60 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
1fa70 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
1fa80 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
1fa90 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
1faa0 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
1fab0 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
1fac0 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
1fad0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
1fae0 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
1faf0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
1fb00 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1fb10 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
1fb20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69  azDirs[0] = sqli
1fb30 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
1fb40 72 79 3b 0a 20 20 69 66 20 28 4e 55 4c 4c 20 3d  ry;.  if (NULL =
1fb50 3d 20 61 7a 44 69 72 73 5b 31 5d 29 20 7b 0a 20  = azDirs[1]) {. 
1fb60 20 20 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67     azDirs[1] = g
1fb70 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b  etenv("TMPDIR");
1fb80 0a 20 20 7d 0a 20 20 0a 20 20 66 6f 72 28 69 3d  .  }.  .  for(i=
1fb90 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69  0; i<sizeof(azDi
1fba0 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72  rs)/sizeof(azDir
1fbb0 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  s[0]); i++){.   
1fbc0 20 69 66 28 20 61 7a 44 69 72 73 5b 69 5d 3d 3d   if( azDirs[i]==
1fbd0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1fbe0 20 20 69 66 28 20 73 74 61 74 28 61 7a 44 69 72    if( stat(azDir
1fbf0 73 5b 69 5d 2c 20 26 62 75 66 29 20 29 20 63 6f  s[i], &buf) ) co
1fc00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
1fc10 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f  !S_ISDIR(buf.st_
1fc20 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  mode) ) continue
1fc30 3b 0a 20 20 20 20 69 66 28 20 61 63 63 65 73 73  ;.    if( access
1fc40 28 61 7a 44 69 72 73 5b 69 5d 2c 20 30 37 29 20  (azDirs[i], 07) 
1fc50 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1fc60 7a 44 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d  zDir = azDirs[i]
1fc70 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
1fc80 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
1fc90 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  t the output buf
1fca0 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  fer is large eno
1fcb0 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70  ugh for the temp
1fcc0 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a  orary file .  **
1fcd0 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20   name. If it is 
1fce0 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  not, return SQLI
1fcf0 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20  TE_ERROR..  */. 
1fd00 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69   if( (strlen(zDi
1fd10 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49  r) + strlen(SQLI
1fd20 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
1fd30 46 49 58 29 20 2b 20 31 37 29 20 3e 3d 20 28 73  FIX) + 17) >= (s
1fd40 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20  ize_t)nBuf ){.  
1fd50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fd60 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f  ERROR;.  }..  do
1fd70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
1fd80 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20  printf(nBuf-17, 
1fd90 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54  zBuf, "%s/"SQLIT
1fda0 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
1fdb0 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a  IX, zDir);.    j
1fdc0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
1fdd0 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Buf);.    sqlite
1fde0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c  3_randomness(15,
1fdf0 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20   &zBuf[j]);.    
1fe00 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69  for(i=0; i<15; i
1fe10 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, j++){.      
1fe20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29  zBuf[j] = (char)
1fe30 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e  zChars[ ((unsign
1fe40 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29  ed char)zBuf[j])
1fe50 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29  %(sizeof(zChars)
1fe60 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  -1) ];.    }.   
1fe70 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zBuf[j] = 0;.  
1fe80 7d 77 68 69 6c 65 28 20 61 63 63 65 73 73 28 7a  }while( access(z
1fe90 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72  Buf,0)==0 );.  r
1fea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1feb0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
1fec0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1fed0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
1fee0 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
1fef0 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73  Routine to trans
1ff00 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20  form a unixFile 
1ff10 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63  into a proxy-loc
1ff20 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a  king unixFile..*
1ff30 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1ff40 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f   in the proxy-lo
1ff50 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74  ck division, but
1ff60 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65   used by unixOpe
1ff70 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45  n().** if SQLITE
1ff80 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
1ff90 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64  CKING is defined
1ffa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ffb0 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
1ffc0 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a  ixFile(unixFile*
1ffd0 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
1ffe0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
1fff0 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73  arch for an unus
20000 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
20010 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  or that was open
20020 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
20030 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74  se .** file (not
20040 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61   a journal or ma
20050 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
20060 65 29 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  e) identified by
20070 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61   pathname.** zPa
20080 74 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  th with SQLITE_O
20090 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61  PEN_XXX flags ma
200a0 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73  tching those pas
200b0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
200c0 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f  d.** argument to
200d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
200e0 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c  **.** Such a fil
200f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79  e descriptor may
20100 20 65 78 69 73 74 20 69 66 20 61 20 64 61 74 61   exist if a data
20110 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
20120 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75  was closed.** bu
20130 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
20140 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
20150 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c   could not be cl
20160 6f 73 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d  osed because som
20170 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20  e.** other file 
20180 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20  descriptor open 
20190 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  on the same file
201a0 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69   is holding a fi
201b0 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65  le-lock..** Refe
201c0 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  r to comments in
201d0 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29   the unixClose()
201e0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68   function and th
201f0 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e  e lengthy commen
20200 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20  t.** describing 
20210 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20  "Posix Advisory 
20220 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20  Locking" at the 
20230 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 66 69  start of this fi
20240 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68  le for .** furth
20250 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f  er details. Also
20260 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a  , ticket #4018..
20270 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61  **.** If a suita
20280 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ble file descrip
20290 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  tor is found, th
202a0 65 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  en it is returne
202b0 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68  d. If no.** such
202c0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
202d0 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20   is located, -1 
202e0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
202f0 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65  static UnixUnuse
20300 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c  dFd *findReusabl
20310 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  eFd(const char *
20320 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73  zPath, int flags
20330 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  ){.  UnixUnusedF
20340 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  d *pUnused = 0;.
20350 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61  .  /* Do not sea
20360 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65  rch for an unuse
20370 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
20380 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f  r on vxworks. No
20390 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76  t because.  ** v
203a0 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74  xworks would not
203b0 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68   benefit from th
203c0 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67  e change (it mig
203d0 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75  ht, we're not su
203e0 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65  re),.  ** but be
203f0 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20  cause no way to 
20400 74 65 73 74 20 69 74 20 69 73 20 63 75 72 72 65  test it is curre
20410 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20  ntly available. 
20420 49 74 20 69 73 20 62 65 74 74 65 72 20 0a 20 20  It is better .  
20430 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62  ** not to risk b
20440 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20  reaking vxworks 
20450 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20  support for the 
20460 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20  sake of such an 
20470 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65  obscure .  ** fe
20480 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21  ature.  */.#if !
20490 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
204a0 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
204b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204c0 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20    /* Results of 
204d0 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a  stat() call */..
204e0 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61    /* A stat() ca
204f0 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20  ll may fail for 
20500 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e  various reasons.
20510 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
20520 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d  , it is.  ** alm
20530 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68 61 74  ost certain that
20540 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20   an open() call 
20550 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68  on the same path
20560 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e   will also fail.
20570 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72  .  ** For this r
20580 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72  eason, if an err
20590 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
205a0 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72   stat() call her
205b0 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67  e, it is.  ** ig
205c0 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20  nored and -1 is 
205d0 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61  returned. The ca
205e0 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f  ller will try to
205f0 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65   open a new file
20600 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  .  ** descriptor
20610 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74   on the same pat
20620 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74  h, fail, and ret
20630 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  urn an error to 
20640 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a  SQLite..  **.  *
20650 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75 62 73  * Even if a subs
20660 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61  equent open() ca
20670 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c  ll does succeed,
20680 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65   the consequence
20690 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65  s of.  ** not se
206a0 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65  arching for a re
206b0 73 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73  susable file des
206c0 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20  criptor are not 
206d0 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  dire.  */.  if( 
206e0 30 3d 3d 73 74 61 74 28 7a 50 61 74 68 2c 20 26  0==stat(zPath, &
206f0 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 73 74  sStat) ){.    st
20700 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74  ruct unixOpenCnt
20710 20 2a 70 4f 3b 0a 20 20 20 20 73 74 72 75 63 74   *pO;.    struct
20720 20 75 6e 69 78 46 69 6c 65 49 64 20 69 64 3b 0a   unixFileId id;.
20730 20 20 20 20 69 64 2e 64 65 76 20 3d 20 73 53 74      id.dev = sSt
20740 61 74 2e 73 74 5f 64 65 76 3b 0a 20 20 20 20 69  at.st_dev;.    i
20750 64 2e 69 6e 6f 20 3d 20 73 53 74 61 74 2e 73 74  d.ino = sStat.st
20760 5f 69 6e 6f 3b 0a 0a 20 20 20 20 75 6e 69 78 45  _ino;..    unixE
20770 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
20780 20 66 6f 72 28 70 4f 3d 6f 70 65 6e 4c 69 73 74   for(pO=openList
20790 3b 20 70 4f 20 26 26 20 6d 65 6d 63 6d 70 28 26  ; pO && memcmp(&
207a0 69 64 2c 20 26 70 4f 2d 3e 66 69 6c 65 49 64 2c  id, &pO->fileId,
207b0 20 73 69 7a 65 6f 66 28 69 64 29 29 3b 20 70 4f   sizeof(id)); pO
207c0 3d 70 4f 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20  =pO->pNext);.   
207d0 20 69 66 28 20 70 4f 20 29 7b 0a 20 20 20 20 20   if( pO ){.     
207e0 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a   UnixUnusedFd **
207f0 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70  pp;.      for(pp
20800 3d 26 70 4f 2d 3e 70 55 6e 75 73 65 64 3b 20 2a  =&pO->pUnused; *
20810 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61  pp && (*pp)->fla
20820 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28  gs!=flags; pp=&(
20830 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a  (*pp)->pNext));.
20840 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
20850 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *pp;.      if( p
20860 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
20870 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d    *pp = pUnused-
20880 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
20890 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
208a0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
208b0 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20  #endif    /* if 
208c0 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20  !OS_VXWORKS */. 
208d0 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b   return pUnused;
208e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
208f0 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a  he file zPath..*
20900 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79  * .** Previously
20910 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20  , the SQLite OS 
20920 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65 65  layer used three
20930 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c   functions in pl
20940 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f  ace of this.** o
20950 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71  ne:.**.**     sq
20960 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
20970 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73  rite();.**     s
20980 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
20990 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73  Only();.**     s
209a0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
209b0 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54  usive();.**.** T
209c0 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65  hese calls corre
209d0 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c  spond to the fol
209e0 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
209f0 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  ons of flags:.**
20a00 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74  .**     ReadWrit
20a10 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44  e() ->     (READ
20a20 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a  WRITE | CREATE).
20a30 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28  **     ReadOnly(
20a40 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f  )  ->     (READO
20a50 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65  NLY) .**     Ope
20a60 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20  nExclusive() -> 
20a70 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
20a80 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29  ATE | EXCLUSIVE)
20a90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f  .**.** The old O
20aa0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61  penExclusive() a
20ab0 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61  ccepted a boolea
20ac0 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65  n argument - "de
20ad0 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72  lFlag". If.** tr
20ae0 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73  ue, the file was
20af0 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62   configured to b
20b00 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
20b10 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
20b20 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  .** file handle 
20b30 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65  closed. To achie
20b40 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66 65  ve the same effe
20b50 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65  ct using this ne
20b60 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c  w .** interface,
20b70 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f   add the DELETEO
20b80 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74  NCLOSE flag to t
20b90 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 61  hose specified a
20ba0 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65  bove for .** Ope
20bb0 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f  nExclusive()..*/
20bc0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
20bd0 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
20be0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
20bf0 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
20c00 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69  for which this i
20c10 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68  s the xOpen meth
20c20 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
20c30 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
20c40 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65       /* Pathname
20c50 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f   of file to be o
20c60 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  pened */.  sqlit
20c70 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
20c80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
20c90 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
20ca0 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a  o be filled in *
20cb0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cd0 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20   /* Input flags 
20ce0 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f  to control the o
20cf0 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  pening */.  int 
20d00 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20  *pOutFlags      
20d10 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
20d20 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  ut flags returne
20d30 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65  d to SQLite core
20d40 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
20d50 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65  e *p = (unixFile
20d60 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20   *)pFile;.  int 
20d70 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  fd = -1;        
20d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
20d90 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72 65  le descriptor re
20da0 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29  turned by open()
20db0 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 20   */.  int dirfd 
20dc0 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
20dd0 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
20de0 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
20df0 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46  r */.  int openF
20e00 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
20e10 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
20e20 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29  o pass to open()
20e30 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
20e40 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
20e50 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
20e60 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
20e70 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20    int noLock;   
20e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e90 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
20ea0 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
20eb0 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ves */.  int rc 
20ec0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
20ed0 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
20ee0 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
20ef0 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c  */..  int isExcl
20f00 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20  usive  = (flags 
20f10 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  & SQLITE_OPEN_EX
20f20 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20  CLUSIVE);.  int 
20f30 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28  isDelete     = (
20f40 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
20f50 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
20f60 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61  E);.  int isCrea
20f70 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
20f80 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  & SQLITE_OPEN_CR
20f90 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52  EATE);.  int isR
20fa0 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61  eadonly   = (fla
20fb0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
20fc0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _READONLY);.  in
20fd0 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
20fe0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
20ff0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
21000 3b 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72  ;.  int isAutoPr
21010 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20  oxy  = (flags & 
21020 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
21030 50 52 4f 58 59 29 3b 0a 20 20 0a 20 20 2f 2a 20  PROXY);.  .  /* 
21040 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61  If creating a ma
21050 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c  ster or main-fil
21060 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20  e journal, this 
21070 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70  function will op
21080 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64  en.  ** a file-d
21090 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65  escriptor on the
210a0 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20   directory too. 
210b0 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75  The first time u
210c0 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69  nixSync().  ** i
210d0 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72  s called the dir
210e0 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
210f0 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66  riptor will be f
21100 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f  sync()ed and clo
21110 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e  se()d..  */.  in
21120 74 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  t isOpenDirector
21130 79 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26  y = (isCreate &&
21140 20 0a 20 20 20 20 20 20 28 65 54 79 70 65 3d 3d   .      (eType==
21150 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
21160 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54  ER_JOURNAL || eT
21170 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
21180 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20  _MAIN_JOURNAL). 
21190 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67   );..  /* If arg
211a0 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61  ument zPath is a
211b0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74   NULL pointer, t
211c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
211d0 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e  required to open
211e0 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  .  ** a temporar
211f0 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73  y file. Use this
21200 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65   buffer to store
21210 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69   the file name i
21220 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a  n..  */.  char z
21230 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  Tmpname[MAX_PATH
21240 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74  NAME+1];.  const
21250 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a   char *zName = z
21260 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  Path;..  /* Chec
21270 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  k the following 
21280 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
21290 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rue: .  **.  ** 
212a0 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e    (a) Exactly on
212b0 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49  e of the READWRI
212c0 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20  TE and READONLY 
212d0 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65  flags must be se
212e0 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28  t, and .  **   (
212f0 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20  b) if CREATE is 
21300 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52  set, then READWR
21310 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ITE must also be
21320 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20   set, and.  **  
21330 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56   (c) if EXCLUSIV
21340 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
21350 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
21360 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28  be set..  **   (
21370 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c  d) if DELETEONCL
21380 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  OSE is set, then
21390 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
213a0 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  o be set..  */. 
213b0 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f   assert((isReado
213c0 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  nly==0 || isRead
213d0 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73  Write==0) && (is
213e0 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52  ReadWrite || isR
213f0 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73  eadonly));.  ass
21400 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20  ert(isCreate==0 
21410 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b  || isReadWrite);
21420 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c  .  assert(isExcl
21430 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72  usive==0 || isCr
21440 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  eate);.  assert(
21450 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69  isDelete==0 || i
21460 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20  sCreate);..  /* 
21470 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69  The main DB, mai
21480 6e 20 6a 6f 75 72 6e 61 6c 2c 20 61 6e 64 20 6d  n journal, and m
21490 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
214a0 65 20 6e 65 76 65 72 20 61 75 74 6f 6d 61 74 69  e never automati
214b0 63 61 6c 6c 79 0a 20 20 2a 2a 20 64 65 6c 65 74  cally.  ** delet
214c0 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
214d0 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
214e0 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
214f0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
21500 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
21510 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
21520 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
21530 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
21540 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
21550 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
21560 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
21570 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
21580 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
21590 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
215a0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
215b0 4e 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  NAL );..  /* Ass
215c0 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70  ert that the upp
215d0 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74  er layer has set
215e0 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c   one of the "fil
215f0 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a  e-type" flags. *
21600 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
21610 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
21620 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65  AIN_DB      || e
21630 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
21640 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20  N_TEMP_DB .     
21650 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
21660 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
21670 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
21680 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
21690 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
216a0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
216b0 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
216c0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
216d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
216e0 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
216f0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
21700 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
21710 44 42 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65  DB.  );..  memse
21720 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  t(p, 0, sizeof(u
21730 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66  nixFile));..  if
21740 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
21750 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a  OPEN_MAIN_DB ){.
21760 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64      UnixUnusedFd
21770 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70   *pUnused;.    p
21780 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75  Unused = findReu
21790 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66  sableFd(zName, f
217a0 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lags);.    if( p
217b0 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
217c0 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64  fd = pUnused->fd
217d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
217e0 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c     pUnused = sql
217f0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
21800 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20  of(*pUnused));. 
21810 20 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65       if( !pUnuse
21820 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
21830 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
21840 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21850 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d      p->pUnused =
21860 20 70 55 6e 75 73 65 64 3b 0a 20 20 7d 65 6c 73   pUnused;.  }els
21870 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a  e if( !zName ){.
21880 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
21890 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70  is NULL, the upp
218a0 65 72 20 6c 61 79 65 72 20 69 73 20 72 65 71 75  er layer is requ
218b0 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69  esting a temp fi
218c0 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
218d0 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 69  t(isDelete && !i
218e0 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 29 3b  sOpenDirectory);
218f0 0a 20 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d  .    rc = getTem
21900 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41  pname(MAX_PATHNA
21910 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b  ME+1, zTmpname);
21920 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
21930 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21940 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
21950 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d  .    zName = zTm
21960 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pname;.  }..  /*
21970 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76   Determine the v
21980 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67  alue of the flag
21990 73 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73  s parameter pass
219a0 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63  ed to POSIX func
219b0 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29  tion.  ** open()
219c0 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62 65 20  . These must be 
219d0 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20  calculated even 
219e0 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74  if open() is not
219f0 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a   called, as.  **
21a00 20 74 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f   they may be sto
21a10 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
21a20 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61  he file handle a
21a30 6e 64 20 75 73 65 64 20 62 79 20 74 68 65 20 0a  nd used by the .
21a40 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65    ** 'conch file
21a50 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69  ' locking functi
21a60 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a  ons later on.  *
21a70 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  /.  if( isReadon
21a80 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20  ly )  openFlags 
21a90 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69  |= O_RDONLY;.  i
21aa0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
21ab0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
21ac0 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72  RDWR;.  if( isCr
21ad0 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c  eate )    openFl
21ae0 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a  ags |= O_CREAT;.
21af0 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76    if( isExclusiv
21b00 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  e ) openFlags |=
21b10 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c   (O_EXCL|O_NOFOL
21b20 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67  LOW);.  openFlag
21b30 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c  s |= (O_LARGEFIL
21b40 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20  E|O_BINARY);..  
21b50 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
21b60 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 20  mode_t openMode 
21b70 3d 20 28 69 73 44 65 6c 65 74 65 3f 30 36 30 30  = (isDelete?0600
21b80 3a 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  :SQLITE_DEFAULT_
21b90 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
21ba0 29 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e  );.    fd = open
21bb0 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  (zName, openFlag
21bc0 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20  s, openMode);.  
21bd0 20 20 4f 53 54 52 41 43 45 34 28 22 4f 50 45 4e    OSTRACE4("OPEN
21be0 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c  X   %-3d %s 0%o\
21bf0 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f  n", fd, zName, o
21c00 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  penFlags);.    i
21c10 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f  f( fd<0 && errno
21c20 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65  !=EISDIR && isRe
21c30 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78  adWrite && !isEx
21c40 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20  clusive ){.     
21c50 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70   /* Failed to op
21c60 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  en the file for 
21c70 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
21c80 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79  s. Try read-only
21c90 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73  . */.      flags
21ca0 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45   &= ~(SQLITE_OPE
21cb0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
21cc0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
21cd0 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
21ce0 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43   &= ~(O_RDWR|O_C
21cf0 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61  REAT);.      fla
21d00 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
21d10 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
21d20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
21d30 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 66  _RDONLY;.      f
21d40 64 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  d = open(zName, 
21d50 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d  openFlags, openM
21d60 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ode);.    }.    
21d70 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
21d80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
21d90 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20 67 6f  NTOPEN;.      go
21da0 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
21db0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
21dc0 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20  sert( fd>=0 );. 
21dd0 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29   if( pOutFlags )
21de0 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73  {.    *pOutFlags
21df0 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
21e00 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20   if( p->pUnused 
21e10 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65  ){.    p->pUnuse
21e20 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20  d->fd = fd;.    
21e30 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67  p->pUnused->flag
21e40 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
21e50 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
21e60 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
21e70 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61  .    zPath = zNa
21e80 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 6e  me;.#else.    un
21e90 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e  link(zName);.#en
21ea0 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  dif.  }.#if SQLI
21eb0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
21ec0 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a  G_STYLE.  else{.
21ed0 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73      p->openFlags
21ee0 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
21ef0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
21f00 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20  isOpenDirectory 
21f10 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  ){.    rc = open
21f20 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c  Directory(zPath,
21f30 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66   &dirfd);.    if
21f40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21f50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
21f60 73 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 20  s safe to close 
21f70 66 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  fd at this point
21f80 2c 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  , because it is 
21f90 67 75 61 72 61 6e 74 65 65 64 20 6e 6f 74 0a 20  guaranteed not. 
21fa0 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 6f 70       ** to be op
21fb0 65 6e 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  en on a database
21fc0 20 66 69 6c 65 2e 20 49 66 20 69 74 20 77 65 72   file. If it wer
21fd0 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61 74 61  e open on a data
21fe0 62 61 73 65 20 66 69 6c 65 2c 0a 20 20 20 20 20  base file,.     
21ff0 20 2a 2a 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74   ** it would not
22000 20 62 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73   be safe to clos
22010 65 20 61 73 20 74 68 69 73 20 77 6f 75 6c 64 20  e as this would 
22020 72 65 6c 65 61 73 65 20 61 6e 79 20 6c 6f 63 6b  release any lock
22030 73 20 68 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20  s held.      ** 
22040 6f 6e 20 74 68 65 20 66 69 6c 65 20 62 79 20 74  on the file by t
22050 68 69 73 20 70 72 6f 63 65 73 73 2e 20 20 2a 2f  his process.  */
22060 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
22070 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
22080 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 20  N_MAIN_DB );.   
22090 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 20 20     close(fd);   
220a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 69 6c            /* sil
220b0 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61  ently leak if fa
220c0 69 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e 20 65  il, already in e
220d0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 67 6f  rror */.      go
220e0 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
220f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
22100 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20  def FD_CLOEXEC. 
22110 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54   fcntl(fd, F_SET
22120 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f  FD, fcntl(fd, F_
22130 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43  GETFD, 0) | FD_C
22140 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a  LOEXEC);.#endif.
22150 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70  .  noLock = eTyp
22160 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
22170 41 49 4e 5f 44 42 3b 0a 0a 23 69 66 20 53 51 4c  AIN_DB;..#if SQL
22180 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
22190 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74  _LOCKING.  isAut
221a0 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64  oProxy = 1;.#end
221b0 69 66 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65  if.  .#if define
221c0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20  d(__APPLE__) || 
221d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
221e0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 20 20 73  CKING_STYLE..  s
221f0 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
22200 6e 66 6f 3b 0a 20 20 69 66 28 20 66 73 74 61 74  nfo;.  if( fstat
22210 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20  fs(fd, &fsInfo) 
22220 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28 28 75  == -1 ){.    ((u
22230 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d  nixFile*)pFile)-
22240 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
22250 6e 6f 3b 0a 20 20 20 20 69 66 28 20 64 69 72 66  no;.    if( dirf
22260 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69 72  d>=0 ) close(dir
22270 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79  fd); /* silently
22280 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69   leak if fail, i
22290 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 63  n error */.    c
222a0 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c  lose(fd); /* sil
222b0 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61  ently leak if fa
222c0 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a  il, in error */.
222d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
222e0 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a  E_IOERR_ACCESS;.
222f0 20 20 7d 0a 20 20 0a 20 20 28 28 75 6e 69 78 46    }.  .  ((unixF
22300 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46  ile*)pFile)->fsF
22310 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 46 53  lags = SQLITE_FS
22320 46 4c 41 47 53 5f 49 4e 49 54 49 41 4c 49 5a 45  FLAGS_INITIALIZE
22330 44 3b 0a 20 20 0a 20 20 69 66 20 28 66 73 49 6e  D;.  .  if (fsIn
22340 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54  fo.f_flags & MNT
22350 5f 52 44 4f 4e 4c 59 29 20 7b 0a 20 20 20 20 28  _RDONLY) {.    (
22360 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
22370 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51  )->fsFlags |= SQ
22380 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
22390 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
223a0 69 66 20 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  if (fsInfo.f_fla
223b0 67 73 20 26 20 4d 4e 54 5f 4c 4f 43 41 4c 29 20  gs & MNT_LOCAL) 
223c0 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
223d0 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
223e0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
223f0 41 47 53 5f 49 53 5f 4c 4f 43 41 4c 3b 0a 20 20  AGS_IS_LOCAL;.  
22400 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72  }.  if (0 == str
22410 6e 63 6d 70 28 22 68 66 73 22 2c 20 66 73 49 6e  ncmp("hfs", fsIn
22420 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
22430 20 33 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69   3)) {.    ((uni
22440 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66  xFile*)pFile)->f
22450 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  sFlags |= SQLITE
22460 5f 46 53 46 4c 41 47 53 5f 49 53 5f 48 46 53 50  _FSFLAGS_IS_HFSP
22470 4c 55 53 3b 0a 20 20 7d 20 65 6c 73 65 20 69 66  LUS;.  } else if
22480 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22   (0 == strncmp("
22490 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66  msdos", fsInfo.f
224a0 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29  _fstypename, 5))
224b0 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c   {.    ((unixFil
224c0 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61  e*)pFile)->fsFla
224d0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46  gs |= SQLITE_FSF
224e0 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20  LAGS_IS_MSDOS;. 
224f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69 66   }.#endif.  .#if
22500 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
22510 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
22520 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26  f( isAutoProxy &
22530 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20  & (zPath!=NULL) 
22540 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20  && (!noLock) && 
22550 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20  pVfs->xOpen ){. 
22560 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63     char *envforc
22570 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49  e = getenv("SQLI
22580 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
22590 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e  OCKING");.    in
225a0 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a  t useProxy = 0;.
225b0 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
225c0 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
225d0 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63  NG==1 means forc
225e0 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f  e always use pro
225f0 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20  xy, 0 means .   
22600 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72   ** never use pr
22610 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  oxy, NULL means 
22620 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f  use proxy for no
22630 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e  n-local files on
22640 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ly.  */.    if( 
22650 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29  envforce!=NULL )
22660 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79  {.      useProxy
22670 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65   = atoi(envforce
22680 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )>0;.    }else{.
22690 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
226a0 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20  tfs fsInfo;.    
226b0 20 20 69 66 28 20 73 74 61 74 66 73 28 7a 50 61    if( statfs(zPa
226c0 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20  th, &fsInfo) == 
226d0 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  -1 ){.        /*
226e0 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20   In theory, the 
226f0 63 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c 20 69  close(fd) call i
22700 73 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e 20 49  s sub-optimal. I
22710 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
22720 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74  d.        ** wit
22730 68 20 66 64 20 69 73 20 61 20 64 61 74 61 62 61  h fd is a databa
22740 73 65 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  se file, and the
22750 72 65 20 61 72 65 20 6f 74 68 65 72 20 63 6f 6e  re are other con
22760 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a 20 20  nections open.  
22770 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 61 74        ** on that
22780 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 63   file that are c
22790 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67  urrently holding
227a0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
227b0 6f 6e 20 69 74 2c 0a 20 20 20 20 20 20 20 20 2a  on it,.        *
227c0 2a 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 20  * then the call 
227d0 74 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c 6c 20  to close() will 
227e0 63 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c 6f 63  cancel those loc
227f0 6b 73 2e 20 49 6e 20 70 72 61 63 74 69 63 65 2c  ks. In practice,
22800 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 27 72  .        ** we'r
22810 65 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  e assuming that 
22820 73 74 61 74 66 73 28 29 20 64 6f 65 73 6e 27 74  statfs() doesn't
22830 20 66 61 69 6c 20 76 65 72 79 20 6f 66 74 65 6e   fail very often
22840 2e 20 41 74 20 6c 65 61 73 74 0a 20 20 20 20 20  . At least.     
22850 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c 65 20     ** not while 
22860 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
22870 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 62 79  iptors opened by
22880 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
22890 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  s on.        ** 
228a0 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 61 72  the same file ar
228b0 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a 20  e working.  */. 
228c0 20 20 20 20 20 20 20 70 2d 3e 6c 61 73 74 45 72         p->lastEr
228d0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
228e0 20 20 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d       if( dirfd>=
228f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
22900 6c 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a 20  lose(dirfd); /* 
22910 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66  silently leak if
22920 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20   fail, in error 
22930 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
22940 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20       close(fd); 
22950 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b  /* silently leak
22960 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72   if fail, in err
22970 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  or */.        rc
22980 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
22990 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 20 20  ACCESS;.        
229a0 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
229b0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
229c0 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66    useProxy = !(f
229d0 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e  sInfo.f_flags&MN
229e0 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a  T_LOCAL);.    }.
229f0 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78 79      if( useProxy
22a00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
22a10 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56  illInUnixFile(pV
22a20 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 70  fs, fd, dirfd, p
22a30 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c  File, zPath, noL
22a40 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b 0a  ock, isDelete);.
22a50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
22a60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22a70 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61     rc = proxyTra
22a80 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28  nsformUnixFile((
22a90 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c  unixFile*)pFile,
22aa0 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20   ":auto:");.    
22ab0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22ac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
22ad0 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c     /* Use unixCl
22ae0 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  ose to clean up 
22af0 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61 64  the resources ad
22b00 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69  ded in fillInUni
22b10 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20 20  xFile .         
22b20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c   ** and clear al
22b30 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65 27  l the structure'
22b40 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53  s references.  S
22b50 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20  pecifically, .  
22b60 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c 65          ** pFile
22b70 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20  ->pMethods will 
22b80 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74  be NULL so sqlit
22b90 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62  e3OsClose will b
22ba0 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20  e a no-op .     
22bb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
22bc0 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c    unixClose(pFil
22bd0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
22be0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
22bf0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
22c00 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
22c10 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  hed;.    }.  }.#
22c20 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d 20  endif.  .  rc = 
22c30 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
22c40 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20  Vfs, fd, dirfd, 
22c50 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f  pFile, zPath, no
22c60 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b  Lock, isDelete);
22c70 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a  .open_finished:.
22c80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22c90 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
22ca0 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75 73  e3_free(p->pUnus
22cb0 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ed);.  }.  retur
22cc0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
22cd0 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20  Delete the file 
22ce0 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65  at zPath. If the
22cf0 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e   dirSync argumen
22d00 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63  t is true, fsync
22d10 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  ().** the direct
22d20 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69  ory after deleti
22d30 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  ng the file..*/.
22d40 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
22d50 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33  elete(.  sqlite3
22d60 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20  _vfs *NotUsed,  
22d70 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69     /* VFS contai
22d80 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68 65  ning this as the
22d90 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20   xDelete method 
22da0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
22db0 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f  *zPath,        /
22dc0 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
22dd0 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a  o be deleted */.
22de0 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20    int dirSync   
22df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
22e00 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20  f true, fsync() 
22e10 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
22e20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f  deleting file */
22e30 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
22e40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53  QLITE_OK;.  UNUS
22e50 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
22e60 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
22e70 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
22e80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
22e90 45 54 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a  ETE);.  unlink(z
22ea0 50 61 74 68 29 3b 0a 23 69 66 6e 64 65 66 20 53  Path);.#ifndef S
22eb0 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49  QLITE_DISABLE_DI
22ec0 52 53 59 4e 43 0a 20 20 69 66 28 20 64 69 72 53  RSYNC.  if( dirS
22ed0 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  ync ){.    int f
22ee0 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  d;.    rc = open
22ef0 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c  Directory(zPath,
22f00 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72   &fd);.    if( r
22f10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22f20 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
22f30 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66       if( fsync(f
22f40 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20  d)==-1 ).#else. 
22f50 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66       if( fsync(f
22f60 64 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20  d) ).#endif.    
22f70 20 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d    {.        rc =
22f80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
22f90 52 5f 46 53 59 4e 43 3b 0a 20 20 20 20 20 20 7d  R_FSYNC;.      }
22fa0 0a 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65  .      if( close
22fb0 28 66 64 29 26 26 21 72 63 20 29 7b 0a 20 20 20  (fd)&&!rc ){.   
22fc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22fd0 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45  _IOERR_DIR_CLOSE
22fe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22ff0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
23000 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23010 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74 61   Test the exista
23020 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73  nce of or access
23030 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20   permissions of 
23040 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a  file zPath. The.
23050 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65  ** test performe
23060 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  d depends on the
23070 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a   value of flags:
23080 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
23090 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a  E_ACCESS_EXISTS:
230a0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
230b0 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20   file exists.** 
230c0 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
230d0 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65 74  S_READWRITE: Ret
230e0 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
230f0 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77 72  e is read and wr
23100 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53  itable..**     S
23110 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
23120 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20  DONLY: Return 1 
23130 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  if the file is r
23140 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f  eadable..**.** O
23150 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
23160 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
23170 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73   unixAccess(.  s
23180 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
23190 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46  sed,   /* The VF
231a0 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  S containing thi
231b0 73 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64  s xAccess method
231c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
231d0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a   *zPath,      /*
231e0 20 50 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c   Path of the fil
231f0 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a  e to examine */.
23200 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
23210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
23220 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20  t do we want to 
23230 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20  learn about the 
23240 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20  zPath file? */. 
23250 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20   int *pResOut   
23260 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
23270 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e  e result boolean
23280 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
23290 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55  t amode = 0;.  U
232a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
232b0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
232c0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
232d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
232e0 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77  _ACCESS; );.  sw
232f0 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
23300 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
23310 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20  CCESS_EXISTS:.  
23320 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b      amode = F_OK
23330 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
23340 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
23350 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
23360 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57  .      amode = W
23370 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  _OK|R_OK;.      
23380 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
23390 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
233a0 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  AD:.      amode 
233b0 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  = R_OK;.      br
233c0 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
233d0 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
233e0 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20  !"Invalid flags 
233f0 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a  argument");.  }.
23400 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 61 63    *pResOut = (ac
23410 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64  cess(zPath, amod
23420 65 29 3d 3d 30 29 3b 0a 20 20 72 65 74 75 72 6e  e)==0);.  return
23430 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
23440 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c  /*.** Turn a rel
23450 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69  ative pathname i
23460 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e  nto a full pathn
23470 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76  ame. The relativ
23480 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f  e path.** is sto
23490 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72  red as a nul-ter
234a0 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69  minated string i
234b0 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
234c0 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50  nted to by.** zP
234d0 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74  ath. .**.** zOut
234e0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
234f0 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
23500 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
23510 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a  thname bytes .**
23520 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20   (in this case, 
23530 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74  MAX_PATHNAME byt
23540 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61  es). The full-pa
23550 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  th is written to
23560 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20  .** this buffer 
23570 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
23580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23590 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  unixFullPathname
235a0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
235b0 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
235c0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
235d0 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
235e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
235f0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  h,            /*
23600 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69   Possibly relati
23610 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f  ve input path */
23620 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20  .  int nOut,    
23630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23640 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70   /* Size of outp
23650 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74  ut buffer in byt
23660 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f  es */.  char *zO
23670 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
23680 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
23690 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20  buffer */.){..  
236a0 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
236b0 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
236c0 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
236d0 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
236e0 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
236f0 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
23700 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
23710 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
23720 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
23730 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
23740 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
23750 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f  ould fail if, fo
23760 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20  r example, the. 
23770 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b   ** current work
23780 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61  ing directory ha
23790 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
237a0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
237b0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
237c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
237d0 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d  .  assert( pVfs-
237e0 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58  >mxPathname==MAX
237f0 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55  _PATHNAME );.  U
23800 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
23810 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e  pVfs);..  zOut[n
23820 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out-1] = '\0';. 
23830 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27   if( zPath[0]=='
23840 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  /' ){.    sqlite
23850 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c  3_snprintf(nOut,
23860 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61   zOut, "%s", zPa
23870 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  th);.  }else{.  
23880 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20    int nCwd;.    
23890 69 66 28 20 67 65 74 63 77 64 28 7a 4f 75 74 2c  if( getcwd(zOut,
238a0 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20   nOut-1)==0 ){. 
238b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
238c0 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
238d0 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 28 69   }.    nCwd = (i
238e0 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b  nt)strlen(zOut);
238f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
23900 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c  rintf(nOut-nCwd,
23910 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f   &zOut[nCwd], "/
23920 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d  %s", zPath);.  }
23930 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23940 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  _OK;.}...#ifndef
23950 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
23960 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a  D_EXTENSION./*.*
23970 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72  * Interfaces for
23980 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65   opening a share
23990 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69  d library, findi
239a0 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a  ng entry points.
239b0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68  ** within the sh
239c0 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e  ared library, an
239d0 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68  d closing the sh
239e0 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  ared library..*/
239f0 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e  .#include <dlfcn
23a00 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .h>.static void 
23a10 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69  *unixDlOpen(sqli
23a20 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
23a30 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
23a40 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53  ilename){.  UNUS
23a50 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
23a60 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
23a70 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  dlopen(zFilename
23a80 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c  , RTLD_NOW | RTL
23a90 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a  D_GLOBAL);.}../*
23aa0 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73  .** SQLite calls
23ab0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
23ac0 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
23ad0 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44   a call to unixD
23ae0 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69  lSym() or.** uni
23af0 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20  xDlOpen() fails 
23b00 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20  (returns a null 
23b10 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d  pointer). If a m
23b20 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72 72  ore detailed err
23b30 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73  or.** message is
23b40 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69   available, it i
23b50 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75  s written to zBu
23b60 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f  fOut. If no erro
23b70 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20  r message.** is 
23b80 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f  available, zBufO
23b90 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  ut is left unmod
23ba0 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65  ified and SQLite
23bb0 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a   uses a default.
23bc0 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
23bd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23be0 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c   unixDlError(sql
23bf0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
23c00 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  d, int nBuf, cha
23c10 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63  r *zBufOut){.  c
23c20 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55  har *zErr;.  UNU
23c30 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
23c40 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e  tUsed);.  unixEn
23c50 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45  terMutex();.  zE
23c60 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a  rr = dlerror();.
23c70 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
23c80 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
23c90 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74  tf(nBuf, zBufOut
23ca0 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20  , "%s", zErr);. 
23cb0 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
23cc0 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20  tex();.}.static 
23cd0 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d  void (*unixDlSym
23ce0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
23cf0 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20  tUsed, void *p, 
23d00 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29  const char*zSym)
23d10 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20  )(void){.  /* . 
23d20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65   ** GCC with -pe
23d30 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61  dantic-errors sa
23d40 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65 73  ys that C90 does
23d50 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69   not allow a voi
23d60 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61  d* to be.  ** ca
23d70 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  st into a pointe
23d80 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
23d90 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69    And yet the li
23da0 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f  brary dlsym() ro
23db0 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72  utine.  ** retur
23dc0 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68  ns a void* which
23dd0 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69   is really a poi
23de0 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
23df0 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77  on.  So how do w
23e00 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d  e.  ** use dlsym
23e10 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  () with -pedanti
23e20 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20  c-errors?.  **. 
23e30 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62   ** Variable x b
23e40 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20  elow is defined 
23e50 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  to be a pointer 
23e60 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61  to a function ta
23e70 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65  king.  ** parame
23e80 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63  ters void* and c
23e90 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72  onst char* and r
23ea0 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74  eturning a point
23eb0 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
23ec0 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61  ..  ** We initia
23ed0 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e  lize x by assign
23ee0 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72  ing it a pointer
23ef0 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20   to the dlsym() 
23f00 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28  function..  ** (
23f10 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  That assignment 
23f20 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74 2e  requires a cast.
23f30 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20  )  Then we call 
23f40 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  the function tha
23f50 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20  t.  ** x points 
23f60 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  to.  .  **.  ** 
23f70 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64  This work-around
23f80 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20   is unlikely to 
23f90 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f  work correctly o
23fa0 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65  n any system whe
23fb0 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c  re.  ** you real
23fc0 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61  ly cannot cast a
23fd0 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
23fe0 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42  r into void*.  B
23ff0 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a  ut then, on the.
24000 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c    ** other hand,
24010 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f   dlsym() will no
24020 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61  t work on such a
24030 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20   system either, 
24040 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  so we have.  ** 
24050 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20  not really lost 
24060 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  anything..  */. 
24070 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69   void (*(*x)(voi
24080 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  d*,const char*))
24090 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44  (void);.  UNUSED
240a0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
240b0 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64  ed);.  x = (void
240c0 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  (*(*)(void*,cons
240d0 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29  t char*))(void))
240e0 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20  dlsym;.  return 
240f0 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d  (*x)(p, zSym);.}
24100 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
24110 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  xDlClose(sqlite3
24120 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
24130 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20  oid *pHandle){. 
24140 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
24150 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c  R(NotUsed);.  dl
24160 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a  close(pHandle);.
24170 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
24180 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
24190 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
241a0 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
241b0 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a  e unixDlOpen  0.
241c0 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
241d0 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e  Error 0.  #defin
241e0 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a  e unixDlSym   0.
241f0 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
24200 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a  Close 0.#endif..
24210 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66  /*.** Write nBuf
24220 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d   bytes of random
24230 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70   data to the sup
24240 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75  plied buffer zBu
24250 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
24260 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28   unixRandomness(
24270 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
24280 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20  Used, int nBuf, 
24290 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55  char *zBuf){.  U
242a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
242b0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65  NotUsed);.  asse
242c0 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e  rt((size_t)nBuf>
242d0 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29  =(sizeof(time_t)
242e0 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a  +sizeof(int)));.
242f0 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f  .  /* We have to
24300 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66   initialize zBuf
24310 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67   to prevent valg
24320 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74  rind from report
24330 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e  ing.  ** errors.
24340 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73    The reports is
24350 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64  sued by valgrind
24360 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d   are incorrect -
24370 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70   we would.  ** p
24380 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72  refer that the r
24390 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63  andomness be inc
243a0 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67  reased by making
243b0 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a   use of the.  **
243c0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
243d0 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62  pace in zBuf - b
243e0 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f  ut valgrind erro
243f0 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79  rs tend to worry
24400 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73  .  ** some users
24410 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61  .  Rather than a
24420 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65  rgue, it seems e
24430 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e  asier just to in
24440 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68  itialize.  ** th
24450 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e  e whole array an
24460 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69  d silence valgri
24470 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74  nd, even if that
24480 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64   means less rand
24490 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74  omness.  ** in t
244a0 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a  he random seed..
244b0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74    **.  ** When t
244c0 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69  esting, initiali
244d0 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a  zing zBuf[] to z
244e0 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f  ero is all we do
244f0 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20  .  That means.  
24500 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79  ** that we alway
24510 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  s use the same r
24520 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71  andom number seq
24530 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b  uence.  This mak
24540 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74  es the.  ** test
24550 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20  s repeatable..  
24560 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  */.  memset(zBuf
24570 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20  , 0, nBuf);.#if 
24580 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
24590 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e  TEST).  {.    in
245a0 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20 20 66  t pid, fd;.    f
245b0 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75  d = open("/dev/u
245c0 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c  random", O_RDONL
245d0 59 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  Y);.    if( fd<0
245e0 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74   ){.      time_t
245f0 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26   t;.      time(&
24600 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
24610 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f  (zBuf, &t, sizeo
24620 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64  f(t));.      pid
24630 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20   = getpid();.   
24640 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
24650 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64  sizeof(t)], &pid
24660 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a  , sizeof(pid));.
24670 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
24680 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 70  zeof(t)+sizeof(p
24690 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75  id)<=(size_t)nBu
246a0 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20  f );.      nBuf 
246b0 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69  = sizeof(t) + si
246c0 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20 20 7d  zeof(pid);.    }
246d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 42 75 66  else{.      nBuf
246e0 20 3d 20 72 65 61 64 28 66 64 2c 20 7a 42 75 66   = read(fd, zBuf
246f0 2c 20 6e 42 75 66 29 3b 0a 20 20 20 20 20 20 63  , nBuf);.      c
24700 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a  lose(fd);.    }.
24710 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
24720 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a  urn nBuf;.}.../*
24730 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
24740 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
24750 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
24760 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
24770 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
24780 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
24790 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65   microseconds we
247a0 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a   want to sleep..
247b0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
247c0 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lue is the numbe
247d0 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
247e0 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61  s of sleep actua
247f0 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  lly.** requested
24800 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c   from the underl
24810 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73  ying operating s
24820 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20  ystem, a number 
24830 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62  which.** might b
24840 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
24850 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
24860 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74  rgument, but not
24870 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68   less.** than th
24880 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  e argument..*/.s
24890 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c  tatic int unixSl
248a0 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
248b0 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69  *NotUsed, int mi
248c0 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66  croseconds){.#if
248d0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
248e0 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 70  ruct timespec sp
248f0 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d  ;..  sp.tv_sec =
24900 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20   microseconds / 
24910 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76  1000000;.  sp.tv
24920 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65  _nsec = (microse
24930 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30 29  conds % 1000000)
24940 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73   * 1000;.  nanos
24950 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b  leep(&sp, NULL);
24960 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
24970 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
24980 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
24990 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  nds;.#elif defin
249a0 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20  ed(HAVE_USLEEP) 
249b0 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20  && HAVE_USLEEP. 
249c0 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63   usleep(microsec
249d0 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  onds);.  UNUSED_
249e0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
249f0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63  d);.  return mic
24a00 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65  roseconds;.#else
24a10 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d  .  int seconds =
24a20 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39   (microseconds+9
24a30 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a  99999)/1000000;.
24a40 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29    sleep(seconds)
24a50 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
24a60 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
24a70 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a   return seconds*
24a80 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a  1000000;.#endif.
24a90 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
24aa0 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c  lowing variable,
24ab0 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e   if set to a non
24ac0 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20  -zero value, is 
24ad0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a  interpreted as.*
24ae0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
24af0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
24b00 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74  70 and is used t
24b10 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  o set the result
24b20 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73   of.** sqlite3Os
24b30 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75  CurrentTime() du
24b40 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f  ring testing..*/
24b50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
24b60 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
24b70 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30  current_time = 0
24b80 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65  ;  /* Fake syste
24b90 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64  m time in second
24ba0 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f  s since 1970. */
24bb0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
24bc0 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
24bd0 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
24be0 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
24bf0 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
24c00 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
24c10 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
24c20 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
24c30 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
24c40 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
24c50 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
24c60 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
24c70 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
24c80 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
24c90 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
24ca0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
24cb0 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  , double *prNow)
24cc0 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
24cd0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
24ce0 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 74 69 6d 65  NG_POINT).  time
24cf0 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29  _t t;.  time(&t)
24d00 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 28 28 28  ;.  *prNow = (((
24d10 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29  sqlite3_int64)t)
24d20 2f 38 36 34 30 20 2b 20 32 34 34 30 35 38 37 35  /8640 + 24405875
24d30 29 2f 31 30 3b 0a 23 65 6c 69 66 20 64 65 66 69  )/10;.#elif defi
24d40 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20  ned(NO_GETTOD). 
24d50 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d   time_t t;.  tim
24d60 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77 20  e(&t);.  *prNow 
24d70 3d 20 74 2f 38 36 34 30 30 2e 30 20 2b 20 32 34  = t/86400.0 + 24
24d80 34 30 35 38 37 2e 35 3b 0a 23 65 6c 69 66 20 4f  40587.5;.#elif O
24d90 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
24da0 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77  ct timespec sNow
24db0 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d  ;.  clock_gettim
24dc0 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45  e(CLOCK_REALTIME
24dd0 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 72 4e  , &sNow);.  *prN
24de0 6f 77 20 3d 20 32 34 34 30 35 38 37 2e 35 20 2b  ow = 2440587.5 +
24df0 20 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34   sNow.tv_sec/864
24e00 30 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e  00.0 + sNow.tv_n
24e10 73 65 63 2f 38 36 34 30 30 30 30 30 30 30 30 30  sec/864000000000
24e20 30 30 2e 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74  00.0;.#else.  st
24e30 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f  ruct timeval sNo
24e40 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61  w;.  gettimeofda
24e50 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a  y(&sNow, 0);.  *
24e60 70 72 4e 6f 77 20 3d 20 32 34 34 30 35 38 37 2e  prNow = 2440587.
24e70 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73 65 63 2f  5 + sNow.tv_sec/
24e80 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f 77 2e 74  86400.0 + sNow.t
24e90 76 5f 75 73 65 63 2f 38 36 34 30 30 30 30 30 30  v_usec/864000000
24ea0 30 30 2e 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  00.0;.#endif..#i
24eb0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
24ec0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
24ed0 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
24ee0 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69     *prNow = sqli
24ef0 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
24f00 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35  /86400.0 + 24405
24f10 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  87.5;.  }.#endif
24f20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
24f30 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
24f40 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
24f50 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65 20  ** We added the 
24f60 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20  xGetLastError() 
24f70 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65 20  method with the 
24f80 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f  intention of pro
24f90 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72  viding.** better
24fa0 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
24fb0 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f   messages when o
24fc0 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20  perating-system 
24fd0 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70  problems come up
24fe0 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74  .** during SQLit
24ff0 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  e operation.  Bu
25000 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f  t so far, none o
25010 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  f that has been 
25020 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69  implemented.** i
25030 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20  n the core.  So 
25040 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
25050 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46  never called.  F
25060 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65  or now, it is me
25070 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d  rely.** a place-
25080 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  holder..*/.stati
25090 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73  c int unixGetLas
250a0 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
250b0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
250c0 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20   NotUsed2, char 
250d0 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e  *NotUsed3){.  UN
250e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
250f0 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45  otUsed);.  UNUSE
25100 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
25110 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  sed2);.  UNUSED_
25120 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
25130 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  d3);.  return 0;
25140 0a 7d 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../*.*********
25150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
25160 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76  End of sqlite3_v
25170 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
25180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25190 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
251a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
251b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
251c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
251d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
251e0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
251f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25230 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
25240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25250 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c  ** Begin Proxy L
25260 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
25270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25280 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72  *******.**.** Pr
25290 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
252a0 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d   "uber-locking-m
252b0 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73  ethod" in this s
252c0 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20 74  ense:  It uses t
252d0 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b  he.** other lock
252e0 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73  ing methods on s
252f0 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69  econdary lock fi
25300 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b  les.  Proxy lock
25310 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61  ing is a.** meta
25320 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20  -layer over top 
25330 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76 65  of the primitive
25340 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
25350 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72  nted above.  For
25360 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  .** this reason,
25370 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
25380 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66  at implements of
25390 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
253a0 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e  s deferred.** un
253b0 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20  til late in the 
253c0 66 69 6c 65 20 28 68 65 72 65 29 20 61 66 74 65  file (here) afte
253d0 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68  r all of the oth
253e0 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68  er I/O methods h
253f0 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69  ave.** been defi
25400 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68  ned - so that th
25410 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b  e primitive lock
25420 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20  ing methods are 
25430 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20  available.** as 
25440 73 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70  services to help
25450 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d   with the implem
25460 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78  entation of prox
25470 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a  y locking..**.**
25480 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  **.**.** The def
25490 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68  ault locking sch
254a0 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75  emes in SQLite u
254b0 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  se byte-range lo
254c0 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61  cks on the.** da
254d0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
254e0 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20  oordinate safe, 
254f0 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73  concurrent acces
25500 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65  s by multiple re
25510 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69  aders.** and wri
25520 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c  ters [http://sql
25530 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76  ite.org/lockingv
25540 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69  3.html].  The fi
25550 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a  ve file locking.
25560 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43  ** states (UNLOC
25570 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48  KED, PENDING, SH
25580 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
25590 45 58 43 4c 55 53 49 56 45 29 20 61 72 65 20 69  EXCLUSIVE) are i
255a0 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73  mplemented.** as
255b0 20 50 4f 53 49 58 20 72 65 61 64 20 26 20 77 72   POSIX read & wr
255c0 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66  ite locks over f
255d0 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61  ixed set of loca
255e0 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c  tions (via fsctl
255f0 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64  ),.** on AFP and
25600 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73   SMB only exclus
25610 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  ive byte-range l
25620 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62  ocks are availab
25630 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20  le via fsctl.** 
25640 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20  with _IOWR('z', 
25650 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52  23, struct ByteR
25660 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20  angeLockPB2) to 
25670 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35  track the same 5
25680 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73   states..** To s
25690 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43  imulate a F_RDLC
256a0 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20  K on the shared 
256b0 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20  range, on AFP a 
256c0 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65  randomly selecte
256d0 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20  d.** address in 
256e0 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65  the shared range
256f0 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20   is taken for a 
25700 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
25710 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65   entire.** share
25720 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e  d range is taken
25730 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56   for an EXCLUSIV
25740 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20  E lock):.**.**  
25750 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45      PENDING_BYTE
25760 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30          0x400000
25770 30 30 09 09 20 20 20 09 0a 2a 2a 20 20 20 20 20  00..   ..**     
25780 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20   RESERVED_BYTE  
25790 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a       0x40000001.
257a0 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52  **      SHARED_R
257b0 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30  ANGE        0x40
257c0 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30  000002 -> 0x4000
257d0 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  0200.**.** This 
257e0 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68  works well on th
257f0 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  e local file sys
25800 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61  tem, but shows a
25810 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20   nearly 100x.** 
25820 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64  slowdown in read
25830 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20   performance on 
25840 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20  AFP because the 
25850 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62  AFP client disab
25860 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20  les.** the read 
25870 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d  cache when byte-
25880 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
25890 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69  present.  Enabli
258a0 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63  ng the read.** c
258b0 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63  ache exposes a c
258c0 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70  ache coherency p
258d0 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70  roblem that is p
258e0 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53  resent on all OS
258f0 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20   X.** supported 
25900 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73  network file sys
25910 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41  tems.  NFS and A
25920 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20  FP both observe 
25930 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d  the.** close-to-
25940 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66  open semantics f
25950 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68  or ensuring cach
25960 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b  e coherency.** [
25970 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63  http://nfs.sourc
25980 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f  eforge.net/#faq_
25990 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20  a8], which does 
259a0 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a  not effectively.
259b0 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72  ** address the r
259c0 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20  equirements for 
259d0 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62  concurrent datab
259e0 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75  ase access by mu
259f0 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72  ltiple.** reader
25a00 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a  s and writers.**
25a10 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62   [http://www.nab
25a20 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f  ble.com/SQLite-o
25a30 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65  n-NFS-cache-cohe
25a40 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31  rency-td15655701
25a50 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f  .html]..**.** To
25a60 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72   address the per
25a70 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63  formance and cac
25a80 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73  he coherency iss
25a90 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20  ues, proxy file 
25aa0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67  locking.** chang
25ab0 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62  es the way datab
25ac0 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f  ase access is co
25ad0 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69  ntrolled by limi
25ae0 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61  ting access to a
25af0 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20  .** single host 
25b00 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f  at a time and mo
25b10 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ving file locks 
25b20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62  off of the datab
25b30 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  ase file.** and 
25b40 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c  onto a proxy fil
25b50 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66  e on the local f
25b60 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a  ile system.  .**
25b70 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f  .**.** Using pro
25b80 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d  xy locks.** ----
25b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
25ba0 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a  .** C APIs.**.**
25bb0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
25bc0 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
25bd0 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  e, SQLITE_SET_LO
25be0 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20  CKPROXYFILE,.** 
25bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c00 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74        <proxy_pat
25c10 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a  h> | ":auto:");.
25c20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
25c30 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
25c40 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f  ame, SQLITE_GET_
25c50 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26  LOCKPROXYFILE, &
25c60 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a  <proxy_path>);.*
25c70 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67  *.**.** SQL prag
25c80 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d  mas.**.**  PRAGM
25c90 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63  A [database.]loc
25ca0 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72  k_proxy_file=<pr
25cb0 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74  oxy_path> | :aut
25cc0 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  o:.**  PRAGMA [d
25cd0 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72  atabase.]lock_pr
25ce0 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53  oxy_file.**.** S
25cf0 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f  pecifying ":auto
25d00 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  :" means that if
25d10 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63   there is a conc
25d20 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61  h file with a ma
25d30 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49  tching.** host I
25d40 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f  D in it, the pro
25d50 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20 63  xy path in the c
25d60 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62  onch file will b
25d70 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73  e used, otherwis
25d80 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74  e.** a proxy pat
25d90 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75  h based on the u
25da0 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a  ser's temp dir.*
25db0 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f  * (via confstr(_
25dc0 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
25dd0 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69  EMP_DIR,...)) wi
25de0 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20 74  ll be used and t
25df0 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f  he.** actual pro
25e00 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  xy file name is 
25e10 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
25e20 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68  he name and path
25e30 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
25e40 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65  ase file.  For e
25e50 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
25e60 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65      For database
25e70 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65   path "/Users/me
25e80 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20  /foo.db" .**    
25e90 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68     The lock path
25ea0 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69   will be "<tmpdi
25eb0 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f  r>/sqliteplocks/
25ec0 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62  _Users_me_foo.db
25ed0 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f  :auto:").**.** O
25ee0 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79  nce a lock proxy
25ef0 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66   is configured f
25f00 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
25f10 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e  nnection, it can
25f20 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76   not.** be remov
25f30 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d  ed, however it m
25f40 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20 74  ay be switched t
25f50 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72  o a different pr
25f60 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20  oxy path via.** 
25f70 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20 28  the above APIs (
25f80 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e  assuming the con
25f90 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62  ch file is not b
25fa0 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f  eing held by ano
25fb0 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ther.** connecti
25fc0 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20  on or process). 
25fd0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72  .**.**.** How pr
25fe0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  oxy locking work
25ff0 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
26000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
26010 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f  ** Proxy file lo
26020 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69  cking relies pri
26030 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65  marily on two ne
26040 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c  w supporting fil
26050 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  es: .**.**   *  
26060 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69  conch file to li
26070 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74 68  mit access to th
26080 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26090 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74  to a single host
260a0 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74 69  .**      at a ti
260b0 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72  me.**.**   *  pr
260c0 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20  oxy file to act 
260d0 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74  as a proxy for t
260e0 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  he advisory lock
260f0 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20  s normally.**   
26100 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20     taken on the 
26110 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54  database.**.** T
26120 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20  he conch file - 
26130 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20 66  to use a proxy f
26140 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74  ile, sqlite must
26150 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65   first "hold the
26160 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61   conch".** by ta
26170 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73  king an sqlite-s
26180 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b  tyle shared lock
26190 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   on the conch fi
261a0 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a  le, reading the.
261b0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20  ** contents and 
261c0 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f  comparing the ho
261d0 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74  st's unique host
261e0 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20   ID (see below) 
261f0 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78  and lock.** prox
26200 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20 74  y path against t
26210 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
26220 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20   in the conch.  
26230 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69  The conch file i
26240 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74  s.** stored in t
26250 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
26260 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  y as the databas
26270 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
26280 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70  ile name.** is p
26290 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20 74  atterned after t
262a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
262b0 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61   name as ".<data
262c0 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22  basename>-conch"
262d0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63  ..** If the conc
262e0 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  h file does not 
262f0 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63  exist, or it's c
26300 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d  ontents do not m
26310 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74  atch the.** host
26320 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79   ID and/or proxy
26330 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20   path, then the 
26340 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65  lock is escalate
26350 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  d to an exclusiv
26360 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68  e.** lock and th
26370 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e  e conch file con
26380 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64  tents is updated
26390 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49   with the host I
263a0 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70  D and proxy.** p
263b0 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ath and the lock
263c0 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74   is downgraded t
263d0 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  o a shared lock 
263e0 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63  again.  If the c
263f0 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20  onch.** is held 
26400 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  by another proce
26410 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65  ss (with a share
26420 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63  d lock), the exc
26430 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77  lusive lock.** w
26440 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c  ill fail and SQL
26450 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
26460 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
26470 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73  proxy file - a s
26480 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20  ingle-byte file 
26490 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76  used for all adv
264a0 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73  isory file locks
264b0 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b  .** normally tak
264c0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
264d0 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20  se file.   This 
264e0 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20  allows for safe 
264f0 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68  sharing.** of th
26500 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26510 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61  for multiple rea
26520 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73  ders and writers
26530 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
26540 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20  host (the conch 
26550 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
26560 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61  y all use the sa
26570 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  me local lock fi
26580 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65  le)..**.** Reque
26590 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70  sting the lock p
265a0 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d  roxy does not im
265b0 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74  mediately take t
265c0 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a  he conch, it is.
265d0 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68  ** only taken wh
265e0 65 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71  en the first req
265f0 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74  uest to lock dat
26600 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61  abase file is ma
26610 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61  de.  .** This ma
26620 74 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74  tches the semant
26630 69 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69  ics of the tradi
26640 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62  tional locking b
26650 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a  ehavior, where.*
26660 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e  * opening a conn
26670 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61  ection to a data
26680 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e  base file does n
26690 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f  ot take a lock o
266a0 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61  n it..** The sha
266b0 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20  red lock and an 
266c0 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  open file descri
266d0 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69  ptor are maintai
266e0 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68  ned until .** th
266f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
26700 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
26710 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  closed. .**.** T
26720 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e  he proxy file an
26730 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  d the lock file 
26740 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65  are never delete
26750 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e  d so they only n
26760 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65  eed.** to be cre
26770 61 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74  ated the first t
26780 69 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65  ime they are use
26790 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  d..**.** Configu
267a0 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a  ration options.*
267b0 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
267c0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53  -------.**.**  S
267d0 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
267e0 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a  XY_LOCKING.**.**
267f0 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65 20         Database 
26800 66 69 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f  files accessed o
26810 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65  n non-local file
26820 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20   systems are.** 
26830 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61        automatica
26840 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66  lly configured f
26850 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
26860 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65  , lock files are
26870 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20  .**       named 
26880 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73  automatically us
26890 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67  ing the same log
268a0 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50  ic as.**       P
268b0 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79  RAGMA lock_proxy
268c0 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a  _file=":auto:".*
268d0 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45  *    .**  SQLITE
268e0 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a  _PROXY_DEBUG.**.
268f0 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73  **       Enables
26900 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20   the logging of 
26910 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64  error messages d
26920 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69  uring host id fi
26930 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72  le.**       retr
26940 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69  ieval and creati
26950 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52  on.**.**  LOCKPR
26960 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20  OXYDIR.**.**    
26970 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65     Overrides the
26980 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f   default directo
26990 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ry used for lock
269a0 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61   proxy files tha
269b0 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e  t.**       are n
269c0 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
269d0 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 74  ly via the ":aut
269e0 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a  o:" setting.**.*
269f0 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  *  SQLITE_DEFAUL
26a00 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
26a10 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20  SSIONS.**.**    
26a20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74     Permissions t
26a30 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74  o use when creat
26a40 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20  ing a directory 
26a50 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a  for storing the.
26a60 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72  **       lock pr
26a70 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20  oxy files, only 
26a80 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52  used when LOCKPR
26a90 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65  OXYDIR is not se
26aa0 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20  t..**    .**    
26ab0 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64  .** As mentioned
26ac0 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d   above, when com
26ad0 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
26ae0 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
26af0 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69  OCKING,.** setti
26b00 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65  ng the environme
26b10 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49  nt variable SQLI
26b20 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
26b30 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c  OCKING to 1 will
26b40 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20  .** force proxy 
26b50 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73  locking to be us
26b60 65 64 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  ed for every dat
26b70 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65  abase file opene
26b80 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c  d, and 0.** will
26b90 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63   force automatic
26ba0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74   proxy locking t
26bb0 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f  o be disabled fo
26bc0 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a  r all database.*
26bd0 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69  * files (explici
26be0 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53  ty calling the S
26bf0 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
26c00 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f  OXYFILE pragma o
26c10 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65  r.** sqlite_file
26c20 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20  _control API is 
26c30 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20  not affected by 
26c40 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
26c50 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a  XY_LOCKING)..*/.
26c60 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63  ./*.** Proxy loc
26c70 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
26c80 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58  ilable on MacOSX
26c90 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64   .*/.#if defined
26ca0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
26cb0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
26cc0 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a  KING_STYLE../*.*
26cd0 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69  * The proxyLocki
26ce0 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68  ngContext has th
26cf0 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20  e path and file 
26d00 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74  structures for t
26d10 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e  he remote .** an
26d20 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69  d local proxy fi
26d30 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70  les in it.*/.typ
26d40 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78  edef struct prox
26d50 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
26d60 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
26d70 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78  ext;.struct prox
26d80 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
26d90 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f  {.  unixFile *co
26da0 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  nchFile;        
26db0 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66   /* Open conch f
26dc0 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63  ile */.  char *c
26dd0 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20  onchFilePath;   
26de0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
26df0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
26e00 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c  */.  unixFile *l
26e10 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20  ockProxy;       
26e20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20    /* Open proxy 
26e30 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
26e40 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61  har *lockProxyPa
26e50 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  th;         /* N
26e60 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79  ame of the proxy
26e70 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
26e80 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
26e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26ea0 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Name of the open
26eb0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63   file */.  int c
26ec0 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20  onchHeld;       
26ed0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20          /* 1 if 
26ee0 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c  the conch is hel
26ef0 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73  d, -1 if lockles
26f00 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64  s */.  void *old
26f10 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  LockingContext; 
26f20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
26f30 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74  lockingcontext t
26f40 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f  o restore on clo
26f50 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
26f60 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
26f70 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20   *pOldMethod;   
26f80 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f    /* Original I/
26f90 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c  O methods for cl
26fa0 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a  ose */.};../* .*
26fb0 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
26fc0 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74   file path for t
26fd0 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64  he database at d
26fe0 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  bPath is written
26ff0 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a   into lPath, .**
27000 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e   which must poin
27010 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74  t to valid, writ
27020 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67  able memory larg
27030 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d  e enough for a m
27040 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20  axLen length.** 
27050 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73  file path. .*/.s
27060 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
27070 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  etLockPath(const
27080 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63   char *dbPath, c
27090 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65  har *lPath, size
270a0 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e  _t maxLen){.  in
270b0 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c  t len;.  int dbL
270c0 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  en;.  int i;..#i
270d0 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49  fdef LOCKPROXYDI
270e0 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  R.  len = strlcp
270f0 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f  y(lPath, LOCKPRO
27100 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a  XYDIR, maxLen);.
27110 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43  #else.# ifdef _C
27120 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
27130 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69  MP_DIR.  {.    i
27140 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f  f( !confstr(_CS_
27150 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
27160 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78  _DIR, lPath, max
27170 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53  Len) ){.      OS
27180 54 52 41 43 45 34 28 22 47 45 54 4c 4f 43 4b 50  TRACE4("GETLOCKP
27190 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65  ATH  failed %s e
271a0 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e  rrno=%d pid=%d\n
271b0 22 2c 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c  ", lPath, errno,
271c0 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 20 20   getpid());.    
271d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
271e0 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
271f0 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  }.    len = strl
27200 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69  cat(lPath, "sqli
27210 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65  teplocks", maxLe
27220 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c  n);    .  }.# el
27230 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  se.  len = strlc
27240 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f  py(lPath, "/tmp/
27250 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e  ", maxLen);.# en
27260 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  dif.#endif..  if
27270 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d  ( lPath[len-1]!=
27280 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d  '/' ){.    len =
27290 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
272a0 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  "/", maxLen);.  
272b0 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66  }.  .  /* transf
272c0 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20  orm the db path 
272d0 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68  to a unique cach
272e0 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65  e name */.  dbLe
272f0 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
27300 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20  dbPath);.  for( 
27310 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20  i=0; i<dbLen && 
27320 28 69 2b 6c 65 6e 2b 37 29 3c 6d 61 78 4c 65 6e  (i+len+7)<maxLen
27330 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
27340 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a   c = dbPath[i];.
27350 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d      lPath[i+len]
27360 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a   = (c=='/')?'_':
27370 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69  c;.  }.  lPath[i
27380 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74  +len]='\0';.  st
27390 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61  rlcat(lPath, ":a
273a0 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  uto:", maxLen);.
273b0 20 20 4f 53 54 52 41 43 45 33 28 22 47 45 54 4c    OSTRACE3("GETL
273c0 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c  OCKPATH  proxy l
273d0 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
273e0 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65  %d\n", lPath, ge
273f0 74 70 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72  tpid());.  retur
27400 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
27410 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20  /* . ** Creates 
27420 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e  the lock file an
27430 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69  d any missing di
27440 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63  rectories in loc
27450 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63  kPath. */.static
27460 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65   int proxyCreate
27470 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
27480 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a  har *lockPath){.
27490 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20    int i, len;.  
274a0 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48  char buf[MAXPATH
274b0 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72  LEN];.  int star
274c0 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65  t = 0;.  .  asse
274d0 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c  rt(lockPath!=NUL
274e0 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20  L);.  /* try to 
274f0 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69  create all the i
27500 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72 65  ntermediate dire
27510 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e  ctories */.  len
27520 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c   = (int)strlen(l
27530 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b  ockPath);.  buf[
27540 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d  0] = lockPath[0]
27550 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c  ;.  for( i=1; i<
27560 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  len; i++ ){.    
27570 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20  if( lockPath[i] 
27580 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73  == '/' && (i - s
27590 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20  tart > 0) ){.   
275a0 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72     /* only mkdir
275b0 20 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20   if leaf dir != 
275c0 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e  "." or "/" or ".
275d0 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ." */.      if( 
275e0 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d  i-start>2 || (i-
275f0 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b  start==1 && buf[
27600 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26  start] != '.' &&
27610 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
27620 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  /') .         ||
27630 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20   (i-start==2 && 
27640 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e  buf[start] != '.
27650 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31  ' && buf[start+1
27660 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20  ] != '.') ){.   
27670 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27       buf[i]='\0'
27680 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 6b  ;.        if( mk
27690 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f  dir(buf, SQLITE_
276a0 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
276b0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b  _PERMISSIONS) ){
276c0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65  .          int e
276d0 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rr=errno;.      
276e0 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58      if( err!=EEX
276f0 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20  IST ) {.        
27700 20 20 20 20 4f 53 54 52 41 43 45 35 28 22 43 52      OSTRACE5("CR
27710 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41  EATELOCKPATH  FA
27720 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73  ILED creating %s
27730 2c 20 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63  , '%s' proxy loc
27740 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
27750 5c 6e 22 2c 20 62 75 66 2c 20 73 74 72 65 72 72  \n", buf, strerr
27760 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74  or(err), lockPat
27770 68 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20  h, getpid());.  
27780 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
27790 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20   err;.          
277a0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
277b0 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d    }.      start=
277c0 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  i+1;.    }.    b
277d0 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68  uf[i] = lockPath
277e0 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  [i];.  }.  OSTRA
277f0 43 45 33 28 22 43 52 45 41 54 45 4c 4f 43 4b 50  CE3("CREATELOCKP
27800 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20  ATH  proxy lock 
27810 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
27820 22 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74  ", lockPath, get
27830 70 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e  pid());.  return
27840 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
27850 61 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69  ate a new VFS fi
27860 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73  le descriptor (s
27870 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
27880 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
27890 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
278a0 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69   and open the fi
278b0 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20  le named "path" 
278c0 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  in the file desc
278d0 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  riptor..**.** Th
278e0 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
278f0 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79  onsible not only
27900 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65   for closing the
27910 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
27920 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72  .** but also for
27930 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d   freeing the mem
27940 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
27950 69 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73  ith the file des
27960 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  criptor..*/.stat
27970 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
27980 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20  teUnixFile(.    
27990 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
279a0 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68  ,        /* path
279b0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69   for the new uni
279c0 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69  xFile */.    uni
279d0 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20  xFile **ppFile, 
279e0 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c        /* unixFil
279f0 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 65  e created and re
27a00 74 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f  turned by ref */
27a10 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66  .    int islockf
27a20 69 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ile           /*
27a30 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73   if non zero mis
27a40 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62  sing dirs will b
27a50 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b  e created */.) {
27a60 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
27a70 20 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31    int dirfd = -1
27a80 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
27a90 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ew;.  int rc = S
27aa0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
27ab0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
27ac0 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20  WR | O_CREAT;.  
27ad0 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d  sqlite3_vfs dumm
27ae0 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72  yVfs;.  int terr
27af0 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e  no = 0;.  UnixUn
27b00 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20  usedFd *pUnused 
27b10 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e  = NULL;..  /* 1.
27b20 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70   first try to op
27b30 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69  en/create the fi
27b40 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68  le.  ** 2. if th
27b50 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68  at fails, and th
27b60 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c  is is a lock fil
27b70 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74  e (not-conch), t
27b80 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a  ry creating.  **
27b90 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65   the parent dire
27ba0 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e  ctories and then
27bb0 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a   try again..  **
27bc0 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c   3. if that fail
27bd0 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74  s, try to open t
27be0 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c  he file read-onl
27bf0 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65  y.  ** otherwise
27c00 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66   return BUSY (if
27c10 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43   lock file) or C
27c20 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20  ANTOPEN for the 
27c30 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a  conch file.  */.
27c40 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64    pUnused = find
27c50 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c  ReusableFd(path,
27c60 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69   openFlags);.  i
27c70 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
27c80 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e    fd = pUnused->
27c90 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  fd;.  }else{.   
27ca0 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
27cb0 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
27cc0 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20  (*pUnused));.   
27cd0 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b   if( !pUnused ){
27ce0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
27cf0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
27d00 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  }.  }.  if( fd<0
27d10 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65   ){.    fd = ope
27d20 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  n(path, openFlag
27d30 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  s, SQLITE_DEFAUL
27d40 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
27d50 4e 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20  NS);.    terrno 
27d60 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
27d70 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   fd<0 && errno==
27d80 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b  ENOENT && islock
27d90 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  file ){.      if
27da0 28 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63  ( proxyCreateLoc
27db0 6b 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20 53  kPath(path) == S
27dc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27dd0 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61      fd = open(pa
27de0 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53  th, openFlags, S
27df0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
27e00 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
27e10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27e20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
27e30 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d  .    openFlags =
27e40 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66   O_RDONLY;.    f
27e50 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20 6f  d = open(path, o
27e60 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45  penFlags, SQLITE
27e70 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
27e80 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20  RMISSIONS);.    
27e90 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  terrno = errno;.
27ea0 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
27eb0 7b 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63 6b  {.    if( islock
27ec0 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 65  file ){.      re
27ed0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
27ee0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
27ef0 63 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20  ch (terrno) {.  
27f00 20 20 20 20 63 61 73 65 20 45 41 43 43 45 53 3a      case EACCES:
27f10 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
27f20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
27f30 20 20 20 63 61 73 65 20 45 49 4f 3a 20 0a 20 20     case EIO: .  
27f40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27f50 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20  ITE_IOERR_LOCK; 
27f60 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  /* even though i
27f70 74 20 69 73 20 74 68 65 20 63 6f 6e 63 68 20 2a  t is the conch *
27f80 2f 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  /.      default:
27f90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
27fa0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
27fb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
27fc0 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
27fd0 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
27fe0 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29  c(sizeof(*pNew))
27ff0 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55  ;.  if( pNew==NU
28000 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  LL ){.    rc = S
28010 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
28020 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65   goto end_create
28030 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65  _proxy;.  }.  me
28040 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
28050 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
28060 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61  .  pNew->openFla
28070 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
28080 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44    dummyVfs.pAppD
28090 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75  ata = (void*)&au
280a0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a  tolockIoFinder;.
280b0 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20    pUnused->fd = 
280c0 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66  fd;.  pUnused->f
280d0 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
280e0 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65  ;.  pNew->pUnuse
280f0 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a  d = pUnused;.  .
28100 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
28110 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c  xFile(&dummyVfs,
28120 20 66 64 2c 20 64 69 72 66 64 2c 20 28 73 71 6c   fd, dirfd, (sql
28130 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c  ite3_file*)pNew,
28140 20 70 61 74 68 2c 20 30 2c 20 30 29 3b 0a 20 20   path, 0, 0);.  
28150 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28160 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65  K ){.    *ppFile
28170 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74   = pNew;.    ret
28180 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
28190 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72   }.end_create_pr
281a0 6f 78 79 3a 20 20 20 20 0a 20 20 63 6c 6f 73 65  oxy:    .  close
281b0 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c  (fd); /* silentl
281c0 79 20 6c 65 61 6b 20 66 64 20 69 66 20 65 72 72  y leak fd if err
281d0 6f 72 2c 20 77 65 27 72 65 20 61 6c 72 65 61 64  or, we're alread
281e0 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  y in error */.  
281f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
28200 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  w);.  sqlite3_fr
28210 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72  ee(pUnused);.  r
28220 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
28230 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
28240 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74  /* simulate mult
28250 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72  iple hosts by cr
28260 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f  eating unique ho
28270 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20  stid file paths 
28280 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68  */.int sqlite3_h
28290 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23  ostid_num = 0;.#
282a0 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50  endif..#define P
282b0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20  ROXY_HOSTIDLEN  
282c0 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66    16  /* conch f
282d0 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67  ile host id leng
282e0 74 68 20 2a 2f 0a 0a 2f 2a 20 67 65 74 20 74 68  th */../* get th
282f0 65 20 68 6f 73 74 20 49 44 20 76 69 61 20 67 65  e host ID via ge
28300 74 68 6f 73 74 75 75 69 64 28 29 2c 20 70 48 6f  thostuuid(), pHo
28310 73 74 49 44 20 6d 75 73 74 20 70 6f 69 6e 74 20  stID must point 
28320 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  to PROXY_HOSTIDL
28330 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20  EN .** bytes of 
28340 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e  writable memory.
28350 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
28360 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 75 6e  roxyGetHostID(un
28370 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 48 6f  signed char *pHo
28380 73 74 49 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f  stID, int *pErro
28390 72 29 7b 0a 20 20 73 74 72 75 63 74 20 74 69 6d  r){.  struct tim
283a0 65 73 70 65 63 20 74 69 6d 65 6f 75 74 20 3d 20  espec timeout = 
283b0 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63  {1, 0}; /* 1 sec
283c0 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 0a 20   timeout */.  . 
283d0 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f   assert(PROXY_HO
283e0 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f  STIDLEN == sizeo
283f0 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65  f(uuid_t));.  me
28400 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c  mset(pHostID, 0,
28410 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
28420 29 3b 0a 20 20 69 66 28 20 67 65 74 68 6f 73 74  );.  if( gethost
28430 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26 74  uuid(pHostID, &t
28440 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20 69  imeout) ){.    i
28450 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a  nt err = errno;.
28460 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 29      if( pError )
28470 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20  {.      *pError 
28480 3d 20 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20  = err;.    }.   
28490 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
284a0 4f 45 52 52 3b 0a 20 20 7d 0a 23 69 66 64 65 66  OERR;.  }.#ifdef
284b0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f   SQLITE_TEST.  /
284c0 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69  * simulate multi
284d0 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65  ple hosts by cre
284e0 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73  ating unique hos
284f0 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a  tid file paths *
28500 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
28510 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29  hostid_num != 0)
28520 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30 5d  {.    pHostID[0]
28530 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74 49   = (char)(pHostI
28540 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73 71  D[0] + (char)(sq
28550 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
28560 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23   & 0xFF));.  }.#
28570 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72  endif.  .  retur
28580 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28590 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  /* The conch fil
285a0 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 68  e contains the h
285b0 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20 61  eader, host id a
285c0 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  nd lock file pat
285d0 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  h. */.#define PR
285e0 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
285f0 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20 68   2   /* 1-byte h
28600 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20 68  eader, 16-byte h
28610 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a  ost id, path */.
28620 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 45  #define PROXY_HE
28630 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20 2f  ADERLEN    1   /
28640 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65 61  * conch file hea
28650 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64  der length */.#d
28660 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54 48  efine PROXY_PATH
28670 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59 5f  INDEX    (PROXY_
28680 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
28690 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66 69  HOSTIDLEN).#defi
286a0 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  ne PROXY_MAXCONC
286b0 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45 41  HLEN  (PROXY_HEA
286c0 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53  DERLEN+PROXY_HOS
286d0 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45  TIDLEN+MAXPATHLE
286e0 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73  N)../* .** Takes
286f0 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66   an open conch f
28700 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65 20  ile, copies the 
28710 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e 65  contents to a ne
28720 77 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e 20  w path and then 
28730 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61 63  moves .** it bac
28740 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63 72  k.  The newly cr
28750 65 61 74 65 64 20 66 69 6c 65 27 73 20 66 69 6c  eated file's fil
28760 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
28770 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0a  assigned to the.
28780 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73 74  ** conch file st
28790 72 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e 61  ructure and fina
287a0 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  lly the original
287b0 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73 63   conch file desc
287c0 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c  riptor is .** cl
287d0 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20 7a  osed.  Returns z
287e0 65 72 6f 20 69 66 20 73 75 63 63 65 73 73 66 75  ero if successfu
287f0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
28800 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68   proxyBreakConch
28810 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
28820 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48  File, uuid_t myH
28830 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c  ostID){.  proxyL
28840 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
28850 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
28860 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
28870 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
28880 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt; .  unixFile 
28890 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74  *conchFile = pCt
288a0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  x->conchFile;.  
288b0 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50 41  char tPath[MAXPA
288c0 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62  THLEN];.  char b
288d0 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
288e0 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63  HLEN];.  char *c
288f0 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  Path = pCtx->con
28900 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73 69  chFilePath;.  si
28910 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20 30  ze_t readLen = 0
28920 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c  ;.  size_t pathL
28930 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65  en = 0;.  char e
28940 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a  rrmsg[64] = "";.
28950 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
28960 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 0a 20   int rc = -1;.. 
28970 20 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65 77   /* create a new
28980 20 70 61 74 68 20 62 79 20 72 65 70 6c 61 63 65   path by replace
28990 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27 2d   the trailing '-
289a0 63 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62 72  conch' with '-br
289b0 65 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65  eak' */.  pathLe
289c0 6e 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61 74  n = strlcpy(tPat
289d0 68 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41 54  h, cPath, MAXPAT
289e0 48 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61 74  HLEN);.  if( pat
289f0 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20  hLen>MAXPATHLEN 
28a00 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20  || pathLen<6 || 
28a10 0a 20 20 20 20 20 28 73 74 72 6c 63 70 79 28 26  .     (strlcpy(&
28a20 74 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d  tPath[pathLen-5]
28a30 2c 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21 3d  , "break", 6) !=
28a40 20 35 29 20 29 7b 0a 20 20 20 20 73 70 72 69 6e   5) ){.    sprin
28a50 74 66 28 65 72 72 6d 73 67 2c 20 22 70 61 74 68  tf(errmsg, "path
28a60 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22   error (len %d)"
28a70 2c 20 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b  , (int)pathLen);
28a80 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
28a90 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f  eaklock;.  }.  /
28aa0 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68  * read the conch
28ab0 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65   content */.  re
28ac0 61 64 4c 65 6e 20 3d 20 70 72 65 61 64 28 63 6f  adLen = pread(co
28ad0 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c  nchFile->h, buf,
28ae0 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
28af0 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65  EN, 0);.  if( re
28b00 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48  adLen<PROXY_PATH
28b10 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 70 72  INDEX ){.    spr
28b20 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 72 65  intf(errmsg, "re
28b30 61 64 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64  ad error (len %d
28b40 29 22 2c 20 28 69 6e 74 29 72 65 61 64 4c 65 6e  )", (int)readLen
28b50 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
28b60 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
28b70 20 2f 2a 20 77 72 69 74 65 20 69 74 20 6f 75 74   /* write it out
28b80 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72   to the temporar
28b90 79 20 62 72 65 61 6b 20 66 69 6c 65 20 2a 2f 0a  y break file */.
28ba0 20 20 66 64 20 3d 20 6f 70 65 6e 28 74 50 61 74    fd = open(tPat
28bb0 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  h, (O_RDWR|O_CRE
28bc0 41 54 7c 4f 5f 45 58 43 4c 29 2c 20 53 51 4c 49  AT|O_EXCL), SQLI
28bd0 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
28be0 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
28bf0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
28c00 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20  sprintf(errmsg, 
28c10 22 63 72 65 61 74 65 20 66 61 69 6c 65 64 20 28  "create failed (
28c20 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  %d)", errno);.  
28c30 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
28c40 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lock;.  }.  if( 
28c50 70 77 72 69 74 65 28 66 64 2c 20 62 75 66 2c 20  pwrite(fd, buf, 
28c60 72 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20 72  readLen, 0) != r
28c70 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73 70  eadLen ){.    sp
28c80 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 77  rintf(errmsg, "w
28c90 72 69 74 65 20 66 61 69 6c 65 64 20 28 25 64 29  rite failed (%d)
28ca0 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
28cb0 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
28cc0 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e  k;.  }.  if( ren
28cd0 61 6d 65 28 74 50 61 74 68 2c 20 63 50 61 74 68  ame(tPath, cPath
28ce0 29 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  ) ){.    sprintf
28cf0 28 65 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65  (errmsg, "rename
28d00 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
28d10 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
28d20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
28d30 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 66   }.  rc = 0;.  f
28d40 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
28d50 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b  broke stale lock
28d60 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74 68   on %s\n", cPath
28d70 29 3b 0a 20 20 63 6c 6f 73 65 28 63 6f 6e 63 68  );.  close(conch
28d80 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 63 6f 6e 63  File->h);.  conc
28d90 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20  hFile->h = fd;. 
28da0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e   conchFile->open
28db0 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c  Flags = O_RDWR |
28dc0 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62   O_CREAT;..end_b
28dd0 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20  reaklock:.  if( 
28de0 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64  rc ){.    if( fd
28df0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c  >=0 ){.      unl
28e00 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20  ink(tPath);.    
28e10 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20    close(fd);.   
28e20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73   }.    fprintf(s
28e30 74 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74  tderr, "failed t
28e40 6f 20 62 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f  o break stale lo
28e50 63 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c  ck on %s, %s\n",
28e60 20 63 50 61 74 68 2c 20 65 72 72 6d 73 67 29 3b   cPath, errmsg);
28e70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28e80 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65  ;.}../* Take the
28e90 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
28ea0 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  on the conch fil
28eb0 65 20 61 6e 64 20 62 72 65 61 6b 20 61 20 73 74  e and break a st
28ec0 61 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  ale lock if the 
28ed0 0a 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61 74 63  .** host id matc
28ee0 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hes..*/.static i
28ef0 6e 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63  nt proxyConchLoc
28f00 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
28f10 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74  e, uuid_t myHost
28f20 49 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  ID, int lockType
28f30 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
28f40 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
28f50 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
28f60 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
28f70 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
28f80 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
28f90 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
28fa0 6e 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  nchFile;.  int r
28fb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
28fc0 20 69 6e 74 20 6e 54 72 69 65 73 20 3d 20 30 3b   int nTries = 0;
28fd0 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
28fe0 65 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b  ec conchModTime;
28ff0 0a 20 20 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  .  .  do {.    r
29000 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
29010 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
29020 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
29030 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65  chFile, lockType
29040 29 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b 2b  );.    nTries ++
29050 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
29060 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
29070 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63     /* If the loc
29080 6b 20 66 61 69 6c 65 64 20 28 62 75 73 79 29 3a  k failed (busy):
29090 0a 20 20 20 20 20 20 20 2a 20 31 73 74 20 74 72  .       * 1st tr
290a0 79 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74  y: get the mod t
290b0 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68  ime of the conch
290c0 2c 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20  , wait 0.5s and 
290d0 74 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20 20  try again. .    
290e0 20 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61     * 2nd try: fa
290f0 69 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69  il if the mod ti
29100 6d 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f  me changed or ho
29110 73 74 20 69 64 20 69 73 20 64 69 66 66 65 72 65  st id is differe
29120 6e 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20 20  nt, wait .      
29130 20 2a 20 20 20 20 20 20 20 20 20 20 20 31 30 20   *           10 
29140 73 65 63 20 61 6e 64 20 74 72 79 20 61 67 61 69  sec and try agai
29150 6e 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20 74  n.       * 3rd t
29160 72 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  ry: break the lo
29170 63 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f  ck unless the mo
29180 64 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e 67  d time has chang
29190 65 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  ed..       */.  
291a0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
291b0 62 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20 66  buf;.      if( f
291c0 73 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  stat(conchFile->
291d0 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20  h, &buf) ){.    
291e0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
291f0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
29200 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
29210 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
29220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
29230 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d       if( nTries=
29240 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
29250 6e 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66  nchModTime = buf
29260 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20  .st_mtimespec;. 
29270 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 35 30         usleep(50
29280 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30  0000); /* wait 0
29290 2e 35 20 73 65 63 20 61 6e 64 20 74 72 79 20 74  .5 sec and try t
292a0 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a  he lock again*/.
292b0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
292c0 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;  .      }..   
292d0 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65     assert( nTrie
292e0 73 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  s>1 );.      if(
292f0 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76   conchModTime.tv
29300 5f 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d  _sec != buf.st_m
29310 74 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20  timespec.tv_sec 
29320 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e  || .         con
29330 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65  chModTime.tv_nse
29340 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d  c != buf.st_mtim
29350 65 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b  espec.tv_nsec ){
29360 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
29370 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
29380 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
29390 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20    if( nTries==2 
293a0 29 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68 61  ){  .        cha
293b0 72 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58  r tBuf[PROXY_MAX
293c0 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20  CONCHLEN];.     
293d0 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 70 72 65     int len = pre
293e0 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ad(conchFile->h,
293f0 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58   tBuf, PROXY_MAX
29400 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20  CONCHLEN, 0);.  
29410 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20        if( len<0 
29420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
29430 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
29440 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
29450 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
29460 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
29470 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
29480 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49   len>PROXY_PATHI
29490 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d 3d  NDEX && tBuf[0]=
294a0 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e  =(char)PROXY_CON
294b0 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20  CHVERSION){.    
294c0 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62        /* don't b
294d0 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66  reak the lock if
294e0 20 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f 65   the host id doe
294f0 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20  sn't match */.  
29500 20 20 20 20 20 20 20 20 69 66 28 20 30 21 3d 6d          if( 0!=m
29510 65 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f 58  emcmp(&tBuf[PROX
29520 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79  Y_HEADERLEN], my
29530 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f  HostID, PROXY_HO
29540 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20  STIDLEN) ){.    
29550 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
29560 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
29570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29580 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
29590 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20   /* don't break 
295a0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72  the lock on shor
295b0 74 20 72 65 61 64 20 6f 72 20 61 20 76 65 72 73  t read or a vers
295c0 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a  ion mismatch */.
295d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
295e0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
295f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29600 75 73 6c 65 65 70 28 31 30 30 30 30 30 30 30 29  usleep(10000000)
29610 3b 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65 63  ; /* wait 10 sec
29620 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63   and try the loc
29630 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20  k again */.     
29640 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20     continue; .  
29650 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
29660 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65     assert( nTrie
29670 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66  s==3 );.      if
29680 28 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43  ( 0==proxyBreakC
29690 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  onchLock(pFile, 
296a0 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20 20  myHostID) ){.   
296b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
296c0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
296d0 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55   lockType==EXCLU
296e0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
296f0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63         rc = conc
29700 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
29710 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
29720 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
29730 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20  SHARED_LOCK);   
29740 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
29750 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 72  }.        if( !r
29760 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
29770 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
29780 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
29790 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
297a0 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65  chFile, lockType
297b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
297c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77     }.    }.  } w
297d0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
297e0 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c  _BUSY && nTries<
297f0 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e  3 );.  .  return
29800 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73   rc;.}../* Takes
29810 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61   the conch by ta
29820 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  king a shared lo
29830 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65 20  ck and read the 
29840 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20  contents conch, 
29850 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20  if .** lockPath 
29860 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
29870 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63   host ID and loc
29880 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74  k file path must
29890 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20   match.  A NULL 
298a0 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61  .** lockPath mea
298b0 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ns that the lock
298c0 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63  Path in the conc
298d0 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  h file will be u
298e0 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68  sed if the .** h
298f0 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f  ost IDs match, o
29900 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74  r a new lock pat
29910 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  h will be genera
29920 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
29930 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65  y .** and writte
29940 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66  n to the conch f
29950 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
29960 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63  nt proxyTakeConc
29970 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  h(unixFile *pFil
29980 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  e){.  proxyLocki
29990 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
299a0 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
299b0 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
299c0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
299d0 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e  .  .  if( pCtx->
299e0 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a  conchHeld!=0 ){.
299f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29a00 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
29a10 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e     unixFile *con
29a20 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
29a30 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75  onchFile;.    uu
29a40 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20  id_t myHostID;. 
29a50 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20     int pError = 
29a60 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61 64  0;.    char read
29a70 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  Buf[PROXY_MAXCON
29a80 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  CHLEN];.    char
29a90 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54   lockPath[MAXPAT
29aa0 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
29ab0 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20  *tempLockPath = 
29ac0 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63  NULL;.    int rc
29ad0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
29ae0 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63    int createConc
29af0 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68  h = 0;.    int h
29b00 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a  ostIdMatch = 0;.
29b10 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20      int readLen 
29b20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79  = 0;.    int try
29b30 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b  OldLockPath = 0;
29b40 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65  .    int forceNe
29b50 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  wLockPath = 0;. 
29b60 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45 34     .    OSTRACE4
29b70 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20  ("TAKECONCH  %d 
29b80 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22  for %s pid=%d\n"
29b90 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
29ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43               (pC
29bb0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
29bc0 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h ? pCtx->lockPr
29bd0 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f  oxyPath : ":auto
29be0 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  :"), getpid());.
29bf0 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47  .    rc = proxyG
29c00 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49  etHostID(myHostI
29c10 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20  D, &pError);.   
29c20 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d   if( (rc&0xff)==
29c30 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
29c40 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
29c50 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b  tErrno = pError;
29c60 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
29c70 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d  takeconch;.    }
29c80 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43  .    rc = proxyC
29c90 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  onchLock(pFile, 
29ca0 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44  myHostID, SHARED
29cb0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
29cc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29cd0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
29ce0 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d  takeconch;.    }
29cf0 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74 68 65  .    /* read the
29d00 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63 68 20   existing conch 
29d10 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61 64  file */.    read
29d20 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65 61  Len = seekAndRea
29d30 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e  d((unixFile*)con
29d40 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61 64 42  chFile, 0, readB
29d50 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
29d60 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28 20  CHLEN);.    if( 
29d70 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20  readLen<0 ){.   
29d80 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a     /* I/O error:
29d90 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62   lastErrno set b
29da0 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f  y seekAndRead */
29db0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
29dc0 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46  stErrno = conchF
29dd0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
29de0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
29df0 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
29e00 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
29e10 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73  econch;.    }els
29e20 65 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28  e if( readLen<=(
29e30 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
29e40 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
29e50 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
29e60 20 20 72 65 61 64 42 75 66 5b 30 5d 21 3d 28 63    readBuf[0]!=(c
29e70 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
29e80 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  ERSION ){.      
29e90 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64 20  /* a short read 
29ea0 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61  or version forma
29eb0 74 20 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e 73  t mismatch means
29ec0 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
29ed0 74 65 20 61 20 6e 65 77 20 0a 20 20 20 20 20 20  te a new .      
29ee0 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a  ** conch file. .
29ef0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
29f00 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a  reateConch = 1;.
29f10 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20      }.    /* if 
29f20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63  the host id matc
29f30 68 65 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  hes and the lock
29f40 20 70 61 74 68 20 61 6c 72 65 61 64 79 20 65 78   path already ex
29f50 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 63  ists in the conc
29f60 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74  h.    ** we'll t
29f70 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  ry to use the pa
29f80 74 68 20 74 68 65 72 65 2c 20 69 66 20 77 65 20  th there, if we 
29f90 63 61 6e 27 74 20 6f 70 65 6e 20 74 68 61 74 20  can't open that 
29fa0 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20  path, we'll .   
29fb0 20 2a 2a 20 72 65 74 72 79 20 77 69 74 68 20 61   ** retry with a
29fc0 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65 72 61   new auto-genera
29fd0 74 65 64 20 70 61 74 68 20 0a 20 20 20 20 2a 2f  ted path .    */
29fe0 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20  .    do { /* in 
29ff0 63 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20  case we need to 
2a000 74 72 79 20 61 67 61 69 6e 20 66 6f 72 20 61 6e  try again for an
2a010 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f   :auto: named lo
2a020 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  ck file */..    
2a030 20 20 69 66 28 20 21 63 72 65 61 74 65 43 6f 6e    if( !createCon
2a040 63 68 20 26 26 20 21 66 6f 72 63 65 4e 65 77 4c  ch && !forceNewL
2a050 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20  ockPath ){.     
2a060 20 20 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d     hostIdMatch =
2a070 20 21 6d 65 6d 63 6d 70 28 26 72 65 61 64 42 75   !memcmp(&readBu
2a080 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  f[PROXY_HEADERLE
2a090 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20  N], myHostID, . 
2a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0c0 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
2a0d0 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66  );.        /* if
2a0e0 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64   the conch has d
2a0f0 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20  ata compare the 
2a100 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20  contents */.    
2a110 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c      if( !pCtx->l
2a120 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
2a130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72            /* for
2a140 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61   auto-named loca
2a150 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73  l lock file, jus
2a160 74 20 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74  t check the host
2a170 20 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20   ID and we'll.  
2a180 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20           ** use 
2a190 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  the local lock f
2a1a0 69 6c 65 20 70 61 74 68 20 74 68 61 74 27 73 20  ile path that's 
2a1b0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 72 65  already in there
2a1c0 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  .           */. 
2a1d0 20 20 20 20 20 20 20 20 20 69 66 28 20 68 6f 73           if( hos
2a1e0 74 49 64 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  tIdMatch ){.    
2a1f0 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20 70          size_t p
2a200 61 74 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65  athLen = (readLe
2a210 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e  n - PROXY_PATHIN
2a220 44 45 58 29 3b 0a 20 20 20 20 20 20 20 20 20 20  DEX);.          
2a230 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69    .            i
2a240 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50  f( pathLen>=MAXP
2a250 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20  ATHLEN ){.      
2a260 20 20 20 20 20 20 20 20 70 61 74 68 4c 65 6e 3d          pathLen=
2a270 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20  MAXPATHLEN-1;.  
2a280 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a290 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6c          memcpy(l
2a2a0 6f 63 6b 50 61 74 68 2c 20 26 72 65 61 64 42 75  ockPath, &readBu
2a2b0 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  f[PROXY_PATHINDE
2a2c0 58 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20  X], pathLen);.  
2a2d0 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 50 61            lockPa
2a2e0 74 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b  th[pathLen] = 0;
2a2f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 6d  .            tem
2a300 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b  pLockPath = lock
2a310 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20  Path;.          
2a320 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68    tryOldLockPath
2a330 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2a340 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f    /* create a co
2a350 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70  py of the lock p
2a360 61 74 68 20 69 66 20 74 68 65 20 63 6f 6e 63 68  ath if the conch
2a370 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20   is taken */.   
2a380 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2a390 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
2a3a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a3b0 20 7d 65 6c 73 65 20 69 66 28 20 68 6f 73 74 49   }else if( hostI
2a3c0 64 4d 61 74 63 68 20 26 26 20 21 73 74 72 6e 63  dMatch && !strnc
2a3d0 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  mp(pCtx->lockPro
2a3e0 78 79 50 61 74 68 2c 20 0a 20 20 20 20 20 20 20  xyPath, .       
2a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a410 20 20 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58     &readBuf[PROX
2a420 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 72 65  Y_PATHINDEX], re
2a430 61 64 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48  adLen-PROXY_PATH
2a440 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 20 20  INDEX) ){.      
2a450 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68 6f 73      /* conch hos
2a460 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74 68 20  t and lock path 
2a470 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
2a480 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
2a490 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20 20 20  conch; .        
2a4a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2a4b0 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65  .      /* if the
2a4c0 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 77 72 69   conch isn't wri
2a4d0 74 61 62 6c 65 20 61 6e 64 20 64 6f 65 73 6e 27  table and doesn'
2a4e0 74 20 6d 61 74 63 68 2c 20 77 65 20 63 61 6e 27  t match, we can'
2a4f0 74 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20 20 20  t take it */.   
2a500 20 20 20 69 66 28 20 28 63 6f 6e 63 68 46 69 6c     if( (conchFil
2a510 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52  e->openFlags&O_R
2a520 44 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20  DWR) == 0 ){.   
2a530 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2a540 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 67  _BUSY;.        g
2a550 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
2a560 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  h;.      }.     
2a570 20 0a 20 20 20 20 20 20 2f 2a 20 65 69 74 68 65   .      /* eithe
2a580 72 20 74 68 65 20 63 6f 6e 63 68 20 64 69 64 6e  r the conch didn
2a590 27 74 20 6d 61 74 63 68 20 6f 72 20 77 65 20 6e  't match or we n
2a5a0 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  eed to create a 
2a5b0 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20  new one */.     
2a5c0 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b   if( !pCtx->lock
2a5d0 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
2a5e0 20 20 20 20 20 70 72 6f 78 79 47 65 74 4c 6f 63       proxyGetLoc
2a5f0 6b 50 61 74 68 28 70 43 74 78 2d 3e 64 62 50 61  kPath(pCtx->dbPa
2a600 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41  th, lockPath, MA
2a610 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20  XPATHLEN);.     
2a620 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20     tempLockPath 
2a630 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20  = lockPath;.    
2a640 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20      /* create a 
2a650 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b  copy of the lock
2a660 20 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69 66 20   path _only_ if 
2a670 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b  the conch is tak
2a680 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  en */.      }.  
2a690 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 75 70      .      /* up
2a6a0 64 61 74 65 20 63 6f 6e 63 68 20 77 69 74 68 20  date conch with 
2a6b0 68 6f 73 74 20 61 6e 64 20 70 61 74 68 20 28 74  host and path (t
2a6c0 68 69 73 20 77 69 6c 6c 20 66 61 69 6c 20 69 66  his will fail if
2a6d0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20   other process. 
2a6e0 20 20 20 20 20 2a 2a 20 68 61 73 20 61 20 73 68       ** has a sh
2a6f0 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65 61 64  ared lock alread
2a700 79 29 2c 20 69 66 20 74 68 65 20 68 6f 73 74 20  y), if the host 
2a710 69 64 20 6d 61 74 63 68 65 73 2c 20 75 73 65 20  id matches, use 
2a720 74 68 65 20 62 69 67 0a 20 20 20 20 20 20 2a 2a  the big.      **
2a730 20 73 74 69 63 6b 2e 0a 20 20 20 20 20 20 2a 2f   stick..      */
2a740 0a 20 20 20 20 20 20 66 75 74 69 6d 65 73 28 63  .      futimes(c
2a750 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c  onchFile->h, NUL
2a760 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 6f  L);.      if( ho
2a770 73 74 49 64 4d 61 74 63 68 20 26 26 20 21 63 72  stIdMatch && !cr
2a780 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20  eateConch ){.   
2a790 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69       if( conchFi
2a7a0 6c 65 2d 3e 70 4c 6f 63 6b 20 26 26 20 63 6f 6e  le->pLock && con
2a7b0 63 68 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63  chFile->pLock->c
2a7c0 6e 74 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  nt>1 ){.        
2a7d0 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69    /* We are tryi
2a7e0 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73  ng for an exclus
2a7f0 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f  ive lock but ano
2a800 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74  ther thread in t
2a810 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 2a  his.           *
2a820 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
2a830 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
2a840 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
2a850 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
2a860 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
2a870 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 20 20        } else {  
2a880 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
2a890 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e     rc = proxyCon
2a8a0 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79  chLock(pFile, my
2a8b0 48 6f 73 74 49 44 2c 20 45 58 43 4c 55 53 49 56  HostID, EXCLUSIV
2a8c0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
2a8d0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
2a8e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e          rc = con
2a8f0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
2a900 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
2a910 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
2a920 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
2a930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a940 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a950 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  K ){.        cha
2a960 72 20 77 72 69 74 65 42 75 66 66 65 72 5b 50 52  r writeBuffer[PR
2a970 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
2a980 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77 72  ;.        int wr
2a990 69 74 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  iteSize = 0;.   
2a9a0 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 77 72       .        wr
2a9b0 69 74 65 42 75 66 66 65 72 5b 30 5d 20 3d 20 28  iteBuffer[0] = (
2a9c0 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48  char)PROXY_CONCH
2a9d0 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20  VERSION;.       
2a9e0 20 6d 65 6d 63 70 79 28 26 77 72 69 74 65 42 75   memcpy(&writeBu
2a9f0 66 66 65 72 5b 50 52 4f 58 59 5f 48 45 41 44 45  ffer[PROXY_HEADE
2aa00 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c  RLEN], myHostID,
2aa10 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
2aa20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2aa30 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
2aa40 74 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  th!=NULL ){.    
2aa50 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 77        strlcpy(&w
2aa60 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59  riteBuffer[PROXY
2aa70 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 43 74  _PATHINDEX], pCt
2aa80 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
2aa90 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
2aaa0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2aab0 20 20 20 20 20 20 20 20 73 74 72 6c 63 70 79 28          strlcpy(
2aac0 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
2aad0 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 74  XY_PATHINDEX], t
2aae0 65 6d 70 4c 6f 63 6b 50 61 74 68 2c 20 4d 41 58  empLockPath, MAX
2aaf0 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
2ab00 20 20 7d 0a 20 20 20 20 20 20 20 20 77 72 69 74    }.        writ
2ab10 65 53 69 7a 65 20 3d 20 50 52 4f 58 59 5f 50 41  eSize = PROXY_PA
2ab20 54 48 49 4e 44 45 58 20 2b 20 73 74 72 6c 65 6e  THINDEX + strlen
2ab30 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52  (&writeBuffer[PR
2ab40 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 29 3b  OXY_PATHINDEX]);
2ab50 0a 20 20 20 20 20 20 20 20 66 74 72 75 6e 63 61  .        ftrunca
2ab60 74 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  te(conchFile->h,
2ab70 20 77 72 69 74 65 53 69 7a 65 29 3b 0a 20 20 20   writeSize);.   
2ab80 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 57 72       rc = unixWr
2ab90 69 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ite((sqlite3_fil
2aba0 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77  e *)conchFile, w
2abb0 72 69 74 65 42 75 66 66 65 72 2c 20 77 72 69 74  riteBuffer, writ
2abc0 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20  eSize, 0);.     
2abd0 20 20 20 66 73 79 6e 63 28 63 6f 6e 63 68 46 69     fsync(conchFi
2abe0 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 20 20  le->h);.        
2abf0 2f 2a 20 49 66 20 77 65 20 63 72 65 61 74 65 64  /* If we created
2ac00 20 61 20 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c   a new conch fil
2ac10 65 20 28 6e 6f 74 20 6a 75 73 74 20 75 70 64 61  e (not just upda
2ac20 74 65 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ted the contents
2ac30 20 6f 66 20 61 20 0a 20 20 20 20 20 20 20 20 20   of a .         
2ac40 2a 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68 20 66  ** valid conch f
2ac50 69 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d 61 74  ile), try to mat
2ac60 63 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  ch the permissio
2ac70 6e 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ns of the databa
2ac80 73 65 20 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a  se .         */.
2ac90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2aca0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 72 65  SQLITE_OK && cre
2acb0 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20  ateConch ){.    
2acc0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
2acd0 74 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20  t buf;.         
2ace0 20 69 6e 74 20 65 72 72 20 3d 20 66 73 74 61 74   int err = fstat
2acf0 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  (pFile->h, &buf)
2ad00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ad10 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  err==0 ){.      
2ad20 20 20 20 20 20 20 6d 6f 64 65 5f 74 20 63 6d 6f        mode_t cmo
2ad30 64 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f 64 65  de = buf.st_mode
2ad40 26 28 53 5f 49 52 55 53 52 7c 53 5f 49 57 55 53  &(S_IRUSR|S_IWUS
2ad50 52 20 7c 20 53 5f 49 52 47 52 50 7c 53 5f 49 57  R | S_IRGRP|S_IW
2ad60 47 52 50 20 7c 0a 20 20 20 20 20 20 20 20 20 20  GRP |.          
2ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 5f                S_
2ad90 49 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29 3b 0a  IROTH|S_IWOTH);.
2ada0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
2adb0 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ry to match the 
2adc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 52 2f  database file R/
2add0 57 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20 69  W permissions, i
2ade0 67 6e 6f 72 65 20 66 61 69 6c 75 72 65 20 2a 2f  gnore failure */
2adf0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ae00 50 52 4f 58 59 5f 44 45 42 55 47 0a 20 20 20 20  PROXY_DEBUG.    
2ae10 20 20 20 20 20 20 20 20 66 63 68 6d 6f 64 28 63          fchmod(c
2ae20 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f  onchFile->h, cmo
2ae30 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  de);.#else.     
2ae40 20 20 20 20 20 20 20 69 66 28 20 66 63 68 6d 6f         if( fchmo
2ae50 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
2ae60 63 6d 6f 64 65 29 21 3d 30 20 29 7b 0a 20 20 20  cmode)!=0 ){.   
2ae70 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63             int c
2ae80 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  ode = errno;.   
2ae90 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
2aea0 74 66 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d  tf(stderr, "fchm
2aeb0 6f 64 20 25 6f 20 46 41 49 4c 45 44 20 77 69 74  od %o FAILED wit
2aec0 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  h %d %s\n",.    
2aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aee0 20 20 63 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73    cmode, code, s
2aef0 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a  trerror(code));.
2af00 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
2af10 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
2af20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
2af30 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 53 55  r, "fchmod %o SU
2af40 43 43 45 44 45 44 5c 6e 22 2c 63 6d 6f 64 65 29  CCEDED\n",cmode)
2af50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2af60 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2af70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2af80 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20   code = errno;. 
2af90 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
2afa0 74 66 28 73 74 64 65 72 72 2c 20 22 53 54 41 54  tf(stderr, "STAT
2afb0 20 46 41 49 4c 45 44 5b 25 64 5d 20 77 69 74 68   FAILED[%d] with
2afc0 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20   %d %s\n", .    
2afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afe0 65 72 72 2c 20 63 6f 64 65 2c 20 73 74 72 65 72  err, code, strer
2aff0 72 6f 72 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64  ror(code));.#end
2b000 69 66 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  if.          }. 
2b010 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2b020 0a 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65  .      conchFile
2b030 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
2b040 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
2b050 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41  *)conchFile, SHA
2b060 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
2b070 20 0a 20 20 20 20 65 6e 64 5f 74 61 6b 65 63 6f   .    end_takeco
2b080 6e 63 68 3a 0a 20 20 20 20 20 20 4f 53 54 52 41  nch:.      OSTRA
2b090 43 45 32 28 22 54 52 41 4e 53 50 52 4f 58 59 3a  CE2("TRANSPROXY:
2b0a0 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22 2c 20 70   CLOSE  %d\n", p
2b0b0 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20  File->h);.      
2b0c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b0d0 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e  K && pFile->open
2b0e0 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20  Flags ){.       
2b0f0 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
2b100 20 29 7b 0a 23 69 66 64 65 66 20 53 54 52 49 43   ){.#ifdef STRIC
2b110 54 5f 43 4c 4f 53 45 5f 45 52 52 4f 52 0a 20 20  T_CLOSE_ERROR.  
2b120 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
2b130 65 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20  e(pFile->h) ){. 
2b140 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
2b150 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
2b160 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rno;.           
2b170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2b180 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20  OERR_CLOSE;.    
2b190 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
2b1a0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70 46          close(pF
2b1b0 69 6c 65 2d 3e 68 29 3b 20 2f 2a 20 73 69 6c 65  ile->h); /* sile
2b1c0 6e 74 6c 79 20 6c 65 61 6b 20 66 64 20 69 66 20  ntly leak fd if 
2b1d0 66 61 69 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  fail */.#endif. 
2b1e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b1f0 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
2b200 20 20 20 20 20 20 20 20 69 6e 74 20 66 64 20 3d          int fd =
2b210 20 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62 50 61   open(pCtx->dbPa
2b220 74 68 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46  th, pFile->openF
2b230 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
2b240 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
2b250 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
2b260 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
2b270 20 20 20 20 20 20 4f 53 54 52 41 43 45 32 28 22        OSTRACE2("
2b280 54 52 41 4e 53 50 52 4f 58 59 3a 20 4f 50 45 4e  TRANSPROXY: OPEN
2b290 20 20 25 64 5c 6e 22 2c 20 66 64 29 3b 0a 20 20    %d\n", fd);.  
2b2a0 20 20 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20        if( fd>=0 
2b2b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
2b2c0 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20  le->h = fd;.    
2b2d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b2e0 20 20 20 20 20 72 63 3d 53 51 4c 49 54 45 5f 43       rc=SQLITE_C
2b2f0 41 4e 54 4f 50 45 4e 3b 20 2f 2a 20 53 51 4c 49  ANTOPEN; /* SQLI
2b300 54 45 5f 42 55 53 59 3f 20 70 72 6f 78 79 54 61  TE_BUSY? proxyTa
2b310 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64 0a 20  keConch called. 
2b320 20 20 20 20 20 20 20 20 20 20 64 75 72 69 6e 67            during
2b330 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20   locking */.    
2b340 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2b350 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b360 54 45 5f 4f 4b 20 26 26 20 21 70 43 74 78 2d 3e  TE_OK && !pCtx->
2b370 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20  lockProxy ){.   
2b380 20 20 20 20 20 63 68 61 72 20 2a 70 61 74 68 20       char *path 
2b390 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3f  = tempLockPath ?
2b3a0 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3a 20   tempLockPath : 
2b3b0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
2b3c0 61 74 68 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ath;.        rc 
2b3d0 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69  = proxyCreateUni
2b3e0 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70 43 74  xFile(path, &pCt
2b3f0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20 31 29  x->lockProxy, 1)
2b400 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2b410 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
2b420 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
2b430 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74  && tryOldLockPat
2b440 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  h ){.          /
2b450 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74 20 63 72  * we couldn't cr
2b460 65 61 74 65 20 74 68 65 20 70 72 6f 78 79 20 6c  eate the proxy l
2b470 6f 63 6b 20 66 69 6c 65 20 77 69 74 68 20 74 68  ock file with th
2b480 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c 65 20  e old lock file 
2b490 70 61 74 68 0a 20 20 20 20 20 20 20 20 20 20 20  path.           
2b4a0 2a 2a 20 73 6f 20 74 72 79 20 61 67 61 69 6e 20  ** so try again 
2b4b0 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e 67 20  via auto-naming 
2b4c0 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  .           */. 
2b4d0 20 20 20 20 20 20 20 20 20 66 6f 72 63 65 4e 65           forceNe
2b4e0 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20  wLockPath = 1;. 
2b4f0 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c           tryOldL
2b500 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20  ockPath = 0;.   
2b510 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2b520 20 2f 2f 20 67 6f 20 62 61 63 6b 20 74 6f 20 74   // go back to t
2b530 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65 20 73  he do {} while s
2b540 74 61 72 74 20 70 6f 69 6e 74 2c 20 74 72 79 20  tart point, try 
2b550 61 67 61 69 6e 0a 20 20 20 20 20 20 20 20 7d 0a  again.        }.
2b560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2b570 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b580 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  ){.        /* Ne
2b590 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70  ed to make a cop
2b5a0 79 20 6f 66 20 70 61 74 68 20 69 66 20 77 65 20  y of path if we 
2b5b0 65 78 74 72 61 63 74 65 64 20 74 68 65 20 76 61  extracted the va
2b5c0 6c 75 65 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  lue.         ** 
2b5d0 66 72 6f 6d 20 74 68 65 20 63 6f 6e 63 68 20 66  from the conch f
2b5e0 69 6c 65 20 6f 72 20 74 68 65 20 70 61 74 68 20  ile or the path 
2b5f0 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e  was allocated on
2b600 20 74 68 65 20 73 74 61 63 6b 0a 20 20 20 20 20   the stack.     
2b610 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2b620 66 28 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20  f( tempLockPath 
2b630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74  ){.          pCt
2b640 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
2b650 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
2b660 75 70 28 30 2c 20 74 65 6d 70 4c 6f 63 6b 50 61  up(0, tempLockPa
2b670 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  th);.          i
2b680 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  f( !pCtx->lockPr
2b690 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
2b6a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2b6b0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2b6c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2b6d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2b6e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b6f0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d  ){.        pCtx-
2b700 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b 0a  >conchHeld = 1;.
2b710 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
2b720 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50   if( pCtx->lockP
2b730 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d  roxy->pMethod ==
2b740 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29   &afpIoMethods )
2b750 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 4c  {.          afpL
2b760 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 61  ockingContext *a
2b770 66 70 43 74 78 3b 0a 20 20 20 20 20 20 20 20 20  fpCtx;.         
2b780 20 61 66 70 43 74 78 20 3d 20 28 61 66 70 4c 6f   afpCtx = (afpLo
2b790 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
2b7a0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e  Ctx->lockProxy->
2b7b0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
2b7c0 20 20 20 20 20 20 20 20 20 20 61 66 70 43 74 78            afpCtx
2b7d0 2d 3e 64 62 50 61 74 68 20 3d 20 70 43 74 78 2d  ->dbPath = pCtx-
2b7e0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a  >lockProxyPath;.
2b7f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b800 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
2b810 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
2b820 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
2b830 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
2b840 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  hFile, NO_LOCK);
2b850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
2b860 53 54 52 41 43 45 33 28 22 54 41 4b 45 43 4f 4e  STRACE3("TAKECON
2b870 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f  CH  %d %s\n", co
2b880 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 72 63 3d 3d  nchFile->h, rc==
2b890 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22  SQLITE_OK?"ok":"
2b8a0 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 20 20  failed");.      
2b8b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2b8c0 20 77 68 69 6c 65 20 28 31 29 3b 20 2f 2a 20 69   while (1); /* i
2b8d0 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74  n case we need t
2b8e0 6f 20 72 65 74 72 79 20 74 68 65 20 3a 61 75 74  o retry the :aut
2b8f0 6f 3a 20 6c 6f 63 6b 20 66 69 6c 65 20 2d 20 77  o: lock file - w
2b900 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 67  e should never g
2b910 65 74 20 68 65 72 65 20 65 78 63 65 70 74 20 76  et here except v
2b920 69 61 20 74 68 65 20 27 63 6f 6e 74 69 6e 75 65  ia the 'continue
2b930 27 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 20 0a  ' call. */.  } .
2b940 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c  }../*.** If pFil
2b950 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f  e holds a lock o
2b960 6e 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  n a conch file, 
2b970 74 68 65 6e 20 72 65 6c 65 61 73 65 20 74 68 61  then release tha
2b980 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t lock..*/.stati
2b990 63 20 69 6e 74 20 70 72 6f 78 79 52 65 6c 65 61  c int proxyRelea
2b9a0 73 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65  seConch(unixFile
2b9b0 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
2b9c0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2b9d0 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f          /* Subro
2b9e0 75 74 69 6e 65 20 72 65 74 75 72 6e 20 63 6f 64  utine return cod
2b9f0 65 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  e */.  proxyLock
2ba00 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
2ba10 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e  ;  /* The lockin
2ba20 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 74 68  g context for th
2ba30 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a  e proxy lock */.
2ba40 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
2ba50 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  hFile;        /*
2ba60 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
2ba70 63 68 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43  ch file */..  pC
2ba80 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
2ba90 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
2baa0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
2bab0 74 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d  t;.  conchFile =
2bac0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
2bad0 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 52 45  ;.  OSTRACE4("RE
2bae0 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 66  LEASECONCH  %d f
2baf0 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  or %s pid=%d\n",
2bb00 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
2bb10 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d            (pCtx-
2bb20 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f  >lockProxyPath ?
2bb30 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
2bb40 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29  Path : ":auto:")
2bb50 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 67 65  , .           ge
2bb60 74 70 69 64 28 29 29 3b 0a 20 20 69 66 28 20 70  tpid());.  if( p
2bb70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30  Ctx->conchHeld>0
2bb80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e   ){.    rc = con
2bb90 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
2bba0 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
2bbb0 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
2bbc0 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  e, NO_LOCK);.  }
2bbd0 0a 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  .  pCtx->conchHe
2bbe0 6c 64 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43  ld = 0;.  OSTRAC
2bbf0 45 33 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48  E3("RELEASECONCH
2bc00 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63    %d %s\n", conc
2bc10 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
2bc20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45       (rc==SQLITE
2bc30 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
2bc40 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
2bc50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
2bc60 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
2bc70 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
2bc80 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e 61  , compute the na
2bc90 6d 65 20 6f 66 20 69 74 73 20 63 6f 6e 63 68 20  me of its conch 
2bca0 66 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74  file..** Store t
2bcb0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d  he conch filenam
2bcc0 65 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  e in memory obta
2bcd0 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
2bce0 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d  3_malloc()..** M
2bcf0 61 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74 68 20  ake *pConchPath 
2bd00 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
2bd10 20 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 53   name.  Return S
2bd20 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
2bd30 65 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  ess.** or SQLITE
2bd40 5f 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65  _NOMEM if unable
2bd50 20 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72   to obtain memor
2bd60 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
2bd70 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
2bd80 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  le for ensuring 
2bd90 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74  that the allocat
2bda0 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61  ed memory.** spa
2bdb0 63 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  ce is eventually
2bdc0 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70   freed..**.** *p
2bdd0 43 6f 6e 63 68 50 61 74 68 20 69 73 20 73 65 74  ConchPath is set
2bde0 20 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65   to NULL if a me
2bdf0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
2be00 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
2be10 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2be20 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68  yCreateConchPath
2be30 6e 61 6d 65 28 63 68 61 72 20 2a 64 62 50 61 74  name(char *dbPat
2be40 68 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68  h, char **pConch
2be50 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Path){.  int i; 
2be60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be70 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2be80 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
2be90 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  len = (int)strle
2bea0 6e 28 64 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65  n(dbPath); /* Le
2beb0 6e 67 74 68 20 6f 66 20 64 61 74 61 62 61 73 65  ngth of database
2bec0 20 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61   filename - dbPa
2bed0 74 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f  th */.  char *co
2bee0 6e 63 68 50 61 74 68 3b 20 20 20 20 20 20 20 20  nchPath;        
2bef0 20 20 20 20 20 20 2f 2a 20 62 75 66 66 65 72 20        /* buffer 
2bf00 69 6e 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73  in which to cons
2bf10 74 72 75 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65  truct conch name
2bf20 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
2bf30 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
2bf40 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20   conch filename 
2bf50 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
2bf60 68 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20  he name to.  ** 
2bf70 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
2bf80 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
2bf90 65 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a  e file. */  .  *
2bfa0 70 43 6f 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e  pConchPath = con
2bfb0 63 68 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a  chPath = (char *
2bfc0 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
2bfd0 6c 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66 28 20  len + 8);.  if( 
2bfe0 63 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a  conchPath==0 ){.
2bff0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c000 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
2c010 65 6d 63 70 79 28 63 6f 6e 63 68 50 61 74 68 2c  emcpy(conchPath,
2c020 20 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b   dbPath, len+1);
2c030 0a 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73  .  .  /* now ins
2c040 65 72 74 20 61 20 22 2e 22 20 62 65 66 6f 72 65  ert a "." before
2c050 20 74 68 65 20 6c 61 73 74 20 2f 20 63 68 61 72   the last / char
2c060 61 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20  acter */.  for( 
2c070 69 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b  i=(len-1); i>=0;
2c080 20 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20   i-- ){.    if( 
2c090 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f  conchPath[i]=='/
2c0a0 27 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  ' ){.      i++;.
2c0b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c0c0 20 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61   }.  }.  conchPa
2c0d0 74 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69  th[i]='.';.  whi
2c0e0 6c 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20  le ( i<len ){.  
2c0f0 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d    conchPath[i+1]
2c100 3d 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20  =dbPath[i];.    
2c110 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61  i++;.  }..  /* a
2c120 70 70 65 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63  ppend the "-conc
2c130 68 22 20 73 75 66 66 69 78 20 74 6f 20 74 68 65  h" suffix to the
2c140 20 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70   file */.  memcp
2c150 79 28 26 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31  y(&conchPath[i+1
2c160 5d 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b  ], "-conch", 7);
2c170 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29  .  assert( (int)
2c180 73 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68  strlen(conchPath
2c190 29 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20  ) == len+7 );.. 
2c1a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c1b0 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20  K;.}.../* Takes 
2c1c0 61 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72  a fully configur
2c1d0 65 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ed proxy locking
2c1e0 2d 73 74 79 6c 65 20 75 6e 69 78 20 66 69 6c 65  -style unix file
2c1f0 20 61 6e 64 20 73 77 69 74 63 68 65 73 0a 2a 2a   and switches.**
2c200 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20   the local lock 
2c210 66 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74  file path .*/.st
2c220 61 74 69 63 20 69 6e 74 20 73 77 69 74 63 68 4c  atic int switchL
2c230 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 75 6e 69  ockProxyPath(uni
2c240 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f  xFile *pFile, co
2c250 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20  nst char *path) 
2c260 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
2c270 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
2c280 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
2c290 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  text*)pFile->loc
2c2a0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63  kingContext;.  c
2c2b0 68 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70  har *oldPath = p
2c2c0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
2c2d0 74 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  th;.  int rc = S
2c2e0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
2c2f0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
2c300 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  !=NO_LOCK ){.   
2c310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
2c320 55 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a  USY;.  }  ..  /*
2c330 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 69   nothing to do i
2c340 66 20 74 68 65 20 70 61 74 68 20 69 73 20 4e 55  f the path is NU
2c350 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61  LL, :auto: or ma
2c360 74 63 68 65 73 20 74 68 65 20 65 78 69 73 74 69  tches the existi
2c370 6e 67 20 70 61 74 68 20 2a 2f 0a 20 20 69 66 28  ng path */.  if(
2c380 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30   !path || path[0
2c390 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63  ]=='\0' || !strc
2c3a0 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a  mp(path, ":auto:
2c3b0 22 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61  ") ||.    (oldPa
2c3c0 74 68 20 26 26 20 21 73 74 72 6e 63 6d 70 28 6f  th && !strncmp(o
2c3d0 6c 64 50 61 74 68 2c 20 70 61 74 68 2c 20 4d 41  ldPath, path, MA
2c3e0 58 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20  XPATHLEN)) ){.  
2c3f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c400 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2c410 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
2c420 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
2c430 6b 50 72 6f 78 79 3b 0a 20 20 20 20 70 43 74 78  kProxy;.    pCtx
2c440 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c  ->lockProxy=NULL
2c450 3b 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63  ;.    pCtx->conc
2c460 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69  hHeld = 0;.    i
2c470 66 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55  f( lockProxy!=NU
2c480 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c  LL ){.      rc=l
2c490 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f  ockProxy->pMetho
2c4a0 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74  d->xClose((sqlit
2c4b0 65 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72  e3_file *)lockPr
2c4c0 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  oxy);.      if( 
2c4d0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2c4e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2c4f0 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20  ee(lockProxy);. 
2c500 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2c510 5f 66 72 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a  _free(oldPath);.
2c520 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
2c530 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65  oxyPath = sqlite
2c540 33 44 62 53 74 72 44 75 70 28 30 2c 20 70 61 74  3DbStrDup(0, pat
2c550 68 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74  h);.  }.  .  ret
2c560 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2c570 20 70 46 69 6c 65 20 69 73 20 61 20 66 69 6c 65   pFile is a file
2c580 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f   that has been o
2c590 70 65 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72  pened by a prior
2c5a0 20 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62   xOpen call.  db
2c5b0 50 61 74 68 0a 2a 2a 20 69 73 20 61 20 73 74 72  Path.** is a str
2c5c0 69 6e 67 20 62 75 66 66 65 72 20 61 74 20 6c 65  ing buffer at le
2c5d0 61 73 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31  ast MAXPATHLEN+1
2c5e0 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 73   characters in s
2c5f0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ize..**.** This 
2c600 72 6f 75 74 69 6e 65 20 66 69 6e 64 20 74 68 65  routine find the
2c610 20 66 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69   filename associ
2c620 61 74 65 64 20 77 69 74 68 20 70 46 69 6c 65 20  ated with pFile 
2c630 61 6e 64 20 77 72 69 74 65 73 20 69 74 0a 2a 2a  and writes it.**
2c640 20 69 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a   int dbPath..*/.
2c650 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2c660 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78  GetDbPathForUnix
2c670 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
2c680 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61  File, char *dbPa
2c690 74 68 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  th){.#if defined
2c6a0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 69 66  (__APPLE__).  if
2c6b0 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
2c6c0 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
2c6d0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70 20  s ){.    /* afp 
2c6e0 73 74 79 6c 65 20 6b 65 65 70 73 20 61 20 72 65  style keeps a re
2c6f0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 64  ference to the d
2c700 62 20 70 61 74 68 20 69 6e 20 74 68 65 20 66 69  b path in the fi
2c710 6c 65 50 61 74 68 20 66 69 65 6c 64 20 0a 20 20  lePath field .  
2c720 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 75    ** of the stru
2c730 63 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ct */.    assert
2c740 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63  ( (int)strlen((c
2c750 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  har*)pFile->lock
2c760 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58  ingContext)<=MAX
2c770 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73  PATHLEN );.    s
2c780 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28  trlcpy(dbPath, (
2c790 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
2c7a0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
2c7b0 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50  ingContext)->dbP
2c7c0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
2c7d0 3b 0a 20 20 7d 20 65 6c 73 65 0a 23 65 6e 64 69  ;.  } else.#endi
2c7e0 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  f.  if( pFile->p
2c7f0 4d 65 74 68 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f  Method == &dotlo
2c800 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  ckIoMethods ){. 
2c810 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20 73     /* dot lock s
2c820 74 79 6c 65 20 75 73 65 73 20 74 68 65 20 6c 6f  tyle uses the lo
2c830 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f  cking context to
2c840 20 73 74 6f 72 65 20 74 68 65 20 64 6f 74 20 6c   store the dot l
2c850 6f 63 6b 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ock.    ** file 
2c860 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20  path */.    int 
2c870 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68  len = strlen((ch
2c880 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
2c890 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20 73 74  ingContext) - st
2c8a0 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55 46  rlen(DOTLOCK_SUF
2c8b0 46 49 58 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  FIX);.    memcpy
2c8c0 28 64 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a  (dbPath, (char *
2c8d0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
2c8e0 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20 31 29  ontext, len + 1)
2c8f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
2c900 2a 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 79 6c  * all other styl
2c910 65 73 20 75 73 65 20 74 68 65 20 6c 6f 63 6b 69  es use the locki
2c920 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74  ng context to st
2c930 6f 72 65 20 74 68 65 20 64 62 20 66 69 6c 65 20  ore the db file 
2c940 70 61 74 68 20 2a 2f 0a 20 20 20 20 61 73 73 65  path */.    asse
2c950 72 74 28 20 73 74 72 6c 65 6e 28 28 63 68 61 72  rt( strlen((char
2c960 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
2c970 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54  Context)<=MAXPAT
2c980 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c  HLEN );.    strl
2c990 63 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61  cpy(dbPath, (cha
2c9a0 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
2c9b0 6e 67 43 6f 6e 74 65 78 74 2c 20 4d 41 58 50 41  ngContext, MAXPA
2c9c0 54 48 4c 45 4e 29 3b 0a 20 20 7d 0a 20 20 72 65  THLEN);.  }.  re
2c9d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c9e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20 61  }../*.** Takes a
2c9f0 6e 20 61 6c 72 65 61 64 79 20 66 69 6c 6c 65 64  n already filled
2ca00 20 69 6e 20 75 6e 69 78 20 66 69 6c 65 20 61 6e   in unix file an
2ca10 64 20 61 6c 74 65 72 73 20 69 74 20 73 6f 20 61  d alters it so a
2ca20 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  ll file locking 
2ca30 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 70 65 72 66  .** will be perf
2ca40 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63  ormed on the loc
2ca50 61 6c 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  al proxy lock fi
2ca60 6c 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  le.  The followi
2ca70 6e 67 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72 65  ng fields.** are
2ca80 20 70 72 65 73 65 72 76 65 64 20 69 6e 20 74 68   preserved in th
2ca90 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
2caa0 74 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63  t so that they c
2cab0 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 61  an be restored a
2cac0 6e 64 20 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20  nd .** the unix 
2cad0 73 74 72 75 63 74 75 72 65 20 70 72 6f 70 65 72  structure proper
2cae0 6c 79 20 63 6c 65 61 6e 65 64 20 75 70 20 61 74  ly cleaned up at
2caf0 20 63 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a 20   close time:.** 
2cb00 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78   ->lockingContex
2cb10 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 0a  t.**  ->pMethod.
2cb20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
2cb30 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
2cb40 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
2cb50 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  File, const char
2cb60 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78   *path) {.  prox
2cb70 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2cb80 2a 70 43 74 78 3b 0a 20 20 63 68 61 72 20 64 62  *pCtx;.  char db
2cb90 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b  Path[MAXPATHLEN+
2cba0 31 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  1];       /* Nam
2cbb0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2cbc0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  e file */.  char
2cbd0 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b   *lockPath=NULL;
2cbe0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2cbf0 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20  TE_OK;.  .  if( 
2cc00 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
2cc10 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
2cc20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
2cc30 53 59 3b 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47  SY;.  }.  proxyG
2cc40 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46  etDbPathForUnixF
2cc50 69 6c 65 28 70 46 69 6c 65 2c 20 64 62 50 61 74  ile(pFile, dbPat
2cc60 68 29 3b 0a 20 20 69 66 28 20 21 70 61 74 68 20  h);.  if( !path 
2cc70 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27  || path[0]=='\0'
2cc80 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68   || !strcmp(path
2cc90 2c 20 22 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20  , ":auto:") ){. 
2cca0 20 20 20 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c     lockPath=NULL
2ccb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c  ;.  }else{.    l
2ccc0 6f 63 6b 50 61 74 68 3d 28 63 68 61 72 20 2a 29  ockPath=(char *)
2ccd0 70 61 74 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f  path;.  }.  .  O
2cce0 53 54 52 41 43 45 34 28 22 54 52 41 4e 53 50 52  STRACE4("TRANSPR
2ccf0 4f 58 59 20 20 25 64 20 66 6f 72 20 25 73 20 70  OXY  %d for %s p
2cd00 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
2cd10 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
2cd20 6c 6f 63 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50  lockPath ? lockP
2cd30 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c  ath : ":auto:"),
2cd40 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 70   getpid());..  p
2cd50 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ctx = sqlite3_ma
2cd60 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
2cd70 74 78 29 20 29 3b 0a 20 20 69 66 28 20 70 43 74  tx) );.  if( pCt
2cd80 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  x==0 ){.    retu
2cd90 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2cda0 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43  .  }.  memset(pC
2cdb0 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  tx, 0, sizeof(*p
2cdc0 43 74 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70  Ctx));..  rc = p
2cdd0 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50  roxyCreateConchP
2cde0 61 74 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20  athname(dbPath, 
2cdf0 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  &pCtx->conchFile
2ce00 50 61 74 68 29 3b 0a 20 20 69 66 28 20 72 63 3d  Path);.  if( rc=
2ce10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ce20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61    rc = proxyCrea
2ce30 74 65 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d  teUnixFile(pCtx-
2ce40 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20  >conchFilePath, 
2ce50 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  &pCtx->conchFile
2ce60 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
2ce70 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
2ce80 4e 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f 70  N && ((pFile->op
2ce90 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20  enFlags&O_RDWR) 
2cea0 3d 3d 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f  == 0) ){.      /
2ceb0 2a 20 69 66 20 28 61 29 20 74 68 65 20 6f 70 65  * if (a) the ope
2cec0 6e 20 66 6c 61 67 73 20 61 72 65 20 6e 6f 74 20  n flags are not 
2ced0 4f 5f 52 44 57 52 2c 20 28 62 29 20 74 68 65 20  O_RDWR, (b) the 
2cee0 63 6f 6e 63 68 20 69 73 6e 27 74 20 74 68 65 72  conch isn't ther
2cef0 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  e, and.      ** 
2cf00 28 63 29 20 74 68 65 20 66 69 6c 65 20 73 79 73  (c) the file sys
2cf10 74 65 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  tem is read-only
2cf20 2c 20 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e 6f  , then enable no
2cf30 2d 6c 6f 63 6b 69 6e 67 20 61 63 63 65 73 73 2e  -locking access.
2cf40 0a 20 20 20 20 20 20 2a 2a 20 55 67 68 2c 20 73  .      ** Ugh, s
2cf50 69 6e 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30  ince O_RDONLY==0
2cf60 78 30 30 30 30 20 77 65 20 74 65 73 74 20 66 6f  x0000 we test fo
2cf70 72 20 21 4f 5f 52 44 57 52 20 73 69 6e 63 65 20  r !O_RDWR since 
2cf80 75 6e 69 78 4f 70 65 6e 20 61 73 73 65 72 74 73  unixOpen asserts
2cf90 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f  .      ** that o
2cfa0 70 65 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68 61  penFlags will ha
2cfb0 76 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f  ve only one of O
2cfc0 5f 52 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44 57  _RDONLY or O_RDW
2cfd0 52 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  R..      */.    
2cfe0 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
2cff0 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74  fsInfo;.      st
2d000 72 75 63 74 20 73 74 61 74 20 63 6f 6e 63 68 49  ruct stat conchI
2d010 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 67  nfo;.      int g
2d020 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a  oLockless = 0;..
2d030 20 20 20 20 20 20 69 66 28 20 73 74 61 74 28 70        if( stat(p
2d040 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
2d050 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20  th, &conchInfo) 
2d060 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20  == -1 ) {.      
2d070 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
2d080 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  o;.        if( (
2d090 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20  err==ENOENT) && 
2d0a0 28 73 74 61 74 66 73 28 64 62 50 61 74 68 2c 20  (statfs(dbPath, 
2d0b0 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20  &fsInfo) != -1) 
2d0c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 4c  ){.          goL
2d0d0 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e 66  ockless = (fsInf
2d0e0 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44  o.f_flags&MNT_RD
2d0f0 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f  ONLY) == MNT_RDO
2d100 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  NLY;.        }. 
2d110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2d120 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20   goLockless ){. 
2d130 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e         pCtx->con
2d140 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20  chHeld = -1; /* 
2d150 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f  read only FS/ lo
2d160 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20  ckless */.      
2d170 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2d180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2d190 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2d1a0 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 50  LITE_OK && lockP
2d1b0 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74 78 2d  ath ){.    pCtx-
2d1c0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d  >lockProxyPath =
2d1d0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
2d1e0 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a 20  (0, lockPath);. 
2d1f0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
2d200 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
2d210 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 73 71  Ctx->dbPath = sq
2d220 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
2d230 20 64 62 50 61 74 68 29 3b 0a 20 20 20 20 69 66   dbPath);.    if
2d240 28 20 70 43 74 78 2d 3e 64 62 50 61 74 68 3d 3d  ( pCtx->dbPath==
2d250 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63  NULL ){.      rc
2d260 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2d270 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2d280 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2d290 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d 65 6d  {.    /* all mem
2d2a0 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ory is allocated
2d2b0 2c 20 70 72 6f 78 79 73 20 61 72 65 20 63 72 65  , proxys are cre
2d2c0 61 74 65 64 20 61 6e 64 20 61 73 73 69 67 6e 65  ated and assigne
2d2d0 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69 74 63  d, .    ** switc
2d2e0 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  h the locking co
2d2f0 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f  ntext and pMetho
2d300 64 20 74 68 65 6e 20 72 65 74 75 72 6e 2e 0a 20  d then return.. 
2d310 20 20 20 2a 2f 0a 20 20 20 20 70 43 74 78 2d 3e     */.    pCtx->
2d320 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oldLockingContex
2d330 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t = pFile->locki
2d340 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70  ngContext;.    p
2d350 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
2d360 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20 20 20  text = pCtx;.   
2d370 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f   pCtx->pOldMetho
2d380 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  d = pFile->pMeth
2d390 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  od;.    pFile->p
2d3a0 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78 79 49  Method = &proxyI
2d3b0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
2d3c0 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  e{.    if( pCtx-
2d3d0 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20 0a 20  >conchFile ){ . 
2d3e0 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68       pCtx->conch
2d3f0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2d400 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
2d410 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63  ile *)pCtx->conc
2d420 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71  hFile);.      sq
2d430 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
2d440 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20  >conchFile);.   
2d450 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
2d460 72 65 65 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  ree(pCtx->lockPr
2d470 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73 71  oxyPath);.    sq
2d480 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
2d490 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b  >conchFilePath);
2d4a0 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72   .    sqlite3_fr
2d4b0 65 65 28 70 43 74 78 29 3b 0a 20 20 7d 0a 20 20  ee(pCtx);.  }.  
2d4c0 4f 53 54 52 41 43 45 33 28 22 54 52 41 4e 53 50  OSTRACE3("TRANSP
2d4d0 52 4f 58 59 20 20 25 64 20 25 73 5c 6e 22 2c 20  ROXY  %d %s\n", 
2d4e0 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
2d4f0 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45       (rc==SQLITE
2d500 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
2d510 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
2d520 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2d530 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 6e  This routine han
2d540 64 6c 65 73 20 73 71 6c 69 74 65 33 5f 66 69 6c  dles sqlite3_fil
2d550 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 63 61 6c 6c  e_control() call
2d560 73 20 74 68 61 74 20 61 72 65 20 73 70 65 63 69  s that are speci
2d570 66 69 63 0a 2a 2a 20 74 6f 20 70 72 6f 78 79 20  fic.** to proxy 
2d580 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  locking..*/.stat
2d590 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65  ic int proxyFile
2d5a0 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
2d5b0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
2d5c0 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
2d5d0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
2d5e0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47     case SQLITE_G
2d5f0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
2d600 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69  : {.      unixFi
2d610 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
2d620 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20  xFile*)id;.     
2d630 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74   if( pFile->pMet
2d640 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d  hod == &proxyIoM
2d650 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
2d660 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
2d670 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
2d680 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2d690 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  xt*)pFile->locki
2d6a0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  ngContext;.     
2d6b0 20 20 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63     proxyTakeConc
2d6c0 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  h(pFile);.      
2d6d0 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b    if( pCtx->lock
2d6e0 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
2d6f0 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63         *(const c
2d700 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 70 43  har **)pArg = pC
2d710 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
2d720 68 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  h;.        }else
2d730 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f  {.          *(co
2d740 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67  nst char **)pArg
2d750 20 3d 20 22 3a 61 75 74 6f 3a 20 28 6e 6f 74 20   = ":auto: (not 
2d760 68 65 6c 64 29 22 3b 0a 20 20 20 20 20 20 20 20  held)";.        
2d770 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  }.      } else {
2d780 0a 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74  .        *(const
2d790 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20   char **)pArg = 
2d7a0 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NULL;.      }.  
2d7b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d7c0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
2d7d0 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f  case SQLITE_SET_
2d7e0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
2d7f0 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
2d800 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
2d810 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 6e  le*)id;.      in
2d820 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2d830 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 50 72  ;.      int isPr
2d840 6f 78 79 53 74 79 6c 65 20 3d 20 28 70 46 69 6c  oxyStyle = (pFil
2d850 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70  e->pMethod == &p
2d860 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 29 3b 0a  roxyIoMethods);.
2d870 20 20 20 20 20 20 69 66 28 20 70 41 72 67 3d 3d        if( pArg==
2d880 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e 73 74 20 63  NULL || (const c
2d890 68 61 72 20 2a 29 70 41 72 67 3d 3d 30 20 29 7b  har *)pArg==0 ){
2d8a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 50  .        if( isP
2d8b0 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20  roxyStyle ){.   
2d8c0 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f         /* turn o
2d8d0 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ff proxy locking
2d8e0 20 2d 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64   - not supported
2d8f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
2d900 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   = SQLITE_ERROR 
2d910 2f 2a 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  /*SQLITE_PROTOCO
2d920 4c 3f 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  L? SQLITE_MISUSE
2d930 3f 2a 2f 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ?*/;.        }el
2d940 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2d950 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20   turn off proxy 
2d960 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c 72 65 61 64  locking - alread
2d970 79 20 6f 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f 0a  y off - NOOP */.
2d980 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2d990 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2d9a0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
2d9b0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
2d9c0 68 61 72 20 2a 70 72 6f 78 79 50 61 74 68 20 3d  har *proxyPath =
2d9d0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
2d9e0 41 72 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Arg;.        if(
2d9f0 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b   isProxyStyle ){
2da00 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 78 79  .          proxy
2da10 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2da20 70 43 74 78 20 3d 20 0a 20 20 20 20 20 20 20 20  pCtx = .        
2da30 20 20 20 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e      (proxyLockin
2da40 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d  gContext*)pFile-
2da50 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
2da60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2da70 73 74 72 63 6d 70 28 70 41 72 67 2c 20 22 3a 61  strcmp(pArg, ":a
2da80 75 74 6f 3a 22 29 20 0a 20 20 20 20 20 20 20 20  uto:") .        
2da90 20 20 20 7c 7c 20 28 70 43 74 78 2d 3e 6c 6f 63     || (pCtx->loc
2daa0 6b 50 72 6f 78 79 50 61 74 68 20 26 26 0a 20 20  kProxyPath &&.  
2dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 21 73 74               !st
2dac0 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b  rncmp(pCtx->lock
2dad0 50 72 6f 78 79 50 61 74 68 2c 20 70 72 6f 78 79  ProxyPath, proxy
2dae0 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
2daf0 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  )).          ){.
2db00 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2db10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2db20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2db30 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 77           rc = sw
2db40 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74  itchLockProxyPat
2db50 68 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61  h(pFile, proxyPa
2db60 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  th);.          }
2db70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2db80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72            /* tur
2db90 6e 20 6f 6e 20 70 72 6f 78 79 20 66 69 6c 65 20  n on proxy file 
2dba0 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20  locking */.     
2dbb0 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54       rc = proxyT
2dbc0 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
2dbd0 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74  (pFile, proxyPat
2dbe0 68 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  h);.        }.  
2dbf0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2dc00 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2dc10 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
2dc20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20    assert( 0 );  
2dc30 2f 2a 20 54 68 65 20 63 61 6c 6c 20 61 73 73 75  /* The call assu
2dc40 72 65 73 20 74 68 61 74 20 6f 6e 6c 79 20 76 61  res that only va
2dc50 6c 69 64 20 6f 70 63 6f 64 65 73 20 61 72 65 20  lid opcodes are 
2dc60 73 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  sent */.    }.  
2dc70 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44  }.  /*NOTREACHED
2dc80 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  */.  return SQLI
2dc90 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
2dca0 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 64  ** Within this d
2dcb0 69 76 69 73 69 6f 6e 20 28 74 68 65 20 70 72 6f  ivision (the pro
2dcc0 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 69 6d  xying locking im
2dcd0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 20 74 68  plementation) th
2dce0 65 20 70 72 6f 63 65 64 75 72 65 73 0a 2a 2a 20  e procedures.** 
2dcf0 61 62 6f 76 65 20 74 68 69 73 20 70 6f 69 6e 74  above this point
2dd00 20 61 72 65 20 61 6c 6c 20 75 74 69 6c 69 74 69   are all utiliti
2dd10 65 73 2e 20 20 54 68 65 20 6c 6f 63 6b 2d 72 65  es.  The lock-re
2dd20 6c 61 74 65 64 20 6d 65 74 68 6f 64 73 20 6f 66  lated methods of
2dd30 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 2d 6c 6f   the.** proxy-lo
2dd40 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 69 6f  cking sqlite3_io
2dd50 5f 6d 65 74 68 6f 64 20 6f 62 6a 65 63 74 20 66  _method object f
2dd60 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a  ollow..*/.../*.*
2dd70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
2dd80 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
2dd90 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
2dda0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
2ddb0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
2ddc0 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
2ddd0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
2dde0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
2ddf0 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
2de00 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
2de10 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
2de20 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
2de30 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
2de40 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
2de50 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
2de60 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
2de70 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
2de80 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
2de90 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
2dea0 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52   int proxyCheckR
2deb0 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
2dec0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
2ded0 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
2dee0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
2def0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
2df00 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78  .  int rc = prox
2df10 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
2df20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2df30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72  ITE_OK ){.    pr
2df40 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2df50 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
2df60 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2df70 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
2df80 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20  ontext;.    if( 
2df90 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e  pCtx->conchHeld>
2dfa0 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  0 ){.      unixF
2dfb0 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74  ile *proxy = pCt
2dfc0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
2dfd0 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79      return proxy
2dfe0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 68 65 63  ->pMethod->xChec
2dff0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 28 73  kReservedLock((s
2e000 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f  qlite3_file*)pro
2e010 78 79 2c 20 70 52 65 73 4f 75 74 29 3b 0a 20 20  xy, pResOut);.  
2e020 20 20 7d 65 6c 73 65 7b 20 2f 2a 20 63 6f 6e 63    }else{ /* conc
2e030 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63  hHeld < 0 is loc
2e040 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 70  kless */.      p
2e050 52 65 73 4f 75 74 3d 30 3b 0a 20 20 20 20 7d 0a  ResOut=0;.    }.
2e060 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2e070 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
2e080 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
2e090 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
2e0a0 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
2e0b0 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
2e0c0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
2e0d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
2e0e0 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
2e0f0 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
2e100 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
2e110 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
2e120 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
2e130 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
2e140 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
2e150 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
2e160 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
2e170 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
2e180 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
2e190 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
2e1a0 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
2e1b0 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
2e1c0 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
2e1d0 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
2e1e0 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
2e1f0 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
2e200 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
2e210 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
2e220 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
2e230 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
2e240 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
2e250 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
2e260 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
2e270 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
2e280 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
2e290 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
2e2a0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
2e2b0 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
2e2c0 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
2e2d0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
2e2e0 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
2e2f0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
2e300 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
2e310 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
2e320 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
2e330 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
2e340 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
2e350 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
2e360 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
2e370 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
2e380 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
2e390 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
2e3a0 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69  t proxyLock(sqli
2e3b0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
2e3c0 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
2e3d0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
2e3e0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
2e3f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78  .  int rc = prox
2e400 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
2e410 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2e420 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72  ITE_OK ){.    pr
2e430 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2e440 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
2e450 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2e460 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
2e470 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20  ontext;.    if( 
2e480 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e  pCtx->conchHeld>
2e490 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  0 ){.      unixF
2e4a0 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74  ile *proxy = pCt
2e4b0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
2e4c0 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e      rc = proxy->
2e4d0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
2e4e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72  sqlite3_file*)pr
2e4f0 6f 78 79 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  oxy, locktype);.
2e500 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
2e510 6b 74 79 70 65 20 3d 20 70 72 6f 78 79 2d 3e 6c  ktype = proxy->l
2e520 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c  ocktype;.    }el
2e530 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e  se{.      /* con
2e540 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f  chHeld < 0 is lo
2e550 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a  ckless */.    }.
2e560 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2e570 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  .}.../*.** Lower
2e580 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
2e590 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
2e5a0 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c  iptor pFile to l
2e5b0 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
2e5c0 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
2e5d0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
2e5e0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
2e5f0 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
2e600 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
2e610 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
2e620 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
2e630 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
2e640 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
2e650 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
2e660 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
2e670 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2e680 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  xyUnlock(sqlite3
2e690 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
2e6a0 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69  ocktype) {.  uni
2e6b0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
2e6c0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
2e6d0 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61  int rc = proxyTa
2e6e0 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  keConch(pFile);.
2e6f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e700 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79  _OK ){.    proxy
2e710 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2e720 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
2e730 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
2e740 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
2e750 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ext;.    if( pCt
2e760 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29  x->conchHeld>0 )
2e770 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  {.      unixFile
2e780 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e   *proxy = pCtx->
2e790 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20  lockProxy;.     
2e7a0 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65   rc = proxy->pMe
2e7b0 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73  thod->xUnlock((s
2e7c0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f  qlite3_file*)pro
2e7d0 78 79 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  xy, locktype);. 
2e7e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
2e7f0 74 79 70 65 20 3d 20 70 72 6f 78 79 2d 3e 6c 6f  type = proxy->lo
2e800 63 6b 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73  cktype;.    }els
2e810 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63  e{.      /* conc
2e820 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63  hHeld < 0 is loc
2e830 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  kless */.    }. 
2e840 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2e850 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
2e860 20 66 69 6c 65 20 74 68 61 74 20 75 73 65 73 20   file that uses 
2e870 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a  proxy locks..*/.
2e880 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2e890 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
2e8a0 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
2e8b0 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
2e8c0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
2e8d0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 70  xFile*)id;.    p
2e8e0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2e8f0 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
2e900 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2e910 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
2e920 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69  Context;.    uni
2e930 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
2e940 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
2e950 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  xy;.    unixFile
2e960 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
2e970 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
2e980 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
2e990 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 20 20  TE_OK;.    .    
2e9a0 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20 29 7b  if( lockProxy ){
2e9b0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  .      rc = lock
2e9c0 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  Proxy->pMethod->
2e9d0 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
2e9e0 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79  _file*)lockProxy
2e9f0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
2ea00 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2ea10 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d  n rc;.      rc =
2ea20 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74   lockProxy->pMet
2ea30 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
2ea40 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50  ite3_file*)lockP
2ea50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28  roxy);.      if(
2ea60 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2ea70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2ea80 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a  ree(lockProxy);.
2ea90 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b        pCtx->lock
2eaa0 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20 20 7d  Proxy = 0;.    }
2eab0 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69  .    if( conchFi
2eac0 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
2ead0 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
2eae0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2eaf0 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63  proxyReleaseConc
2eb00 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  h(pFile);.      
2eb10 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2eb20 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2eb30 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
2eb40 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  le->pMethod->xCl
2eb50 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
2eb60 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  e*)conchFile);. 
2eb70 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2eb80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
2eb90 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f 6e 63  qlite3_free(conc
2eba0 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  hFile);.    }.  
2ebb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2ebc0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
2ebd0 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
2ebe0 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63  _free(pCtx->conc
2ebf0 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 20 20  hFilePath);.    
2ec00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
2ec10 78 2d 3e 64 62 50 61 74 68 29 3b 0a 20 20 20 20  x->dbPath);.    
2ec20 2f 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 6f  /* restore the o
2ec30 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20  riginal locking 
2ec40 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74  context and pMet
2ec50 68 6f 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69  hod then close i
2ec60 74 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  t */.    pFile->
2ec70 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
2ec80 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e   pCtx->oldLockin
2ec90 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 46  gContext;.    pF
2eca0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70  ile->pMethod = p
2ecb0 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b  Ctx->pOldMethod;
2ecc0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2ecd0 65 28 70 43 74 78 29 3b 0a 20 20 20 20 72 65 74  e(pCtx);.    ret
2ece0 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  urn pFile->pMeth
2ecf0 6f 64 2d 3e 78 43 6c 6f 73 65 28 69 64 29 3b 0a  od->xClose(id);.
2ed00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2ed10 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e  ITE_OK;.}....#en
2ed20 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
2ed30 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2ed40 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2ed50 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
2ed60 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
2ed70 69 6e 67 20 73 74 79 6c 65 20 69 73 20 69 6e 74  ing style is int
2ed80 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 77 69  ended for use wi
2ed90 74 68 20 41 46 50 20 66 69 6c 65 73 79 73 74 65  th AFP filesyste
2eda0 6d 73 2e 0a 2a 2a 20 41 6e 64 20 73 69 6e 63 65  ms..** And since
2edb0 20 41 46 50 20 69 73 20 6f 6e 6c 79 20 73 75 70   AFP is only sup
2edc0 70 6f 72 74 65 64 20 6f 6e 20 4d 61 63 4f 53 58  ported on MacOSX
2edd0 2c 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  , the proxy lock
2ede0 69 6e 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72  ing is also.** r
2edf0 65 73 74 72 69 63 74 65 64 20 74 6f 20 4d 61 63  estricted to Mac
2ee00 4f 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a  OSX..** .**.****
2ee10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2ee20 45 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 78 79  End of the proxy
2ee30 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
2ee40 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
2ee50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
2ee60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ee70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ee80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ee90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
2eeb0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
2eec0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
2eed0 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  em interface..**
2eee0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2eef0 20 72 65 67 69 73 74 65 72 73 20 61 6c 6c 20 56   registers all V
2ef00 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  FS implementatio
2ef10 6e 73 20 66 6f 72 20 75 6e 69 78 2d 6c 69 6b 65  ns for unix-like
2ef20 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79   operating.** sy
2ef30 73 74 65 6d 73 2e 20 20 54 68 69 73 20 72 6f 75  stems.  This rou
2ef40 74 69 6e 65 2c 20 61 6e 64 20 74 68 65 20 73 71  tine, and the sq
2ef50 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 20 72  lite3_os_end() r
2ef60 6f 75 74 69 6e 65 20 74 68 61 74 20 66 6f 6c 6c  outine that foll
2ef70 6f 77 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 62  ows,.** should b
2ef80 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69  e the only routi
2ef90 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65  nes in this file
2efa0 20 74 68 61 74 20 61 72 65 20 76 69 73 69 62 6c   that are visibl
2efb0 65 20 66 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20  e from other.** 
2efc0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  files..**.** Thi
2efd0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2efe0 6c 65 64 20 6f 6e 63 65 20 64 75 72 69 6e 67 20  led once during 
2eff0 53 51 4c 69 74 65 20 69 6e 69 74 69 61 6c 69 7a  SQLite initializ
2f000 61 74 69 6f 6e 20 61 6e 64 20 62 79 20 61 0a 2a  ation and by a.*
2f010 2a 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e  * single thread.
2f020 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c    The memory all
2f030 6f 63 61 74 69 6f 6e 20 61 6e 64 20 6d 75 74 65  ocation and mute
2f040 78 20 73 75 62 73 79 73 74 65 6d 73 20 68 61 76  x subsystems hav
2f050 65 20 6e 6f 74 0a 2a 2a 20 6e 65 63 65 73 73 61  e not.** necessa
2f060 72 69 6c 79 20 62 65 65 6e 20 69 6e 69 74 69 61  rily been initia
2f070 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20  lized when this 
2f080 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2f090 64 2c 20 61 6e 64 20 73 6f 20 74 68 65 79 0a 2a  d, and so they.*
2f0a0 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  * should not be 
2f0b0 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  used..*/.int sql
2f0c0 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69  ite3_os_init(voi
2f0d0 64 29 7b 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  d){ .  /* .  ** 
2f0e0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  The following ma
2f0f0 63 72 6f 20 64 65 66 69 6e 65 73 20 61 6e 20 69  cro defines an i
2f100 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 61  nitializer for a
2f110 6e 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62  n sqlite3_vfs ob
2f120 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e  ject..  ** The n
2f130 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 69  ame of the VFS i
2f140 73 20 4e 41 4d 45 2e 20 20 54 68 65 20 70 41 70  s NAME.  The pAp
2f150 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74  pData is a point
2f160 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 0a  er to a pointer.
2f170 20 20 2a 2a 20 74 6f 20 74 68 65 20 22 66 69 6e    ** to the "fin
2f180 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20  der" function.  
2f190 28 70 41 70 70 44 61 74 61 20 69 73 20 61 20 70  (pAppData is a p
2f1a0 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 6f 69 6e  ointer to a poin
2f1b0 74 65 72 20 62 65 63 61 75 73 65 0a 20 20 2a 2a  ter because.  **
2f1c0 20 73 69 6c 6c 79 20 43 39 30 20 72 75 6c 65 73   silly C90 rules
2f1d0 20 70 72 6f 68 69 62 69 74 20 61 20 76 6f 69 64   prohibit a void
2f1e0 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 61 73  * from being cas
2f1f0 74 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  t to a function 
2f200 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 6e 64  pointer.  ** and
2f210 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 67   so we have to g
2f220 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e  o through the in
2f230 74 65 72 6d 65 64 69 61 74 65 20 70 6f 69 6e 74  termediate point
2f240 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62  er to avoid prob
2f250 6c 65 6d 73 0a 20 20 2a 2a 20 77 68 65 6e 20 63  lems.  ** when c
2f260 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 2d 70  ompiling with -p
2f270 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 6f  edantic-errors o
2f280 6e 20 47 43 43 2e 29 0a 20 20 2a 2a 0a 20 20 2a  n GCC.).  **.  *
2f290 2a 20 54 68 65 20 46 49 4e 44 45 52 20 70 61 72  * The FINDER par
2f2a0 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 6d  ameter to this m
2f2b0 61 63 72 6f 20 69 73 20 74 68 65 20 6e 61 6d 65  acro is the name
2f2c0 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20   of the pointer 
2f2d0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 64  to the.  ** find
2f2e0 65 72 2d 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  er-function.  Th
2f2f0 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  e finder-functio
2f300 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
2f310 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ter to the.  ** 
2f320 73 71 6c 69 74 65 5f 69 6f 5f 6d 65 74 68 6f 64  sqlite_io_method
2f330 73 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  s object that im
2f340 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 64 65 73  plements the des
2f350 69 72 65 64 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ired locking.  *
2f360 2a 20 62 65 68 61 76 69 6f 72 73 2e 20 20 53 65  * behaviors.  Se
2f370 65 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 61  e the division a
2f380 62 6f 76 65 20 74 68 61 74 20 63 6f 6e 74 61 69  bove that contai
2f390 6e 73 20 74 68 65 20 49 4f 4d 45 54 48 4f 44 53  ns the IOMETHODS
2f3a0 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 66 6f 72 20  .  ** macro for 
2f3b0 61 64 64 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  addition informa
2f3c0 74 69 6f 6e 20 6f 6e 20 66 69 6e 64 65 72 2d 66  tion on finder-f
2f3d0 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20  unctions..  **. 
2f3e0 20 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 73   ** Most finders
2f3f0 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 61   simply return a
2f400 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69   pointer to a fi
2f410 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  xed sqlite3_io_m
2f420 65 74 68 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a 65  ethods.  ** obje
2f430 63 74 2e 20 20 42 75 74 20 74 68 65 20 22 61 75  ct.  But the "au
2f440 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 22 20  tolockIoFinder" 
2f450 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
2f460 4f 53 58 20 64 6f 65 73 20 61 20 6c 69 74 74 6c  OSX does a littl
2f470 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  e.  ** more than
2f480 20 74 68 61 74 3b 20 69 74 20 6c 6f 6f 6b 73 20   that; it looks 
2f490 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  at the filesyste
2f4a0 6d 20 74 79 70 65 20 74 68 61 74 20 68 6f 73 74  m type that host
2f4b0 73 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  s the .  ** data
2f4c0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 72  base file and tr
2f4d0 69 65 73 20 74 6f 20 63 68 6f 6f 73 65 20 61 6e  ies to choose an
2f4e0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
2f4f0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a  appropriate for.
2f500 20 20 2a 2a 20 74 68 61 74 20 66 69 6c 65 73 79    ** that filesy
2f510 73 74 65 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a  stem time..  */.
2f520 20 20 23 64 65 66 69 6e 65 20 55 4e 49 58 56 46    #define UNIXVF
2f530 53 28 56 46 53 4e 41 4d 45 2c 20 46 49 4e 44 45  S(VFSNAME, FINDE
2f540 52 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  R) {            
2f550 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2f560 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
2f570 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
2f580 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ion */          
2f590 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
2f5a0 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
2f5b0 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c  ,     /* szOsFil
2f5c0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
2f5d0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 4d 41          \.    MA
2f5e0 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20 20 20  X_PATHNAME,     
2f5f0 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d      /* mxPathnam
2f600 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
2f610 20 20 20 20 20 20 5c 0a 20 20 20 20 30 2c 20 20        \.    0,  
2f620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f630 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 20 20 20    /* pNext */   
2f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f650 20 20 20 20 5c 0a 20 20 20 20 56 46 53 4e 41 4d      \.    VFSNAM
2f660 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
2f670 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 20 20 20 20 20  /* zName */     
2f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f690 20 20 5c 0a 20 20 20 20 28 76 6f 69 64 2a 29 26    \.    (void*)&
2f6a0 46 49 4e 44 45 52 2c 20 20 20 20 20 20 20 2f 2a  FINDER,       /*
2f6b0 20 70 41 70 70 44 61 74 61 20 2a 2f 20 20 20 20   pAppData */    
2f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6d0 5c 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20  \.    unixOpen, 
2f6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2f6f0 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  Open */         
2f700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2f710 20 20 20 20 75 6e 69 78 44 65 6c 65 74 65 2c 20      unixDelete, 
2f720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
2f730 6c 65 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lete */         
2f740 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2f750 20 20 75 6e 69 78 41 63 63 65 73 73 2c 20 20 20    unixAccess,   
2f760 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
2f770 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ss */           
2f780 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
2f790 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  unixFullPathname
2f7a0 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61  ,     /* xFullPa
2f7b0 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20  thname */       
2f7c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
2f7d0 69 78 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20  ixDlOpen,       
2f7e0 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
2f7f0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2f800 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
2f810 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
2f820 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
2f830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f840 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c      \.    unixDl
2f850 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
2f860 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 20 20 20 20  /* xDlSym */    
2f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f880 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c    \.    unixDlCl
2f890 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ose,          /*
2f8a0 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 20 20 20 20   xDlClose */    
2f8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8c0 5c 0a 20 20 20 20 75 6e 69 78 52 61 6e 64 6f 6d  \.    unixRandom
2f8d0 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  ness,       /* x
2f8e0 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 20 20 20  Randomness */   
2f8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2f900 20 20 20 20 75 6e 69 78 53 6c 65 65 70 2c 20 20      unixSleep,  
2f910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
2f920 65 65 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  eep */          
2f930 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2f940 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d    unixCurrentTim
2f950 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72  e,      /* xCurr
2f960 65 6e 74 54 69 6d 65 20 2a 2f 20 20 20 20 20 20  entTime */      
2f970 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
2f980 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72  unixGetLastError
2f990 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73        /* xGetLas
2f9a0 74 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20  tError */       
2f9b0 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 0a 20          \.  }.. 
2f9c0 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64 65 66   /*.  ** All def
2f9d0 61 75 6c 74 20 56 46 53 65 73 20 66 6f 72 20 75  ault VFSes for u
2f9e0 6e 69 78 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  nix are containe
2f9f0 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d in the followi
2fa00 6e 67 20 61 72 72 61 79 2e 0a 20 20 2a 2a 0a 20  ng array..  **. 
2fa10 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
2fa20 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 70 4e  e sqlite3_vfs.pN
2fa30 65 78 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ext field of the
2fa40 20 56 46 53 20 6f 62 6a 65 63 74 20 69 73 20 6d   VFS object is m
2fa50 6f 64 69 66 69 65 64 0a 20 20 2a 2a 20 62 79 20  odified.  ** by 
2fa60 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
2fa70 77 68 65 6e 20 74 68 65 20 56 46 53 20 69 73 20  when the VFS is 
2fa80 72 65 67 69 73 74 65 72 65 64 2e 20 20 53 6f 20  registered.  So 
2fa90 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
2faa0 2a 2a 20 61 72 72 61 79 20 63 61 6e 6e 6f 74 20  ** array cannot 
2fab0 62 65 20 63 6f 6e 73 74 2e 0a 20 20 2a 2f 0a 20  be const..  */. 
2fac0 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
2fad0 76 66 73 20 61 56 66 73 5b 5d 20 3d 20 7b 0a 23  vfs aVfs[] = {.#
2fae0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2faf0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
2fb00 26 20 28 4f 53 5f 56 58 57 4f 52 4b 53 20 7c 7c  & (OS_VXWORKS ||
2fb10 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2fb20 5f 5f 29 29 0a 20 20 20 20 55 4e 49 58 56 46 53  __)).    UNIXVFS
2fb30 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20  ("unix",        
2fb40 20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64    autolockIoFind
2fb50 65 72 20 29 2c 0a 23 65 6c 73 65 0a 20 20 20 20  er ),.#else.    
2fb60 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22 2c 20  UNIXVFS("unix", 
2fb70 20 20 20 20 20 20 20 20 20 70 6f 73 69 78 49 6f           posixIo
2fb80 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66  Finder ),.#endif
2fb90 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
2fba0 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 20 6e 6f  ix-none",     no
2fbb0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a  lockIoFinder ),.
2fbc0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
2fbd0 78 2d 64 6f 74 66 69 6c 65 22 2c 20 20 64 6f 74  x-dotfile",  dot
2fbe0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a  lockIoFinder ),.
2fbf0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2fc00 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
2fc10 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49  -namedsem", semI
2fc20 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
2fc30 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
2fc40 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2fc50 45 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  E.    UNIXVFS("u
2fc60 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20 20 20 70  nix-posix",    p
2fc70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a  osixIoFinder ),.
2fc80 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a  #if !OS_VXWORKS.
2fc90 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
2fca0 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f  x-flock",    flo
2fcb0 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  ckIoFinder ),.#e
2fcc0 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20  ndif.#endif.#if 
2fcd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2fce0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
2fcf0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2fd00 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ).    UNIXVFS("u
2fd10 6e 69 78 2d 61 66 70 22 2c 20 20 20 20 20 20 61  nix-afp",      a
2fd20 66 70 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20  fpIoFinder ),.  
2fd30 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
2fd40 6e 66 73 22 2c 20 20 20 20 20 20 6e 66 73 49 6f  nfs",      nfsIo
2fd50 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e  Finder ),.    UN
2fd60 49 58 56 46 53 28 22 75 6e 69 78 2d 70 72 6f 78  IXVFS("unix-prox
2fd70 79 22 2c 20 20 20 20 70 72 6f 78 79 49 6f 46 69  y",    proxyIoFi
2fd80 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20  nder ),.#endif. 
2fd90 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
2fda0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
2fdb0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2fdc0 2f 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  /..  /* Register
2fdd0 20 61 6c 6c 20 56 46 53 65 73 20 64 65 66 69 6e   all VFSes defin
2fde0 65 64 20 69 6e 20 74 68 65 20 61 56 66 73 5b 5d  ed in the aVfs[]
2fdf0 20 61 72 72 61 79 20 2a 2f 0a 20 20 66 6f 72 28   array */.  for(
2fe00 69 3d 30 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61  i=0; i<(sizeof(a
2fe10 56 66 73 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69  Vfs)/sizeof(sqli
2fe20 74 65 33 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b  te3_vfs)); i++){
2fe30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
2fe40 5f 72 65 67 69 73 74 65 72 28 26 61 56 66 73 5b  _register(&aVfs[
2fe50 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20  i], i==0);.  }. 
2fe60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2fe70 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  K; .}../*.** Shu
2fe80 74 64 6f 77 6e 20 74 68 65 20 6f 70 65 72 61 74  tdown the operat
2fe90 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
2fea0 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  face..**.** Some
2feb0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
2fec0 6d 73 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ms might need to
2fed0 20 64 6f 20 73 6f 6d 65 20 63 6c 65 61 6e 75 70   do some cleanup
2fee0 20 69 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   in this routine
2fef0 2c 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65 20  ,.** to release 
2ff00 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
2ff10 63 61 74 65 64 20 6f 62 6a 65 63 74 73 2e 20 20  cated objects.  
2ff20 42 75 74 20 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e  But not on unix.
2ff30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2ff40 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
2ff50 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  unix..*/.int sql
2ff60 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64  ite3_os_end(void
2ff70 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ){ .  return SQL
2ff80 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e  ITE_OK; .}. .#en
2ff90 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
2ffa0 5f 55 4e 49 58 20 2a 2f 0a                       _UNIX */.