/ Hex Artifact Content
Login

Artifact 0af0a55e2dd55bc4f4c3ccf04cc8f1f4a2e2e65f:


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 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76  ./*.** Allowed v
1240: 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69 6c  alues of unixFil
1250: 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65  e.fsFlags.*/.#de
1260: 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46 4c  fine SQLITE_FSFL
1270: 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20  AGS_IS_MSDOS    
1280: 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77   0x1../*.** If w
1290: 65 20 61 72 65 20 74 6f 20 62 65 20 74 68 72 65  e are to be thre
12a0: 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64 65  ad-safe, include
12b0: 20 74 68 65 20 70 74 68 72 65 61 64 73 20 68 65   the pthreads he
12c0: 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65 0a  ader and define.
12d0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55 4e  ** the SQLITE_UN
12e0: 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72 6f  IX_THREADS macro
12f0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
1300: 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63  THREADSAFE.# inc
1310: 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e  lude <pthread.h>
1320: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
1330: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31 0a  _UNIX_THREADS 1.
1340: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1350: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
1360: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
1370: 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69  a new file.*/.#i
1380: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  fndef SQLITE_DEF
1390: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
13a0: 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53  SIONS.# define S
13b0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
13c0: 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30  LE_PERMISSIONS 0
13d0: 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  644.#endif../*. 
13e0: 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69  ** Default permi
13f0: 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61  ssions when crea
1400: 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79 20  ting auto proxy 
1410: 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  dir. */.#ifndef 
1420: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
1430: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
1440: 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  ONS.# define SQL
1450: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
1460: 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
1470: 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0755.#endif../*
1480: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70  .** Maximum supp
1490: 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74  orted path-lengt
14a0: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  h..*/.#define MA
14b0: 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a  X_PATHNAME 512..
14c0: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74  /*.** Only set t
14d0: 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20  he lastErrno if 
14e0: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
14f0: 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61  s a real error a
1500: 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72  nd not .** a nor
1510: 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74  mal expected ret
1520: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
1530: 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
1540: 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  E_OK.*/.#define 
1550: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29  IS_LOCK_ERROR(x)
1560: 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f    ((x != SQLITE_
1570: 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c  OK) && (x != SQL
1580: 49 54 45 5f 42 55 53 59 29 29 0a 0a 0a 2f 2a 0a  ITE_BUSY)).../*.
1590: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66  ** Sometimes, af
15a0: 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c  ter a file handl
15b0: 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53  e is closed by S
15c0: 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20  QLite, the file 
15d0: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61  descriptor.** ca
15e0: 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69  nnot be closed i
15f0: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74  mmediately. In t
1600: 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74  hese cases, inst
1610: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c  ances of the fol
1620: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
1630: 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20  ure are used to 
1640: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64  store the file d
1650: 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20  escriptor while 
1660: 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a  waiting for an.*
1670: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
1680: 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72   either close or
1690: 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 74 79   reuse it..*/.ty
16a0: 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69  pedef struct Uni
16b0: 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e  xUnusedFd UnixUn
16c0: 75 73 65 64 46 64 3b 0a 73 74 72 75 63 74 20 55  usedFd;.struct U
16d0: 6e 69 78 55 6e 75 73 65 64 46 64 20 7b 0a 20 20  nixUnusedFd {.  
16e0: 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
16f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1700: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
1710: 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66  close */.  int f
1720: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1730: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68       /* Flags th
1740: 69 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  is file descript
1750: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  or was opened wi
1760: 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  th */.  UnixUnus
1770: 65 64 46 64 20 2a 70 4e 65 78 74 3b 20 20 20 20  edFd *pNext;    
1780: 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73 65 64    /* Next unused
1790: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
17a0: 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f   on same file */
17b0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75  .};../*.** The u
17c0: 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
17d0: 65 20 69 73 20 73 75 62 63 6c 61 73 73 20 6f 66  e is subclass of
17e0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 70   sqlite3_file sp
17f0: 65 63 69 66 69 63 20 74 6f 20 74 68 65 20 75 6e  ecific to the un
1800: 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d  ix.** VFS implem
1810: 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79  entations..*/.ty
1820: 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69  pedef struct uni
1830: 78 46 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a  xFile unixFile;.
1840: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20  struct unixFile 
1850: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  {.  sqlite3_io_m
1860: 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d  ethods const *pM
1870: 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79  ethod;  /* Alway
1880: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
1890: 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  y */.  struct un
18a0: 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  ixOpenCnt *pOpen
18b0: 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20  ;       /* Info 
18c0: 61 62 6f 75 74 20 61 6c 6c 20 6f 70 65 6e 20 66  about all open f
18d0: 64 27 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64  d's on this inod
18e0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
18f0: 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  ixLockInfo *pLoc
1900: 6b 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20  k;      /* Info 
1910: 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74  about locks on t
1920: 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69  his inode */.  i
1930: 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20  nt h;           
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
1960: 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  riptor */.  int 
1970: 64 69 72 66 64 3b 20 20 20 20 20 20 20 20 20 20  dirfd;          
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1990: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
19a0: 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72  for the director
19b0: 79 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  y */.  unsigned 
19c0: 63 68 61 72 20 6c 6f 63 6b 74 79 70 65 3b 20 20  char locktype;  
19d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
19e0: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
19f0: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1a00: 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20   int lastErrno; 
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a20: 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20 65 72    /* The unix er
1a30: 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
1a40: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1a50: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1a60: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1a70: 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79    /* Locking sty
1a80: 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61 74  le specific stat
1a90: 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65  e */.  UnixUnuse
1aa0: 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20  dFd *pUnused;   
1ab0: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 2d 61          /* Pre-a
1ac0: 6c 6c 6f 63 61 74 65 64 20 55 6e 69 78 55 6e 75  llocated UnixUnu
1ad0: 73 65 64 46 64 20 2a 2f 0a 20 20 69 6e 74 20 66  sedFd */.  int f
1ae0: 69 6c 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ileFlags;       
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1b00: 69 73 63 65 6c 6c 61 6e 6f 75 73 20 66 6c 61 67  iscellanous flag
1b10: 73 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  s */.#if SQLITE_
1b20: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1b30: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1b40: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1b50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1b60: 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20 61  lags specified a
1b70: 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e 64  t open() */.#end
1b80: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
1b90: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1ba0: 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  LE || defined(__
1bb0: 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69 67  APPLE__).  unsig
1bc0: 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20 20  ned fsFlags;    
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1be0: 63 61 63 68 65 64 20 64 65 74 61 69 6c 73 20 66  cached details f
1bf0: 72 6f 6d 20 73 74 61 74 66 73 28 29 20 2a 2f 0a  rom statfs() */.
1c00: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1c10: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
1c20: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
1c30: 5f 29 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74  _).  pthread_t t
1c40: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
1c50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 68 72        /* The thr
1c60: 65 61 64 20 74 68 61 74 20 22 6f 77 6e 73 22 20  ead that "owns" 
1c70: 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f  this unixFile */
1c80: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56  .#endif.#if OS_V
1c90: 58 57 4f 52 4b 53 0a 20 20 69 6e 74 20 69 73 44  XWORKS.  int isD
1ca0: 65 6c 65 74 65 3b 20 20 20 20 20 20 20 20 20 20  elete;          
1cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
1cc0: 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20  ete on close if 
1cd0: 74 72 75 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  true */.  struct
1ce0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
1cf0: 70 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 55 6e  pId;       /* Un
1d00: 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a  ique file ID */.
1d10: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4e  #endif.#ifndef N
1d20: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1d30: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1d40: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1d50: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1d60: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1d70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1d80: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1d90: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
1da0: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
1db0: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
1dc0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1dd0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
1de0: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
1df0: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
1e00: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
1e10: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
1e20: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
1e30: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1e40: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
1e50: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
1e60: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
1e70: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
1e80: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
1e90: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
1ea0: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
1eb0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1ec0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
1ed0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1ee0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1ef0: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
1f00: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1f10: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
1f20: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
1f30: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
1f40: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
1f50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1f60: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
1f70: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
1f80: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
1f90: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e 64  peration */.#end
1fa0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1fb0: 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65  _TEST.  /* In te
1fc0: 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73  st mode, increas
1fd0: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1fe0: 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20 62  is structure a b
1ff0: 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a  it so that .  **
2000: 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68   it is larger th
2010: 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43 72  an the struct Cr
2020: 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20  ashFile defined 
2030: 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f  in test6.c..  */
2040: 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e 67  .  char aPadding
2050: 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [32];.#endif.};.
2060: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2070: 77 69 6e 67 20 6d 61 63 72 6f 73 20 64 65 66 69  wing macros defi
2080: 6e 65 20 62 69 74 73 20 69 6e 20 75 6e 69 78 46  ne bits in unixF
2090: 69 6c 65 2e 66 69 6c 65 46 6c 61 67 73 0a 2a 2f  ile.fileFlags.*/
20a0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
20b0: 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49  WHOLE_FILE_LOCKI
20c0: 4e 47 20 20 30 78 30 30 30 31 20 20 20 2f 2a 20  NG  0x0001   /* 
20d0: 55 73 65 20 77 68 6f 6c 65 2d 66 69 6c 65 20 6c  Use whole-file l
20e0: 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ocking */../*.**
20f0: 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68   Include code th
2100: 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  at is common to 
2110: 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73  all os_*.c files
2120: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
2130: 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a  _common.h"../*.*
2140: 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73  * Define various
2150: 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65   macros that are
2160: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f   missing from so
2170: 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  me systems..*/.#
2180: 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49  ifndef O_LARGEFI
2190: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
21a0: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
21b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
21c0: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64  ISABLE_LFS.# und
21d0: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
21e0: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
21f0: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2200: 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a  ndef O_NOFOLLOW.
2210: 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c  # define O_NOFOL
2220: 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  LOW 0.#endif.#if
2230: 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20  ndef O_BINARY.# 
2240: 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20  define O_BINARY 
2250: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
2260: 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c  The DJGPP compil
2270: 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c  er environment l
2280: 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65  ooks mostly like
2290: 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a   Unix, but it.**
22a0: 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c   lacks the fcntl
22b0: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  () system call. 
22c0: 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e   So redefine fcn
22d0: 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74  tl() to be somet
22e0: 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77  hing.** that alw
22f0: 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54  ays succeeds.  T
2300: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c  his means that l
2310: 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20  ocking does not 
2320: 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44  occur under.** D
2330: 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73  JGPP.  But it is
2340: 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20   DOS - what did 
2350: 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23  you expect?.*/.#
2360: 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  ifdef __DJGPP__.
2370: 23 20 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 41  # define fcntl(A
2380: 2c 42 2c 43 29 20 30 0a 23 65 6e 64 69 66 0a 0a  ,B,C) 0.#endif..
2390: 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64  /*.** The thread
23a0: 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65  id macro resolve
23b0: 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d  s to the thread-
23c0: 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65  id or to 0.  Use
23d0: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
23e0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
23f0: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  nly..*/.#if SQLI
2400: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64  TE_THREADSAFE.#d
2410: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
2420: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
2430: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
2440: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  adid 0.#endif...
2450: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
2460: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
2470: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
2480: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
2490: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
24a0: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
24b0: 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69   protect the uni
24c0: 78 4f 70 65 6e 43 6e 74 2c 20 75 6e 69 78 4c 6f  xOpenCnt, unixLo
24d0: 63 6b 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78  ckInfo and.** vx
24e0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
24f0: 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69 73  cts used by this
2500: 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68   file, all of wh
2510: 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73  ich may be .** s
2520: 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c  hared by multipl
2530: 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a  e threads..**.**
2540: 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75   Function unixMu
2550: 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65  texHeld() is use
2560: 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  d to assert() th
2570: 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  at the global mu
2580: 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20  tex .** is held 
2590: 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54  when required. T
25a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25b0: 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72  only used as par
25c0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a  t of assert() .*
25d0: 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e  * statements. e.
25e0: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45  g..**.**   unixE
25f0: 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20  nterMutex().**  
2600: 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d     assert( unixM
2610: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a  utexHeld() );.**
2620: 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76     unixEnterLeav
2630: 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e().*/.static vo
2640: 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  id unixEnterMute
2650: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
2660: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
2670: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
2680: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
2690: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
26a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
26b0: 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  xLeaveMutex(void
26c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
26d0: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
26e0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
26f0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
2700: 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65  ASTER));.}.#ifde
2710: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
2720: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75  tatic int unixMu
2730: 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a  texHeld(void) {.
2740: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2750: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69  _mutex_held(sqli
2760: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
2770: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
2780: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65  C_MASTER));.}.#e
2790: 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51  ndif...#ifdef SQ
27a0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
27b0: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
27c0: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75   for printing ou
27d0: 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74  t trace informat
27e0: 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69  ion from debuggi
27f0: 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20  ng.** binaries. 
2800: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
2810: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74   string represet
2820: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70  ation of the sup
2830: 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  plied.** integer
2840: 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73   lock-type..*/.s
2850: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
2860: 20 2a 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 69   *locktypeName(i
2870: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
2880: 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65  switch( locktype
2890: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f   ){.    case NO_
28a0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f  LOCK: return "NO
28b0: 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48  NE";.    case SH
28c0: 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  ARED_LOCK: retur
28d0: 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20  n "SHARED";.    
28e0: 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f  case RESERVED_LO
28f0: 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45  CK: return "RESE
2900: 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20  RVED";.    case 
2910: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65  PENDING_LOCK: re
2920: 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a  turn "PENDING";.
2930: 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49      case EXCLUSI
2940: 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  VE_LOCK: return 
2950: 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d  "EXCLUSIVE";.  }
2960: 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52  .  return "ERROR
2970: 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ";.}.#endif..#if
2980: 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  def SQLITE_LOCK_
2990: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  TRACE./*.** Prin
29a0: 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f  t out informatio
29b0: 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b  n about all lock
29c0: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ing operations..
29d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
29e0: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
29f0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c  roubleshooting l
2a00: 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72  ocks on multithr
2a10: 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72  eaded.** platfor
2a20: 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63  ms.  Enable by c
2a30: 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68  ompiling with th
2a40: 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  e -DSQLITE_LOCK_
2a50: 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64  TRACE.** command
2a60: 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20  -line option on 
2a70: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54  the compiler.  T
2a80: 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d  his code is norm
2a90: 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f  ally.** turned o
2aa0: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ff..*/.static in
2ab0: 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20  t lockTrace(int 
2ac0: 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75  fd, int op, stru
2ad0: 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20  ct flock *p){.  
2ae0: 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a  char *zOpName, *
2af0: 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a  zType;.  int s;.
2b00: 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f    int savedErrno
2b10: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45  ;.  if( op==F_GE
2b20: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
2b30: 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20  me = "GETLK";.  
2b40: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f  }else if( op==F_
2b50: 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70  SETLK ){.    zOp
2b60: 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a  Name = "SETLK";.
2b70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d    }else{.    s =
2b80: 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70   fcntl(fd, op, p
2b90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
2ba0: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
2bb0: 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25   unknown %d %d %
2bc0: 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29  d\n", fd, op, s)
2bd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a  ;.    return s;.
2be0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74    }.  if( p->l_t
2bf0: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
2c00: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
2c10: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
2c20: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
2c30: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
2c40: 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65   = "WRLCK";.  }e
2c50: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
2c60: 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
2c70: 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b    zType = "UNLCK
2c80: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
2c90: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d  assert( 0 );.  }
2ca0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f  .  assert( p->l_
2cb0: 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54  whence==SEEK_SET
2cc0: 20 29 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c 28   );.  s = fcntl(
2cd0: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61  fd, op, p);.  sa
2ce0: 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  vedErrno = errno
2cf0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
2d00: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64  Printf("fcntl %d
2d10: 20 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20   %d %s %s %d %d 
2d20: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74  %d %d\n",.     t
2d30: 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70  hreadid, fd, zOp
2d40: 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e  Name, zType, (in
2d50: 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69  t)p->l_start, (i
2d60: 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20  nt)p->l_len,.   
2d70: 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c    (int)p->l_pid,
2d80: 20 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d   s);.  if( s==(-
2d90: 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c  1) && op==F_SETL
2da0: 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d  K && (p->l_type=
2db0: 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c  =F_RDLCK || p->l
2dc0: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20  _type==F_WRLCK) 
2dd0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
2de0: 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d  ock l2;.    l2 =
2df0: 20 2a 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66   *p;.    fcntl(f
2e00: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29  d, F_GETLK, &l2)
2e10: 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74  ;.    if( l2.l_t
2e20: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
2e30: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52        zType = "R
2e40: 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  DLCK";.    }else
2e50: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
2e60: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_WRLCK ){.     
2e70: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
2e80: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2e90: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  l2.l_type==F_UNL
2ea0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
2eb0: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20  e = "UNLCK";.   
2ec0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
2ed0: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d  sert( 0 );.    }
2ee0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
2ef0: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66  gPrintf("fcntl-f
2f00: 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25  ailure-reason: %
2f10: 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  s %d %d %d\n",. 
2f20: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e        zType, (in
2f30: 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69  t)l2.l_start, (i
2f40: 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e  nt)l2.l_len, (in
2f50: 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d  t)l2.l_pid);.  }
2f60: 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64  .  errno = saved
2f70: 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  Errno;.  return 
2f80: 73 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e  s;.}.#define fcn
2f90: 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e  tl lockTrace.#en
2fa0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f  dif /* SQLITE_LO
2fb0: 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 0a 0a 2f  CK_TRACE */..../
2fc0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2fd0: 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73  e translates a s
2fe0: 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72  tandard POSIX er
2ff0: 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f  rno code into so
3000: 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75  mething.** usefu
3010: 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73  l to the clients
3020: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20   of the sqlite3 
3030: 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63  functions.  Spec
3040: 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a  ifically, it is.
3050: 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74  ** intended to t
3060: 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65  ranslate a varie
3070: 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e  ty of "try again
3080: 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51  " errors into SQ
3090: 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64  LITE_BUSY.** and
30a0: 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70   a variety of "p
30b0: 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20  lease close the 
30c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
30d0: 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f  NOW" errors into
30e0: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
30f0: 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20  R.** .** Errors 
3100: 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a  during initializ
3110: 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20  ation of locks, 
3120: 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  or file system s
3130: 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73  upport for locks
3140: 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64  ,.** should hand
3150: 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53  le ENOLCK, ENOTS
3160: 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73  UP, EOPNOTSUPP s
3170: 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  eparately..*/.st
3180: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45  atic int sqliteE
3190: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
31a0: 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f  or(int posixErro
31b0: 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45  r, int sqliteIOE
31c0: 72 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28  rr) {.  switch (
31d0: 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 20 20  posixError) {.  
31e0: 63 61 73 65 20 30 3a 20 0a 20 20 20 20 72 65 74  case 0: .    ret
31f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
3200: 20 20 20 0a 20 20 63 61 73 65 20 45 41 47 41 49     .  case EAGAI
3210: 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44  N:.  case ETIMED
3220: 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53  OUT:.  case EBUS
3230: 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a  Y:.  case EINTR:
3240: 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20  .  case ENOLCK: 
3250: 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20   .    /* random 
3260: 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c  NFS retry error,
3270: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
3280: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
3290: 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f  rt .     * intro
32a0: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
32b0: 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d  ch it actually m
32c0: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
32d0: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
32e0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
32f0: 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a   .  case EACCES:
3300: 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20   .    /* EACCES 
3310: 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64  is like EAGAIN d
3320: 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70  uring locking op
3330: 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f  erations, but no
3340: 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65  t any other time
3350: 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69  */.    if( (sqli
3360: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
3370: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c  E_IOERR_LOCK) ||
3380: 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20   ..(sqliteIOErr 
3390: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
33a0: 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71  UNLOCK) || ..(sq
33b0: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
33c0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
33d0: 29 20 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f 45  ) ||..(sqliteIOE
33e0: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
33f0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
3400: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72  LOCK) ){.      r
3410: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
3420: 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  Y;.    }.    /* 
3430: 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  else fall throug
3440: 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52  h */.  case EPER
3450: 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53  M: .    return S
3460: 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
3470: 0a 20 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a  .  case EDEADLK:
3480: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
3490: 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
34a0: 3b 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e 4f  ;.    .#if EOPNO
34b0: 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a 20  TSUPP!=ENOTSUP. 
34c0: 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50 50   case EOPNOTSUPP
34d0: 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74 68  : .    /* someth
34e0: 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62 6c  ing went terribl
34f0: 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20 64  y awry, unless d
3500: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
3510: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
3520: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
3530: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
3540: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
3550: 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64   it says */.#end
3560: 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53 55  if.#ifdef ENOTSU
3570: 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55 50  P.  case ENOTSUP
3580: 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69  : .    /* invali
3590: 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75 72  d fd, unless dur
35a0: 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ing file system 
35b0: 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70 65  support introspe
35c0: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
35d0: 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74 75 61  .     * it actua
35e0: 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69  lly means what i
35f0: 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66  t says */.#endif
3600: 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20 63  .  case EIO:.  c
3610: 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61 73  ase EBADF:.  cas
3620: 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73 65  e EINVAL:.  case
3630: 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61 73   ENOTCONN:.  cas
3640: 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73 65  e ENODEV:.  case
3650: 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20 45   ENXIO:.  case E
3660: 4e 4f 45 4e 54 3a 0a 20 20 63 61 73 65 20 45 53  NOENT:.  case ES
3670: 54 41 4c 45 3a 0a 20 20 63 61 73 65 20 45 4e 4f  TALE:.  case ENO
3680: 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73  SYS:.    /* thes
3690: 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74  e should force t
36a0: 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f  he client to clo
36b0: 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  se the file and 
36c0: 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20  reconnect */.   
36d0: 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20   .  default: .  
36e0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49    return sqliteI
36f0: 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f  OErr;.  }.}..../
3700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
3750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3760: 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46  * Begin Unique F
3770: 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55  ile ID Utility U
3780: 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a  sed By VxWorks *
3790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
37a0: 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72  *.** On most ver
37b0: 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77  sions of unix, w
37c0: 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71  e can get a uniq
37d0: 75 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65  ue ID for a file
37e0: 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e   by concatenatin
37f0: 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20  g.** the device 
3800: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
3810: 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75  node number.  Bu
3820: 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  t this does not 
3830: 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  work on VxWorks.
3840: 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20  .** On VxWorks, 
3850: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64  a unique file id
3860: 20 6d 75 73 74 20 62 65 20 62 61 73 65 64 20 6f   must be based o
3870: 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  n the canonical 
3880: 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  filename..**.** 
3890: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  A pointer to an 
38a0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
38b0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
38c0: 75 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ure can be used 
38d0: 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66  as a.** unique f
38e0: 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b  ile ID in VxWork
38f0: 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63  s.  Each instanc
3900: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
3910: 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ure contains.** 
3920: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61  a copy of the ca
3930: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
3940: 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f  .  There is also
3950: 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75   a reference cou
3960: 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72  nt.  .** The str
3970: 75 63 74 75 72 65 20 69 73 20 72 65 63 6c 61 69  ucture is reclai
3980: 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d  med when the num
3990: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
39a0: 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a  to it drops to.*
39b0: 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  * zero..**.** Th
39c0: 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 76 65  ere are never ve
39d0: 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70  ry many files op
39e0: 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61  en at one time a
39f0: 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e  nd lookups are n
3a00: 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61  ot.** a performa
3a10: 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74  nce-critical pat
3a20: 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66 66  h, so it is suff
3a30: 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68  icient to put th
3a40: 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ese.** structure
3a50: 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  s on a linked li
3a60: 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78  st..*/.struct vx
3a70: 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20  worksFileId {.  
3a80: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
3a90: 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a  leId *pNext;  /*
3aa0: 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20   Next in a list 
3ab0: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20  of them all */. 
3ac0: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3ae0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
3af0: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f  rences to this o
3b00: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ne */.  int nNam
3b10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3b20: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
3b30: 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61  of the zCanonica
3b40: 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a  lName[] string *
3b50: 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e  /.  char *zCanon
3b60: 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20  icalName;       
3b70: 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66    /* Canonical f
3b80: 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23  ilename */.};..#
3b90: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a  if OS_VXWORKS./*
3ba0: 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20   .** All unique 
3bb0: 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65  filenames are he
3bc0: 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  ld on a linked l
3bd0: 69 73 74 20 68 65 61 64 65 64 20 62 79 20 74 68  ist headed by th
3be0: 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a  is.** variable:.
3bf0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
3c00: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
3c10: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
3c20: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70  = 0;../*.** Simp
3c30: 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20  lify a filename 
3c40: 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63  into its canonic
3c50: 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61  al form.** by ma
3c60: 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  king the followi
3c70: 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a  ng changes:.**.*
3c80: 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e  *  * removing an
3c90: 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64  y trailing and d
3ca0: 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a  uplicate /.**  *
3cb0: 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74   convert /./ int
3cc0: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63  o just /.**  * c
3cd0: 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68  onvert /A/../ wh
3ce0: 65 72 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d  ere A is any sim
3cf0: 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75  ple name into ju
3d00: 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67  st /.**.** Chang
3d10: 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70  es are made in-p
3d20: 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68  lace.  Return th
3d30: 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74  e new name lengt
3d40: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  h..**.** The ori
3d50: 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  ginal filename i
3d60: 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20  s in z[0..n-1]. 
3d70: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
3d80: 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74  er of.** charact
3d90: 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c  ers in the simpl
3da0: 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  ified name..*/.s
3db0: 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b  tatic int vxwork
3dc0: 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68  sSimplifyName(ch
3dd0: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
3de0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69   int i, j;.  whi
3df0: 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31  le( n>1 && z[n-1
3e00: 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d  ]=='/' ){ n--; }
3e10: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
3e20: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
3e30: 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20   z[i]=='/' ){.  
3e40: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
3e50: 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  '/' ) continue;.
3e60: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
3e70: 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26  =='.' && i+2<n &
3e80: 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b  & z[i+2]=='/' ){
3e90: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b  .        i += 1;
3ea0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
3eb0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
3ec0: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27   if( z[i+1]=='.'
3ed0: 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69   && i+3<n && z[i
3ee0: 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b  +2]=='.' && z[i+
3ef0: 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  3]=='/' ){.     
3f00: 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26     while( j>0 &&
3f10: 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20   z[j-1]!='/' ){ 
3f20: 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  j--; }.        i
3f30: 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d  f( j>0 ){ j--; }
3f40: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b  .        i += 2;
3f50: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
3f60: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
3f70: 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b  .    z[j++] = z[
3f80: 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d  i];.  }.  z[j] =
3f90: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a   0;.  return j;.
3fa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
3fb0: 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66  unique file ID f
3fc0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61 62 73  or the given abs
3fd0: 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20  olute pathname. 
3fe0: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
3ff0: 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f  nter to the vxwo
4000: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
4010: 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20  .  This pointer 
4020: 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a  is the unique.**
4030: 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20   file ID..**.** 
4040: 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f  The nRef field o
4050: 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c  f the vxworksFil
4060: 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e  eId object is in
4070: 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65  cremented before
4080: 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69  .** the object i
4090: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e  s returned.  A n
40a0: 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ew vxworksFileId
40b0: 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
40c0: 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20  ed.** and added 
40d0: 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69  to the global li
40e0: 73 74 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  st if necessary.
40f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
4100: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
4110: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
4120: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
4130: 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  ic struct vxwork
4140: 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73  sFileId *vxworks
4150: 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74  FindFileId(const
4160: 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65   char *zAbsolute
4170: 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20  Name){.  struct 
4180: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
4190: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  New;         /* 
41a0: 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e  search key and n
41b0: 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20  ew file ID */.  
41c0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
41d0: 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65  leId *pCandidate
41e0: 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  ;   /* For loopi
41f0: 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67  ng over existing
4200: 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69   file IDs */.  i
4210: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4230: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
4240: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74  zAbsoluteName st
4250: 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ring */..  asser
4260: 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  t( zAbsoluteName
4270: 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20  [0]=='/' );.  n 
4280: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41  = (int)strlen(zA
4290: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20  bsoluteName);.  
42a0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pNew = sqlite3_m
42b0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
42c0: 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a  New) + (n+1) );.
42d0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
42e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
42f0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
4300: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
4310: 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  1];.  memcpy(pNe
4320: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
4330: 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  e, zAbsoluteName
4340: 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78  , n+1);.  n = vx
4350: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
4360: 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  e(pNew->zCanonic
4370: 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f  alName, n);..  /
4380: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
4390: 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74  existing entry t
43a0: 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65  hat matching the
43b0: 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e   canonical name.
43c0: 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20  .  ** If found, 
43d0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  increment the re
43e0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e  ference count an
43f0: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
4400: 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  er to.  ** the e
4410: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e  xisting file ID.
4420: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
4430: 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
4440: 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72  pCandidate=vxwor
4450: 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e  ksFileList; pCan
4460: 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61  didate; pCandida
4470: 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70  te=pCandidate->p
4480: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
4490: 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65  Candidate->nName
44a0: 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d  ==n .     && mem
44b0: 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e  cmp(pCandidate->
44c0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
44d0: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
44e0: 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  Name, n)==0.    
44f0: 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
4500: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
4510: 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d       pCandidate-
4520: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
4530: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
4540: 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
4550: 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20  pCandidate;.    
4560: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  }.  }..  /* No m
4570: 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20  atch was found. 
4580: 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20   We will make a 
4590: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
45a0: 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b   pNew->nRef = 1;
45b0: 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d  .  pNew->nName =
45c0: 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   n;.  pNew->pNex
45d0: 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  t = vxworksFileL
45e0: 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69  ist;.  vxworksFi
45f0: 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  leList = pNew;. 
4600: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
4610: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
4620: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
4630: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
4640: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78  ce count on a vx
4650: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
4660: 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65  ct.  Free.** the
4670: 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65   object when the
4680: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
4690: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a   reaches zero..*
46a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 78  /.static void vx
46b0: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
46c0: 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b  Id(struct vxwork
46d0: 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20  sFileId *pId){. 
46e0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
46f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
4700: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49  ->nRef>0 );.  pI
4710: 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  d->nRef--;.  if(
4720: 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pId->nRef==0 ){
4730: 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77 6f  .    struct vxwo
4740: 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a  rksFileId **pp;.
4750: 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f      for(pp=&vxwo
4760: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70  rksFileList; *pp
4770: 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70   && *pp!=pId; pp
4780: 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78   = &((*pp)->pNex
4790: 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74  t)){}.    assert
47a0: 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20  ( *pp==pId );.  
47b0: 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65    *pp = pId->pNe
47c0: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
47d0: 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20  free(pId);.  }. 
47e0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
47f0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  );.}.#endif /* O
4800: 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a  S_VXWORKS */./**
4810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
4820: 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65  d of Unique File
4830: 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64   ID Utility Used
4840: 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a   By VxWorks ****
4850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
4860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
48b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 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 20 50 6f 73 69 78  ********** Posix
4920: 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e   Advisory Lockin
4930: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
4940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
4950: 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73  *.** POSIX advis
4960: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72  ory locks are br
4970: 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20  oken by design. 
4980: 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31   ANSI STD 1003.1
4990: 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69   (1996).** secti
49a0: 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73  on 6.5.2.2 lines
49b0: 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30   483 through 490
49c0: 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68   specify that wh
49d0: 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20  en a process.** 
49e0: 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61  sets or clears a
49f0: 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72   lock, that oper
4a00: 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  ation overrides 
4a10: 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20  any prior locks 
4a20: 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61  set.** by the sa
4a30: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20  me process.  It 
4a40: 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69  does not explici
4a50: 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20  tly say so, but 
4a60: 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20  this implies.** 
4a70: 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65  that it override
4a80: 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74  s locks set by t
4a90: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
4aa0: 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  using a differen
4ab0: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
4ac0: 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20  ptor.  Consider 
4ad0: 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a  this test case:.
4ae0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  **.**       int 
4af0: 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd1 = open("./fi
4b00: 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le1", O_RDWR|O_C
4b10: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20  REAT, 0644);.** 
4b20: 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20        int fd2 = 
4b30: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20  open("./file2", 
4b40: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
4b50: 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70  0644);.**.** Sup
4b60: 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64  pose ./file1 and
4b70: 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61   ./file2 are rea
4b80: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c  lly the same fil
4b90: 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e  e (because.** on
4ba0: 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73  e is a hard or s
4bb0: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20  ymbolic link to 
4bc0: 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20  the other) then 
4bd0: 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e  if you set.** an
4be0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
4bf0: 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79  on fd1, then try
4c00: 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75   to get an exclu
4c10: 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20  sive lock.** on 
4c20: 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20  fd2, it works.  
4c30: 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70  I would have exp
4c40: 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64  ected the second
4c50: 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c   lock to.** fail
4c60: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73   since there was
4c70: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
4c80: 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20  on the file due 
4c90: 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e  to fd1..** But n
4ca0: 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f  ot so.  Since bo
4cb0: 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72  th locks came fr
4cc0: 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  om the same proc
4cd0: 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ess, the.** seco
4ce0: 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65  nd overrides the
4cf0: 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f   first, even tho
4d00: 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e  ugh they were on
4d10: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
4d20: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
4d30: 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65  pened on differe
4d40: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a  nt file names..*
4d50: 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20  *.** This means 
4d60: 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75  that we cannot u
4d70: 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74  se POSIX locks t
4d80: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69  o synchronize fi
4d90: 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f  le access.** amo
4da0: 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72  ng competing thr
4db0: 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65  eads of the same
4dc0: 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58   process.  POSIX
4dd0: 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b   locks will work
4de0: 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63   fine.** to sync
4df0: 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66  hronize access f
4e00: 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73 65  or threads in se
4e10: 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73  parate processes
4e20: 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72  , but not.** thr
4e30: 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65 20  eads within the 
4e40: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  same process..**
4e50: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
4e60: 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20  nd the problem, 
4e70: 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61  SQLite has to ma
4e80: 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20  nage file locks 
4e90: 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e  internally.** on
4ea0: 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65   its own.  Whene
4eb0: 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62 61  ver a new databa
4ec0: 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65  se is opened, we
4ed0: 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68   have to find th
4ee0: 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e  e.** specific in
4ef0: 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ode of the datab
4f00: 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e  ase file (the in
4f10: 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ode is determine
4f20: 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64  d by the.** st_d
4f30: 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69  ev and st_ino fi
4f40: 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61 74  elds of the stat
4f50: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
4f60: 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e  fstat() fills in
4f70: 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66  ).** and check f
4f80: 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79  or locks already
4f90: 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61   existing on tha
4fa0: 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c  t inode.  When l
4fb0: 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61  ocks are.** crea
4fc0: 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20  ted or removed, 
4fd0: 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20  we have to look 
4fe0: 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72  at our own inter
4ff0: 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
5000: 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65  e.** locks to se
5010: 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72  e if another thr
5020: 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75 73  ead has previous
5030: 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e  ly set a lock on
5040: 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e   that same.** in
5050: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64  ode..**.** (Asid
5060: 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e  e: The use of in
5070: 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75  ode numbers as u
5080: 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e  nique IDs does n
5090: 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72  ot work on VxWor
50a0: 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72  ks..** For VxWor
50b0: 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75  ks, we have to u
50c0: 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69  se the alternati
50d0: 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79 73  ve unique ID sys
50e0: 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  tem based on.** 
50f0: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
5100: 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74  me and implement
5110: 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ed in the previo
5120: 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a  us division.).**
5130: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
5140: 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66  file structure f
5150: 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c  or POSIX is no l
5160: 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e  onger just an in
5170: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
5180: 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73  scriptor.  It is
5190: 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65   now a structure
51a0: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
51b0: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
51c0: 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61  descriptor and a
51d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
51e0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
51f0: 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72  cribes the inter
5200: 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20  nal.** locks on 
5210: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
5220: 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20  g inode.  There 
5230: 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73  is one locking s
5240: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20  tructure.** per 
5250: 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65  inode, so if the
5260: 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f   same inode is o
5270: 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74  pened twice, bot
5280: 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  h unixFile struc
5290: 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74  tures.** point t
52a0: 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69  o the same locki
52b0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ng structure.  T
52c0: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  he locking struc
52d0: 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20  ture keeps.** a 
52e0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
52f0: 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  (so we will know
5300: 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20   when to delete 
5310: 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a  it) and a "cnt".
5320: 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74 65  ** field that te
5330: 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65 72  lls us its inter
5340: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e  nal lock status.
5350: 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74    cnt==0 means t
5360: 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e  he.** file is un
5370: 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31  locked.  cnt==-1
5380: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20   means the file 
5390: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
53a0: 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20   lock..** cnt>0 
53b0: 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20  means there are 
53c0: 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cnt shared locks
53d0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   on the file..**
53e0: 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20  .** Any attempt 
53f0: 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
5400: 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20 63  k a file first c
5410: 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e  hecks the lockin
5420: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  g.** structure. 
5430: 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   The fcntl() sys
5440: 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79  tem call is only
5450: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
5460: 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  a .** POSIX lock
5470: 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   if the internal
5480: 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20   lock structure 
5490: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77  transitions betw
54a0: 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20  een.** a locked 
54b0: 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20  and an unlocked 
54c0: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74  state..**.** But
54d0: 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61 72   wait:  there ar
54e0: 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c  e yet more probl
54f0: 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20 61  ems with POSIX a
5500: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a  dvisory locks..*
5510: 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73  *.** If you clos
5520: 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  e a file descrip
5530: 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  tor that points 
5540: 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  to a file that h
5550: 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c  as locks,.** all
5560: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66   locks on that f
5570: 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e  ile that are own
5580: 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
5590: 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a  t process are.**
55a0: 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77   released.  To w
55b0: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20  ork around this 
55c0: 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e  problem, each un
55d0: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
55e0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 70   contains.** a p
55f0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 75 6e 69  ointer to an uni
5600: 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75  xOpenCnt structu
5610: 72 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e  re.  There is on
5620: 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74  e unixOpenCnt st
5630: 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 6f  ructure.** per o
5640: 70 65 6e 20 69 6e 6f 64 65 2c 20 77 68 69 63 68  pen inode, which
5650: 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 75 6c 74   means that mult
5660: 69 70 6c 65 20 75 6e 69 78 46 69 6c 65 20 63 61  iple unixFile ca
5670: 6e 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e  n point to a sin
5680: 67 6c 65 0a 2a 2a 20 75 6e 69 78 4f 70 65 6e 43  gle.** unixOpenC
5690: 6e 74 2e 20 20 57 68 65 6e 20 61 6e 20 61 74 74  nt.  When an att
56a0: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
56b0: 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c  close an unixFil
56c0: 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  e, if there are.
56d0: 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c  ** other unixFil
56e0: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  e open on the sa
56f0: 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72  me inode that ar
5700: 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c  e holding locks,
5710: 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20   the call.** to 
5720: 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65  close() the file
5730: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64   descriptor is d
5740: 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c  eferred until al
5750: 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63  l of the locks c
5760: 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69  lear..** The uni
5770: 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75  xOpenCnt structu
5780: 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20  re keeps a list 
5790: 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  of file descript
57a0: 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
57b0: 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  .** be closed an
57c0: 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77  d that list is w
57d0: 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72  alked (and clear
57e0: 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ed) when the las
57f0: 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73  t lock.** clears
5800: 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74  ..**.** Yet anot
5810: 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69  her problem:  Li
5820: 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f  nuxThreads do no
5830: 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68  t play well with
5840: 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a   posix locks..**
5850: 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76  .** Many older v
5860: 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78  ersions of linux
5870: 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68   use the LinuxTh
5880: 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77 68  reads library wh
5890: 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f  ich is.** not po
58a0: 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20  six compliant.  
58b0: 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61  Under LinuxThrea
58c0: 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74  ds, a lock creat
58d0: 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20  ed by thread.** 
58e0: 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69  A cannot be modi
58f0: 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64  fied or overridd
5900: 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65 6e  en by a differen
5910: 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f  t thread B..** O
5920: 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61 6e  nly thread A can
5930: 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b   modify the lock
5940: 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76  .  Locking behav
5950: 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a  ior is correct.*
5960: 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61 74  * if the appliat
5970: 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77  ion uses the new
5980: 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20  er Native Posix 
5990: 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20 28  Thread Library (
59a0: 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75  NPTL).** on linu
59b0: 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20  x - with NPTL a 
59c0: 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20  lock created by 
59d0: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65  thread A can ove
59e0: 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69  rride locks.** i
59f0: 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75 74  n thread B.  But
5a00: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
5a10: 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70   to know at comp
5a20: 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a  ile-time which.*
5a30: 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72  * threading libr
5a40: 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65  ary is being use
5a50: 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20  d.  So there is 
5a60: 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61  no way to know a
5a70: 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t.** compile-tim
5a80: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
5a90: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
5aa0: 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20  erride locks on 
5ab0: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 57 65 20  thread B..** We 
5ac0: 68 61 76 65 20 74 6f 20 64 6f 20 61 20 72 75 6e  have to do a run
5ad0: 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64  -time check to d
5ae0: 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68 61  iscover the beha
5af0: 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63  vior of the.** c
5b00: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a  urrent process..
5b10: 2a 2a 0a 2a 2a 20 4f 6e 20 73 79 73 74 65 6d 73  **.** On systems
5b20: 20 77 68 65 72 65 20 74 68 72 65 61 64 20 41 20   where thread A 
5b30: 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6d 6f 64  is unable to mod
5b40: 69 66 79 20 6c 6f 63 6b 73 20 63 72 65 61 74 65  ify locks create
5b50: 64 20 62 79 0a 2a 2a 20 74 68 72 65 61 64 20 42  d by.** thread B
5b60: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6b 65 65  , we have to kee
5b70: 70 20 74 72 61 63 6b 20 6f 66 20 77 68 69 63 68  p track of which
5b80: 20 74 68 72 65 61 64 20 63 72 65 61 74 65 64 20   thread created 
5b90: 65 61 63 68 0a 2a 2a 20 6c 6f 63 6b 2e 20 20 48  each.** lock.  H
5ba0: 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 61 6e  ence there is an
5bb0: 20 65 78 74 72 61 20 66 69 65 6c 64 20 69 6e 20   extra field in 
5bc0: 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 75  the key to the u
5bd0: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20 73  nixLockInfo.** s
5be0: 74 72 75 63 74 75 72 65 20 74 6f 20 72 65 63 6f  tructure to reco
5bf0: 72 64 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  rd this informat
5c00: 69 6f 6e 2e 20 20 41 6e 64 20 6f 6e 20 74 68 6f  ion.  And on tho
5c10: 73 65 20 73 79 73 74 65 6d 73 20 69 74 0a 2a 2a  se systems it.**
5c20: 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 62   is illegal to b
5c30: 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
5c40: 6f 6e 20 69 6e 20 6f 6e 65 20 74 68 72 65 61 64  on in one thread
5c50: 20 61 6e 64 20 66 69 6e 69 73 68 20 69 74 0a 2a   and finish it.*
5c60: 2a 20 69 6e 20 61 6e 6f 74 68 65 72 2e 20 20 46  * in another.  F
5c70: 6f 72 20 74 68 69 73 20 6c 61 74 74 65 72 20 72  or this latter r
5c80: 65 73 74 72 69 63 74 69 6f 6e 2c 20 74 68 65 72  estriction, ther
5c90: 65 20 69 73 20 6e 6f 20 77 6f 72 6b 2d 61 72 6f  e is no work-aro
5ca0: 75 6e 64 2e 0a 2a 2a 20 49 74 20 69 73 20 61 20  und..** It is a 
5cb0: 6c 69 6d 69 74 61 74 69 6f 6e 20 6f 66 20 4c 69  limitation of Li
5cc0: 6e 75 78 54 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a  nuxThreads..*/..
5cd0: 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 68 65  /*.** Set or che
5ce0: 63 6b 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  ck the unixFile.
5cf0: 74 69 64 20 66 69 65 6c 64 2e 20 20 54 68 69 73  tid field.  This
5d00: 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 77 68   field is set wh
5d10: 65 6e 20 61 6e 20 75 6e 69 78 46 69 6c 65 0a 2a  en an unixFile.*
5d20: 2a 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65  * is first opene
5d30: 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65  d.  All subseque
5d40: 6e 74 20 75 73 65 73 20 6f 66 20 74 68 65 20 75  nt uses of the u
5d50: 6e 69 78 46 69 6c 65 20 76 65 72 69 66 79 20 74  nixFile verify t
5d60: 68 61 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  hat the.** same 
5d70: 74 68 72 65 61 64 20 69 73 20 6f 70 65 72 61 74  thread is operat
5d80: 69 6e 67 20 6f 6e 20 74 68 65 20 75 6e 69 78 46  ing on the unixF
5d90: 69 6c 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72 61  ile.  Some opera
5da0: 74 69 6e 67 20 73 79 73 74 65 6d 73 20 64 6f 0a  ting systems do.
5db0: 2a 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f 63  ** not allow loc
5dc0: 6b 73 20 74 6f 20 62 65 20 6f 76 65 72 72 69 64  ks to be overrid
5dd0: 64 65 6e 20 62 79 20 6f 74 68 65 72 20 74 68 72  den by other thr
5de0: 65 61 64 73 20 61 6e 64 20 74 68 61 74 20 72 65  eads and that re
5df0: 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65 61  striction.** mea
5e00: 6e 73 20 74 68 61 74 20 73 71 6c 69 74 65 33 2a  ns that sqlite3*
5e10: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
5e20: 73 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76 65  s cannot be move
5e30: 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61  d from one threa
5e40: 64 0a 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72 20  d.** to another 
5e50: 77 68 69 6c 65 20 6c 6f 63 6b 73 20 61 72 65 20  while locks are 
5e60: 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 56 65 72 73  held..**.** Vers
5e70: 69 6f 6e 20 33 2e 33 2e 31 20 28 32 30 30 36 2d  ion 3.3.1 (2006-
5e80: 30 31 2d 31 35 29 3a 20 20 75 6e 69 78 46 69 6c  01-15):  unixFil
5e90: 65 20 63 61 6e 20 62 65 20 6d 6f 76 65 64 20 66  e can be moved f
5ea0: 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 20 74  rom one thread t
5eb0: 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 61 73 20  o.** another as 
5ec0: 6c 6f 6e 67 20 61 73 20 77 65 20 61 72 65 20 72  long as we are r
5ed0: 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 73 79 73 74  unning on a syst
5ee0: 65 6d 20 74 68 61 74 20 73 75 70 70 6f 72 74 73  em that supports
5ef0: 20 74 68 72 65 61 64 73 0a 2a 2a 20 6f 76 65 72   threads.** over
5f00: 72 69 64 69 6e 67 20 65 61 63 68 20 6f 74 68 65  riding each othe
5f10: 72 73 20 6c 6f 63 6b 73 20 28 77 68 69 63 68 20  rs locks (which 
5f20: 69 73 20 6e 6f 77 20 74 68 65 20 6d 6f 73 74 20  is now the most 
5f30: 63 6f 6d 6d 6f 6e 20 62 65 68 61 76 69 6f 72 29  common behavior)
5f40: 0a 2a 2a 20 6f 72 20 69 66 20 6e 6f 20 6c 6f 63  .** or if no loc
5f50: 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 42 75  ks are held.  Bu
5f60: 74 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 70  t the unixFile.p
5f70: 4c 6f 63 6b 20 66 69 65 6c 64 20 6e 65 65 64 73  Lock field needs
5f80: 20 74 6f 20 62 65 0a 2a 2a 20 72 65 63 6f 6d 70   to be.** recomp
5f90: 75 74 65 64 20 62 65 63 61 75 73 65 20 69 74 73  uted because its
5fa0: 20 6b 65 79 20 69 6e 63 6c 75 64 65 73 20 74 68   key includes th
5fb0: 65 20 74 68 72 65 61 64 2d 69 64 2e 20 20 53 65  e thread-id.  Se
5fc0: 65 20 74 68 65 20 0a 2a 2a 20 74 72 61 6e 73 66  e the .** transf
5fd0: 65 72 4f 77 6e 65 72 73 68 69 70 28 29 20 66 75  erOwnership() fu
5fe0: 6e 63 74 69 6f 6e 20 62 65 6c 6f 77 20 66 6f 72  nction below for
5ff0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
6000: 72 6d 61 74 69 6f 6e 0a 2a 2f 0a 23 69 66 20 53  rmation.*/.#if S
6010: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
6020: 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69   && defined(__li
6030: 6e 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20  nux__).# define 
6040: 53 45 54 5f 54 48 52 45 41 44 49 44 28 58 29 20  SET_THREADID(X) 
6050: 20 20 28 58 29 2d 3e 74 69 64 20 3d 20 70 74 68    (X)->tid = pth
6060: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 20 64 65  read_self().# de
6070: 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41  fine CHECK_THREA
6080: 44 49 44 28 58 29 20 28 74 68 72 65 61 64 73 4f  DID(X) (threadsO
6090: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
60a0: 73 4c 6f 63 6b 73 3d 3d 30 20 26 26 20 5c 0a 20  sLocks==0 && \. 
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60c0: 20 20 20 20 20 20 20 20 20 20 20 21 70 74 68 72             !pthr
60d0: 65 61 64 5f 65 71 75 61 6c 28 28 58 29 2d 3e 74  ead_equal((X)->t
60e0: 69 64 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66  id, pthread_self
60f0: 28 29 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  ())).#else.# def
6100: 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49 44  ine SET_THREADID
6110: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45  (X).# define CHE
6120: 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20 30  CK_THREADID(X) 0
6130: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
6140: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
6150: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
6160: 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20  cture serves as 
6170: 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20  the key used.** 
6180: 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74  to locate a part
6190: 69 63 75 6c 61 72 20 75 6e 69 78 4f 70 65 6e 43  icular unixOpenC
61a0: 6e 74 20 73 74 72 75 63 74 75 72 65 20 67 69 76  nt structure giv
61b0: 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e 20 20 54  en its inode.  T
61c0: 68 69 73 0a 2a 2a 20 69 73 20 74 68 65 20 73 61  his.** is the sa
61d0: 6d 65 20 61 73 20 74 68 65 20 75 6e 69 78 4c 6f  me as the unixLo
61e0: 63 6b 4b 65 79 20 65 78 63 65 70 74 20 74 68 61  ckKey except tha
61f0: 74 20 74 68 65 20 74 68 72 65 61 64 20 49 44 20  t the thread ID 
6200: 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73  is omitted..*/.s
6210: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
6220: 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20   {.  dev_t dev; 
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6240: 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65   /* Device numbe
6250: 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f  r */.#if OS_VXWO
6260: 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78 77  RKS.  struct vxw
6270: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b  orksFileId *pId;
6280: 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65    /* Unique file
6290: 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e   ID for vxworks.
62a0: 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f   */.#else.  ino_
62b0: 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  t ino;          
62c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65          /* Inode
62d0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69   number */.#endi
62e0: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  f.};../*.** An i
62f0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
6300: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
6310: 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65  re serves as the
6320: 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20   key used.** to 
6330: 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75  locate a particu
6340: 6c 61 72 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  lar unixLockInfo
6350: 20 73 74 72 75 63 74 75 72 65 20 67 69 76 65 6e   structure given
6360: 20 69 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a   its inode..**.*
6370: 2a 20 49 66 20 74 68 72 65 61 64 73 20 63 61 6e  * If threads can
6380: 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61 63  not override eac
6390: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 28  h others locks (
63a0: 4c 69 6e 75 78 54 68 72 65 61 64 73 29 2c 20 74  LinuxThreads), t
63b0: 68 65 6e 20 77 65 0a 2a 2a 20 73 65 74 20 74 68  hen we.** set th
63c0: 65 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 2e 74 69  e unixLockKey.ti
63d0: 64 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 74  d field to the t
63e0: 68 72 65 61 64 20 49 44 2e 20 20 49 66 20 74 68  hread ID.  If th
63f0: 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69  reads can overri
6400: 64 65 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65 72  de.** each other
6410: 73 20 6c 6f 63 6b 73 20 28 50 6f 73 69 78 20 61  s locks (Posix a
6420: 6e 64 20 4e 50 54 4c 29 20 74 68 65 6e 20 74 69  nd NPTL) then ti
6430: 64 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  d is always set 
6440: 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 74 69 64 20  to zero..** tid 
6450: 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 77 65  is omitted if we
6460: 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 6f 75 74   compile without
6470: 20 74 68 72 65 61 64 69 6e 67 20 73 75 70 70 6f   threading suppo
6480: 72 74 20 6f 72 20 6f 6e 20 61 6e 20 4f 53 0a 2a  rt or on an OS.*
6490: 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 6c 69 6e  * other than lin
64a0: 75 78 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  ux..*/.struct un
64b0: 69 78 4c 6f 63 6b 4b 65 79 20 7b 0a 20 20 73 74  ixLockKey {.  st
64c0: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
64d0: 66 69 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20  fid;  /* Unique 
64e0: 69 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20 74  identifier for t
64f0: 68 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66 20 53  he file */.#if S
6500: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
6510: 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69   && defined(__li
6520: 6e 75 78 5f 5f 29 0a 20 20 70 74 68 72 65 61 64  nux__).  pthread
6530: 5f 74 20 74 69 64 3b 20 20 2f 2a 20 54 68 72 65  _t tid;  /* Thre
6540: 61 64 20 49 44 20 6f 66 20 6c 6f 63 6b 20 6f 77  ad ID of lock ow
6550: 6e 65 72 2e 20 5a 65 72 6f 20 69 66 20 6e 6f 74  ner. Zero if not
6560: 20 75 73 69 6e 67 20 4c 69 6e 75 78 54 68 72 65   using LinuxThre
6570: 61 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ads */.#endif.};
6580: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
6590: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
65a0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
65b0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
65c0: 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f  each open.** ino
65d0: 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75  de.  Or, on Linu
65e0: 78 54 68 72 65 61 64 73 2c 20 74 68 65 72 65 20  xThreads, there 
65f0: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20  is one of these 
6600: 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a  structures for.*
6610: 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65  * each inode ope
6620: 6e 65 64 20 62 79 20 65 61 63 68 20 74 68 72 65  ned by each thre
6630: 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67  ad..**.** A sing
6640: 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76  le inode can hav
6650: 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20  e multiple file 
6660: 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20  descriptors, so 
6670: 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a  each unixFile.**
6680: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
6690: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
66a0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
66b0: 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20  this object and 
66c0: 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b  this.** object k
66d0: 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20  eeps a count of 
66e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e  the number of un
66f0: 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20  ixFile pointing 
6700: 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  to it..*/.struct
6710: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 7b 0a   unixLockInfo {.
6720: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63    struct unixLoc
6730: 6b 4b 65 79 20 6c 6f 63 6b 4b 65 79 3b 20 20 20  kKey lockKey;   
6740: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
6750: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  key */.  int cnt
6760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6770: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6780: 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63  er of SHARED loc
6790: 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  ks held */.  int
67a0: 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20   locktype;      
67b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
67c0: 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f  One of SHARED_LO
67d0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
67e0: 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  K etc. */.  int 
67f0: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
6800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6810: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
6820: 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74  s to this struct
6830: 75 72 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ure */.#if defin
6840: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
6850: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a  _LOCKING_STYLE).
6860: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
6870: 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b  long sharedByte;
6880: 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d    /* for AFP sim
6890: 75 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f  ulated shared lo
68a0: 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 73  ck */.#endif.  s
68b0: 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e  truct unixLockIn
68c0: 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 2f  fo *pNext;     /
68d0: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e  * List of all un
68e0: 69 78 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63  ixLockInfo objec
68f0: 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  ts */.  struct u
6900: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 50 72  nixLockInfo *pPr
6910: 65 76 3b 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e  ev;     /*    ..
6920: 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64  .. doubly linked
6930: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
6940: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
6950: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
6960: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
6970: 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a  d for each open.
6980: 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68 69 73 20  ** inode.  This 
6990: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
69a0: 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6e 75 6d  track of the num
69b0: 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 6f 6e 20  ber of locks on 
69c0: 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20  that.** inode.  
69d0: 49 66 20 61 20 63 6c 6f 73 65 20 69 73 20 61 74  If a close is at
69e0: 74 65 6d 70 74 65 64 20 61 67 61 69 6e 73 74 20  tempted against 
69f0: 61 6e 20 69 6e 6f 64 65 20 74 68 61 74 20 69 73  an inode that is
6a00: 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c 6f 63 6b   holding.** lock
6a10: 73 2c 20 74 68 65 20 63 6c 6f 73 65 20 69 73 20  s, the close is 
6a20: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
6a30: 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61 72 20 62  ll locks clear b
6a40: 79 20 61 64 64 69 6e 67 20 74 68 65 0a 2a 2a 20  y adding the.** 
6a50: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6a60: 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 74 6f 20  to be closed to 
6a70: 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 69 73 74  the pending list
6a80: 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 20 43  ..**.** TODO:  C
6a90: 6f 6e 73 69 64 65 72 20 63 68 61 6e 67 69 6e 67  onsider changing
6aa0: 20 74 68 69 73 20 73 6f 20 74 68 61 74 20 74 68   this so that th
6ab0: 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69  ere is only a si
6ac0: 6e 67 6c 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73  ngle file.** des
6ad0: 63 72 69 70 74 6f 72 20 66 6f 72 20 65 61 63 68  criptor for each
6ae0: 20 6f 70 65 6e 20 66 69 6c 65 2c 20 65 76 65 6e   open file, even
6af0: 20 77 68 65 6e 20 69 74 20 69 73 20 6f 70 65 6e   when it is open
6b00: 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ed multiple time
6b10: 73 2e 0a 2a 2a 20 54 68 65 20 63 6c 6f 73 65 28  s..** The close(
6b20: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 6f  ) system call wo
6b30: 75 6c 64 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77  uld only occur w
6b40: 68 65 6e 20 74 68 65 20 6c 61 73 74 20 64 61 74  hen the last dat
6b50: 61 62 61 73 65 0a 2a 2a 20 75 73 69 6e 67 20 74  abase.** using t
6b60: 68 65 20 66 69 6c 65 20 63 6c 6f 73 65 73 2e 0a  he file closes..
6b70: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 4f 70  */.struct unixOp
6b80: 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75 63 74  enCnt {.  struct
6b90: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
6ba0: 49 64 3b 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f  Id;   /* The loo
6bb0: 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  kup key */.  int
6bc0: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
6bd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6be0: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  er of pointers t
6bf0: 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  o this structure
6c00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b   */.  int nLock;
6c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
6c30: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
6c40: 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   */.  UnixUnused
6c50: 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20  Fd *pUnused;    
6c60: 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65    /* Unused file
6c70: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20   descriptors to 
6c80: 63 6c 6f 73 65 20 2a 2f 0a 23 69 66 20 4f 53 5f  close */.#if OS_
6c90: 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20  VXWORKS.  sem_t 
6ca0: 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20  *pSem;          
6cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
6cc0: 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68  med POSIX semaph
6cd0: 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  ore */.  char aS
6ce0: 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  emName[MAX_PATHN
6cf0: 41 4d 45 2b 32 5d 3b 20 20 20 2f 2a 20 4e 61 6d  AME+2];   /* Nam
6d00: 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68  e of that semaph
6d10: 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ore */.#endif.  
6d20: 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43  struct unixOpenC
6d30: 6e 74 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65  nt *pNext, *pPre
6d40: 76 3b 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  v;   /* List of 
6d50: 61 6c 6c 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  all unixOpenCnt 
6d60: 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  objects */.};../
6d70: 2a 0a 2a 2a 20 4c 69 73 74 73 20 6f 66 20 61 6c  *.** Lists of al
6d80: 6c 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 61  l unixLockInfo a
6d90: 6e 64 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 6f  nd unixOpenCnt o
6da0: 62 6a 65 63 74 73 2e 20 20 54 68 65 73 65 20 75  bjects.  These u
6db0: 73 65 64 20 74 6f 20 62 65 20 68 61 73 68 0a 2a  sed to be hash.*
6dc0: 2a 20 74 61 62 6c 65 73 2e 20 20 42 75 74 20 74  * tables.  But t
6dd0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  he number of obj
6de0: 65 63 74 73 20 69 73 20 72 61 72 65 6c 79 20 6d  ects is rarely m
6df0: 6f 72 65 20 74 68 61 6e 20 61 20 64 6f 7a 65 6e  ore than a dozen
6e00: 20 61 6e 64 0a 2a 2a 20 6e 65 76 65 72 20 65 78   and.** never ex
6e10: 63 65 65 64 73 20 61 20 66 65 77 20 74 68 6f 75  ceeds a few thou
6e20: 73 61 6e 64 2e 20 20 41 6e 64 20 6c 6f 6f 6b 75  sand.  And looku
6e30: 70 20 69 73 20 6e 6f 74 20 6f 6e 20 61 20 63 72  p is not on a cr
6e40: 69 74 69 63 61 6c 0a 2a 2a 20 70 61 74 68 20 73  itical.** path s
6e50: 6f 20 61 20 73 69 6d 70 6c 65 20 6c 69 6e 6b 65  o a simple linke
6e60: 64 20 6c 69 73 74 20 77 69 6c 6c 20 73 75 66 66  d list will suff
6e70: 69 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ice..*/.static s
6e80: 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e  truct unixLockIn
6e90: 66 6f 20 2a 6c 6f 63 6b 4c 69 73 74 20 3d 20 30  fo *lockList = 0
6ea0: 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ;.static struct 
6eb0: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 6f 70 65  unixOpenCnt *ope
6ec0: 6e 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  nList = 0;../*.*
6ed0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
6ee0: 72 65 6d 65 6d 62 65 72 73 20 77 68 65 74 68 65  remembers whethe
6ef0: 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73  r or not threads
6f00: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
6f10: 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f 63  ch others.** loc
6f20: 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20  ks..**.**    0: 
6f30: 20 4e 6f 2e 20 20 54 68 72 65 61 64 73 20 63 61   No.  Threads ca
6f40: 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61  nnot override ea
6f50: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
6f60: 20 20 28 4c 69 6e 75 78 54 68 72 65 61 64 73 29    (LinuxThreads)
6f70: 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65 73 2e 20  .**    1:  Yes. 
6f80: 20 54 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65   Threads can ove
6f90: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
6fa0: 73 20 6c 6f 63 6b 73 2e 20 20 28 50 6f 73 69 78  s locks.  (Posix
6fb0: 20 26 20 4e 4c 50 54 29 0a 2a 2a 20 20 20 2d 31   & NLPT).**   -1
6fc0: 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e 6f 77  :  We don't know
6fd0: 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73   yet..**.** On s
6fe0: 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 77 65 20  ome systems, we 
6ff0: 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d  know at compile-
7000: 74 69 6d 65 20 69 66 20 74 68 72 65 61 64 73 20  time if threads 
7010: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63  can override eac
7020: 68 0a 2a 2a 20 6f 74 68 65 72 73 20 6c 6f 63 6b  h.** others lock
7030: 73 2e 20 20 4f 6e 20 74 68 6f 73 65 20 73 79 73  s.  On those sys
7040: 74 65 6d 73 2c 20 74 68 65 20 53 51 4c 49 54 45  tems, the SQLITE
7050: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
7060: 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a 2a 20 77  _LOCK macro.** w
7070: 69 6c 6c 20 62 65 20 73 65 74 20 61 70 70 72 6f  ill be set appro
7080: 70 72 69 61 74 65 6c 79 2e 20 20 4f 6e 20 6f 74  priately.  On ot
7090: 68 65 72 20 73 79 73 74 65 6d 73 2c 20 77 65 20  her systems, we 
70a0: 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20 61 74  have to check at
70b0: 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e 20 20 4f 6e  .** runtime.  On
70c0: 20 74 68 65 73 65 20 6c 61 74 74 65 72 20 73 79   these latter sy
70d0: 73 74 65 6d 73 2c 20 53 51 4c 54 49 45 5f 54 48  stems, SQLTIE_TH
70e0: 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f  READ_OVERRIDE_LO
70f0: 43 4b 20 69 73 0a 2a 2a 20 75 6e 64 65 66 69 6e  CK is.** undefin
7100: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76  ed..**.** This v
7110: 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c 79  ariable normally
7120: 20 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65 20   has file scope 
7130: 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75 72 69 6e  only.  But durin
7140: 67 20 74 65 73 74 69 6e 67 2c 20 77 65 20 6d 61  g testing, we ma
7150: 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f 62 61  ke.** it a globa
7160: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 74 65  l so that the te
7170: 73 74 20 63 6f 64 65 20 63 61 6e 20 63 68 61 6e  st code can chan
7180: 67 65 20 69 74 73 20 76 61 6c 75 65 20 69 6e 20  ge its value in 
7190: 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79 0a  order to verify.
71a0: 2a 2a 20 74 68 61 74 20 74 68 65 20 72 69 67 68  ** that the righ
71b0: 74 20 73 74 75 66 66 20 68 61 70 70 65 6e 73 20  t stuff happens 
71c0: 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e 0a  in either case..
71d0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
71e0: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
71f0: 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23  ned(__linux__).#
7200: 20 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f    ifndef SQLITE_
7210: 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f  THREAD_OVERRIDE_
7220: 4c 4f 43 4b 0a 23 20 20 20 20 64 65 66 69 6e 65  LOCK.#    define
7230: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f   SQLITE_THREAD_O
7240: 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 2d 31 0a  VERRIDE_LOCK -1.
7250: 23 20 20 65 6e 64 69 66 0a 23 20 20 69 66 64 65  #  endif.#  ifde
7260: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
7270: 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  t threadsOverrid
7280: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
7290: 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44   = SQLITE_THREAD
72a0: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a  _OVERRIDE_LOCK;.
72b0: 23 20 20 65 6c 73 65 0a 73 74 61 74 69 63 20 69  #  else.static i
72c0: 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  nt threadsOverri
72d0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
72e0: 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41  s = SQLITE_THREA
72f0: 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b  D_OVERRIDE_LOCK;
7300: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
7310: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72  ../*.** This str
7320: 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e 66  ucture holds inf
7330: 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20  ormation passed 
7340: 69 6e 74 6f 20 69 6e 64 69 76 69 64 75 61 6c 20  into individual 
7350: 74 65 73 74 0a 2a 2a 20 74 68 72 65 61 64 73 20  test.** threads 
7360: 62 79 20 74 68 65 20 74 65 73 74 54 68 72 65 61  by the testThrea
7370: 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72  dLockingBehavior
7380: 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  () routine..*/.s
7390: 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74  truct threadTest
73a0: 44 61 74 61 20 7b 0a 20 20 69 6e 74 20 66 64 3b  Data {.  int fd;
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73c0: 2f 2a 20 46 69 6c 65 20 74 6f 20 62 65 20 6c 6f  /* File to be lo
73d0: 63 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  cked */.  struct
73e0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20 20   flock lock;    
73f0: 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20   /* The locking 
7400: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
7410: 6e 74 20 72 65 73 75 6c 74 3b 20 20 20 20 20 20  nt result;      
7420: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
7430: 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6f  of the locking o
7440: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a  peration */.};..
7450: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
7460: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
7470: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a 0a 2a  (__linux__)./*.*
7480: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
7490: 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 6d  is used as the m
74a0: 61 69 6e 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ain routine for 
74b0: 61 20 74 68 72 65 61 64 20 6c 61 75 6e 63 68 65  a thread launche
74c0: 64 20 62 79 0a 2a 2a 20 74 65 73 74 54 68 72 65  d by.** testThre
74d0: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
74e0: 72 28 29 2e 20 49 74 20 74 65 73 74 73 20 77 68  r(). It tests wh
74f0: 65 74 68 65 72 20 74 68 65 20 73 68 61 72 65 64  ether the shared
7500: 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 2a  -lock obtained.*
7510: 2a 20 62 79 20 74 68 65 20 6d 61 69 6e 20 74 68  * by the main th
7520: 72 65 61 64 20 69 6e 20 74 65 73 74 54 68 72 65  read in testThre
7530: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
7540: 72 28 29 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  r() conflicts wi
7550: 74 68 20 61 0a 2a 2a 20 68 79 70 6f 74 68 65 74  th a.** hypothet
7560: 69 63 61 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ical write-lock 
7570: 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69 73  obtained by this
7580: 20 74 68 72 65 61 64 20 6f 6e 20 74 68 65 20 73   thread on the s
7590: 61 6d 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ame file..**.** 
75a0: 54 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  The write-lock i
75b0: 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  s not actually a
75c0: 63 71 75 69 72 65 64 2c 20 61 73 20 74 68 69 73  cquired, as this
75d0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
75e0: 20 69 66 20 0a 2a 2a 20 74 68 65 20 66 69 6c 65   if .** the file
75f0: 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 65 61 64   is open in read
7600: 2d 6f 6e 6c 79 20 6d 6f 64 65 20 28 73 65 65 20  -only mode (see 
7610: 74 69 63 6b 65 74 20 23 33 34 37 32 29 2e 0a 2a  ticket #3472)..*
7620: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  / .static void *
7630: 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73  threadLockingTes
7640: 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  t(void *pArg){. 
7650: 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65   struct threadTe
7660: 73 74 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20  stData *pData = 
7670: 28 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65  (struct threadTe
7680: 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a 20 20  stData*)pArg;.  
7690: 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20 3d 20  pData->result = 
76a0: 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66 64 2c  fcntl(pData->fd,
76b0: 20 46 5f 47 45 54 4c 4b 2c 20 26 70 44 61 74 61   F_GETLK, &pData
76c0: 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75 72  ->lock);.  retur
76d0: 6e 20 70 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66  n pArg;.}.#endif
76e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52 45 41   /* SQLITE_THREA
76f0: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
7700: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 2a 2f 0a 0a  (__linux__) */..
7710: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
7720: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
7730: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a 0a  d(__linux__)./*.
7740: 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  ** This procedur
7750: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  e attempts to de
7760: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
7770: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a 2a  or not threads.*
7780: 2a 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  * can override e
7790: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
77a0: 20 74 68 65 6e 20 73 65 74 73 20 74 68 65 20 0a   then sets the .
77b0: 2a 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  ** threadsOverri
77c0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
77d0: 73 20 76 61 72 69 61 62 6c 65 20 61 70 70 72 6f  s variable appro
77e0: 70 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  priately..*/.sta
77f0: 74 69 63 20 76 6f 69 64 20 74 65 73 74 54 68 72  tic void testThr
7800: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
7810: 6f 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29 7b  or(int fd_orig){
7820: 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e 74  .  int fd;.  int
7830: 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 74 68   rc;.  struct th
7840: 72 65 61 64 54 65 73 74 44 61 74 61 20 64 3b 0a  readTestData d;.
7850: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
7860: 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 3b  ;.  pthread_t t;
7870: 0a 0a 20 20 66 64 20 3d 20 64 75 70 28 66 64 5f  ..  fd = dup(fd_
7880: 6f 72 69 67 29 3b 0a 20 20 69 66 28 20 66 64 3c  orig);.  if( fd<
7890: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  0 ) return;.  me
78a0: 6d 73 65 74 28 26 6c 2c 20 30 2c 20 73 69 7a 65  mset(&l, 0, size
78b0: 6f 66 28 6c 29 29 3b 0a 20 20 6c 2e 6c 5f 74 79  of(l));.  l.l_ty
78c0: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
78d0: 6c 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  l.l_len = 1;.  l
78e0: 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
78f0: 6c 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  l.l_whence = SEE
7900: 4b 5f 53 45 54 3b 0a 20 20 72 63 20 3d 20 66 63  K_SET;.  rc = fc
7910: 6e 74 6c 28 66 64 5f 6f 72 69 67 2c 20 46 5f 53  ntl(fd_orig, F_S
7920: 45 54 4c 4b 2c 20 26 6c 29 3b 0a 20 20 69 66 28  ETLK, &l);.  if(
7930: 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 3b   rc!=0 ) return;
7940: 0a 20 20 6d 65 6d 73 65 74 28 26 64 2c 20 30 2c  .  memset(&d, 0,
7950: 20 73 69 7a 65 6f 66 28 64 29 29 3b 0a 20 20 64   sizeof(d));.  d
7960: 2e 66 64 20 3d 20 66 64 3b 0a 20 20 64 2e 6c 6f  .fd = fd;.  d.lo
7970: 63 6b 20 3d 20 6c 3b 0a 20 20 64 2e 6c 6f 63 6b  ck = l;.  d.lock
7980: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
7990: 4b 3b 0a 20 20 69 66 28 20 70 74 68 72 65 61 64  K;.  if( pthread
79a0: 5f 63 72 65 61 74 65 28 26 74 2c 20 30 2c 20 74  _create(&t, 0, t
79b0: 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74  hreadLockingTest
79c0: 2c 20 26 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , &d)==0 ){.    
79d0: 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74 2c 20  pthread_join(t, 
79e0: 30 29 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 28  0);.  }.  close(
79f0: 66 64 29 3b 0a 20 20 69 66 28 20 64 2e 72 65 73  fd);.  if( d.res
7a00: 75 6c 74 21 3d 30 20 29 20 72 65 74 75 72 6e 3b  ult!=0 ) return;
7a10: 0a 20 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  .  threadsOverri
7a20: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
7a30: 73 20 3d 20 28 64 2e 6c 6f 63 6b 2e 6c 5f 74 79  s = (d.lock.l_ty
7a40: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 29 3b 0a 7d 0a  pe==F_UNLCK);.}.
7a50: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7a60: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64  _THREADSAFE && d
7a70: 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
7a80: 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  ) */../*.** Rele
7a90: 61 73 65 20 61 20 75 6e 69 78 4c 6f 63 6b 49 6e  ase a unixLockIn
7aa0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72 65  fo structure pre
7ab0: 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
7ac0: 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66  d by findLockInf
7ad0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  o()..**.** The m
7ae0: 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69  utex entered usi
7af0: 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  ng the unixEnter
7b00: 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  Mutex() function
7b10: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
7b20: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
7b30: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
7b40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
7b50: 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73 74  leaseLockInfo(st
7b60: 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66  ruct unixLockInf
7b70: 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 61 73 73  o *pLock){.  ass
7b80: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
7b90: 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 4c  ld() );.  if( pL
7ba0: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
7bb0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
7bc0: 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d 30  ( pLock->nRef==0
7bd0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   ){.      if( pL
7be0: 6f 63 6b 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ock->pPrev ){.  
7bf0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
7c00: 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ock->pPrev->pNex
7c10: 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  t==pLock );.    
7c20: 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76      pLock->pPrev
7c30: 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 6f 63 6b 2d  ->pNext = pLock-
7c40: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
7c50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
7c60: 65 72 74 28 20 6c 6f 63 6b 4c 69 73 74 3d 3d 70  ert( lockList==p
7c70: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20  Lock );.        
7c80: 6c 6f 63 6b 4c 69 73 74 20 3d 20 70 4c 6f 63 6b  lockList = pLock
7c90: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
7ca0: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  .      if( pLock
7cb0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
7cc0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
7cd0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d  ->pNext->pPrev==
7ce0: 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 20  pLock );.       
7cf0: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 2d 3e 70   pLock->pNext->p
7d00: 50 72 65 76 20 3d 20 70 4c 6f 63 6b 2d 3e 70 50  Prev = pLock->pP
7d10: 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rev;.      }.   
7d20: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7d30: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  pLock);.    }.  
7d40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  }.}../*.** Relea
7d50: 73 65 20 61 20 75 6e 69 78 4f 70 65 6e 43 6e 74  se a unixOpenCnt
7d60: 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69   structure previ
7d70: 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
7d80: 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28  by findLockInfo(
7d90: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  )..**.** The mut
7da0: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
7db0: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
7dc0: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
7dd0: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
7de0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
7df0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
7e00: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
7e10: 61 73 65 4f 70 65 6e 43 6e 74 28 73 74 72 75 63  aseOpenCnt(struc
7e20: 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70  t unixOpenCnt *p
7e30: 4f 70 65 6e 29 7b 0a 20 20 61 73 73 65 72 74 28  Open){.  assert(
7e40: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
7e50: 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 65 6e 20   );.  if( pOpen 
7e60: 29 7b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52  ){.    pOpen->nR
7e70: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4f  ef--;.    if( pO
7e80: 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pen->nRef==0 ){.
7e90: 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d        if( pOpen-
7ea0: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
7eb0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d    assert( pOpen-
7ec0: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70  >pPrev->pNext==p
7ed0: 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  Open );.        
7ee0: 70 4f 70 65 6e 2d 3e 70 50 72 65 76 2d 3e 70 4e  pOpen->pPrev->pN
7ef0: 65 78 74 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65  ext = pOpen->pNe
7f00: 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
7f10: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7f20: 20 6f 70 65 6e 4c 69 73 74 3d 3d 70 4f 70 65 6e   openList==pOpen
7f30: 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e   );.        open
7f40: 4c 69 73 74 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e  List = pOpen->pN
7f50: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
7f60: 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 70 4e     if( pOpen->pN
7f70: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ext ){.        a
7f80: 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 70 4e  ssert( pOpen->pN
7f90: 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 4f 70 65  ext->pPrev==pOpe
7fa0: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  n );.        pOp
7fb0: 65 6e 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  en->pNext->pPrev
7fc0: 20 3d 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 3b   = pOpen->pPrev;
7fd0: 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  .      }.#if SQL
7fe0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
7ff0: 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  & defined(__linu
8000: 78 5f 5f 29 0a 20 20 20 20 20 20 61 73 73 65 72  x__).      asser
8010: 74 28 20 21 70 4f 70 65 6e 2d 3e 70 55 6e 75 73  t( !pOpen->pUnus
8020: 65 64 20 7c 7c 20 74 68 72 65 61 64 73 4f 76 65  ed || threadsOve
8030: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
8040: 6f 63 6b 73 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  ocks==0 );.#endi
8050: 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  f..      /* If p
8060: 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64 20 69 73  Open->pUnused is
8070: 20 6e 6f 74 20 6e 75 6c 6c 2c 20 74 68 65 6e 20   not null, then 
8080: 6d 65 6d 6f 72 79 20 61 6e 64 20 66 69 6c 65 2d  memory and file-
8090: 64 65 73 63 72 69 70 74 6f 72 73 0a 20 20 20 20  descriptors.    
80a0: 20 20 2a 2a 20 61 72 65 20 6c 65 61 6b 65 64 2e    ** are leaked.
80b0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
80c0: 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 6f 6e 6c  ** This will onl
80d0: 79 20 68 61 70 70 65 6e 20 69 66 2c 20 75 6e 64  y happen if, und
80e0: 65 72 20 4c 69 6e 75 78 74 68 72 65 61 64 73 2c  er Linuxthreads,
80f0: 20 74 68 65 20 75 73 65 72 20 68 61 73 20 6f 70   the user has op
8100: 65 6e 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 20  ened.      ** a 
8110: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6f  transaction in o
8120: 6e 65 20 74 68 72 65 61 64 2c 20 74 68 65 6e 20  ne thread, then 
8130: 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73  attempts to clos
8140: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  e the database. 
8150: 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 66       ** handle f
8160: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74 68 72 65  rom another thre
8170: 61 64 20 28 77 69 74 68 6f 75 74 20 66 69 72 73  ad (without firs
8180: 74 20 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 20  t unlocking the 
8190: 64 62 20 66 69 6c 65 29 2e 0a 20 20 20 20 20 20  db file)..      
81a0: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6d 69 73  ** This is a mis
81b0: 75 73 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73  use.  */.      s
81c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 70 65  qlite3_free(pOpe
81d0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  n);.    }.  }.}.
81e0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66  ./*.** Given a f
81f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
8200: 6c 6f 63 61 74 65 20 75 6e 69 78 4c 6f 63 6b 49  locate unixLockI
8210: 6e 66 6f 20 61 6e 64 20 75 6e 69 78 4f 70 65 6e  nfo and unixOpen
8220: 43 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 74  Cnt structures t
8230: 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73  hat.** describes
8240: 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72   that file descr
8250: 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 6e  iptor.  Create n
8260: 65 77 20 6f 6e 65 73 20 69 66 20 6e 65 63 65 73  ew ones if neces
8270: 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65  sary.  The.** re
8280: 74 75 72 6e 20 76 61 6c 75 65 73 20 6d 69 67 68  turn values migh
8290: 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  t be uninitializ
82a0: 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ed if an error o
82b0: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ccurs..**.** The
82c0: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
82d0: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
82e0: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
82f0: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
8300: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
8310: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
8320: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
8330: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
8340: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
8350: 69 63 20 69 6e 74 20 66 69 6e 64 4c 6f 63 6b 49  ic int findLockI
8360: 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20  nfo(.  unixFile 
8370: 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
8380: 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69        /* Unix fi
8390: 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73  le with file des
83a0: 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65  c used in the ke
83b0: 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  y */.  struct un
83c0: 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 2a 70 70 4c  ixLockInfo **ppL
83d0: 6f 63 6b 2c 20 20 2f 2a 20 52 65 74 75 72 6e 20  ock,  /* Return 
83e0: 74 68 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  the unixLockInfo
83f0: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
8400: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
8410: 4f 70 65 6e 43 6e 74 20 2a 2a 70 70 4f 70 65 6e  OpenCnt **ppOpen
8420: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
8430: 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74  e unixOpenCnt st
8440: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
8450: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8470: 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61      /* System ca
8480: 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  ll return code *
8490: 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  /.  int fd;     
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84b0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
84c0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46  escriptor for pF
84d0: 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ile */.  struct 
84e0: 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 6c 6f 63 6b  unixLockKey lock
84f0: 4b 65 79 3b 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75  Key;    /* Looku
8500: 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e  p key for the un
8510: 69 78 4c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63  ixLockInfo struc
8520: 74 75 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ture */.  struct
8530: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
8540: 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b  Id;      /* Look
8550: 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75  up key for the u
8560: 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63  nixOpenCnt struc
8570: 74 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  t */.  struct st
8580: 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
8590: 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76        /* Low-lev
85a0: 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74  el file informat
85b0: 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ion */.  struct 
85c0: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  unixLockInfo *pL
85d0: 6f 63 6b 20 3d 20 30 3b 2f 2a 20 43 61 6e 64 69  ock = 0;/* Candi
85e0: 64 61 74 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66  date unixLockInf
85f0: 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 74  o object */.  st
8600: 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74  ruct unixOpenCnt
8610: 20 2a 70 4f 70 65 6e 3b 20 20 20 20 20 2f 2a 20   *pOpen;     /* 
8620: 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 4f 70  Candidate unixOp
8630: 65 6e 43 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  enCnt object */.
8640: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
8650: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20  utexHeld() );.. 
8660: 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65   /* Get low-leve
8670: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
8680: 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 68 61  out the file tha
8690: 74 20 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f  t we can used to
86a0: 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75  .  ** create a u
86b0: 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74  nique name for t
86c0: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
86d0: 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
86e0: 20 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20   rc = fstat(fd, 
86f0: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28  &statbuf);.  if(
8700: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46   rc!=0 ){.    pF
8710: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
8720: 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45   errno;.#ifdef E
8730: 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28  OVERFLOW.    if(
8740: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
8750: 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72  o==EOVERFLOW ) r
8760: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c  eturn SQLITE_NOL
8770: 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  FS;.#endif.    r
8780: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
8790: 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  RR;.  }..#ifdef 
87a0: 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f  __APPLE__.  /* O
87b0: 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64  n OS X on an msd
87c0: 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74  os filesystem, t
87d0: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20  he inode number 
87e0: 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a  is reported.  **
87f0: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72   incorrectly for
8800: 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73   zero-size files
8810: 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 33  .  See ticket #3
8820: 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20  260.  To work.  
8830: 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  ** around this p
8840: 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69  roblem (we consi
8850: 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e 20  der it a bug in 
8860: 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65  OS X, not SQLite
8870: 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73  ).  ** we always
8880: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69   increase the fi
8890: 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20  le size to 1 by 
88a0: 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65  writing a single
88b0: 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72   byte.  ** prior
88c0: 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68   to accessing th
88d0: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20  e inode number. 
88e0: 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72   The one byte wr
88f0: 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e  itten is.  ** an
8900: 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61   ASCII 'S' chara
8910: 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20  cter which also 
8920: 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68  happens to be th
8930: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a  e first byte.  *
8940: 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  * in the header 
8950: 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 20  of every SQLite 
8960: 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68  database.  In th
8970: 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 65  is way, if there
8980: 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20  .  ** is a race 
8990: 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74  condition such t
89a0: 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  hat another thre
89b0: 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  ad has already p
89c0: 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68  opulated.  ** th
89d0: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
89e0: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f  the database, no
89f0: 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e   damage is done.
8a00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74  .  */.  if( stat
8a10: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26  buf.st_size==0 &
8a20: 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67  & (pFile->fsFlag
8a30: 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41  s & SQLITE_FSFLA
8a40: 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20  GS_IS_MSDOS)!=0 
8a50: 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  ){.    rc = writ
8a60: 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 0a 20  e(fd, "S", 1);. 
8a70: 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a     if( rc!=1 ){.
8a80: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
8a90: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
8aa0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8ab0: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
8ac0: 0a 20 20 20 20 72 63 20 3d 20 66 73 74 61 74 28  .    rc = fstat(
8ad0: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
8ae0: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
8af0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
8b00: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
8b10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8b20: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
8b30: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d  .  }.#endif..  m
8b40: 65 6d 73 65 74 28 26 6c 6f 63 6b 4b 65 79 2c 20  emset(&lockKey, 
8b50: 30 2c 20 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b 65  0, sizeof(lockKe
8b60: 79 29 29 3b 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66  y));.  lockKey.f
8b70: 69 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66  id.dev = statbuf
8b80: 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f  .st_dev;.#if OS_
8b90: 56 58 57 4f 52 4b 53 0a 20 20 6c 6f 63 6b 4b 65  VXWORKS.  lockKe
8ba0: 79 2e 66 69 64 2e 70 49 64 20 3d 20 70 46 69 6c  y.fid.pId = pFil
8bb0: 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20  e->pId;.#else.  
8bc0: 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e 69 6e 6f 20  lockKey.fid.ino 
8bd0: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f  = statbuf.st_ino
8be0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
8bf0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
8c00: 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  & defined(__linu
8c10: 78 5f 5f 29 0a 20 20 69 66 28 20 74 68 72 65 61  x__).  if( threa
8c20: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
8c30: 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a 20  hersLocks<0 ){. 
8c40: 20 20 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63     testThreadLoc
8c50: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64 29  kingBehavior(fd)
8c60: 3b 0a 20 20 7d 0a 20 20 6c 6f 63 6b 4b 65 79 2e  ;.  }.  lockKey.
8c70: 74 69 64 20 3d 20 74 68 72 65 61 64 73 4f 76 65  tid = threadsOve
8c80: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
8c90: 6f 63 6b 73 20 3f 20 30 20 3a 20 70 74 68 72 65  ocks ? 0 : pthre
8ca0: 61 64 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69  ad_self();.#endi
8cb0: 66 0a 20 20 66 69 6c 65 49 64 20 3d 20 6c 6f 63  f.  fileId = loc
8cc0: 6b 4b 65 79 2e 66 69 64 3b 0a 20 20 69 66 28 20  kKey.fid;.  if( 
8cd0: 70 70 4c 6f 63 6b 21 3d 30 20 29 7b 0a 20 20 20  ppLock!=0 ){.   
8ce0: 20 70 4c 6f 63 6b 20 3d 20 6c 6f 63 6b 4c 69 73   pLock = lockLis
8cf0: 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4c  t;.    while( pL
8d00: 6f 63 6b 20 26 26 20 6d 65 6d 63 6d 70 28 26 6c  ock && memcmp(&l
8d10: 6f 63 6b 4b 65 79 2c 20 26 70 4c 6f 63 6b 2d 3e  ockKey, &pLock->
8d20: 6c 6f 63 6b 4b 65 79 2c 20 73 69 7a 65 6f 66 28  lockKey, sizeof(
8d30: 6c 6f 63 6b 4b 65 79 29 29 20 29 7b 0a 20 20 20  lockKey)) ){.   
8d40: 20 20 20 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b     pLock = pLock
8d50: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
8d60: 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20     if( pLock==0 
8d70: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
8d80: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
8d90: 20 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29 20   sizeof(*pLock) 
8da0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  );.      if( pLo
8db0: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
8dc0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
8dd0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  EM;.        goto
8de0: 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e   exit_findlockin
8df0: 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  fo;.      }.    
8e00: 20 20 6d 65 6d 63 70 79 28 26 70 4c 6f 63 6b 2d    memcpy(&pLock-
8e10: 3e 6c 6f 63 6b 4b 65 79 2c 26 6c 6f 63 6b 4b 65  >lockKey,&lockKe
8e20: 79 2c 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b 65 79  y,sizeof(lockKey
8e30: 29 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d  ));.      pLock-
8e40: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
8e50: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30 3b   pLock->cnt = 0;
8e60: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f  .      pLock->lo
8e70: 63 6b 74 79 70 65 20 3d 20 30 3b 0a 23 69 66 20  cktype = 0;.#if 
8e80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
8e90: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
8ea0: 59 4c 45 29 0a 20 20 20 20 20 20 70 4c 6f 63 6b  YLE).      pLock
8eb0: 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 30  ->sharedByte = 0
8ec0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70  ;.#endif.      p
8ed0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 6c 6f  Lock->pNext = lo
8ee0: 63 6b 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4c  ckList;.      pL
8ef0: 6f 63 6b 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  ock->pPrev = 0;.
8f00: 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 4c 69        if( lockLi
8f10: 73 74 20 29 20 6c 6f 63 6b 4c 69 73 74 2d 3e 70  st ) lockList->p
8f20: 50 72 65 76 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20  Prev = pLock;.  
8f30: 20 20 20 20 6c 6f 63 6b 4c 69 73 74 20 3d 20 70      lockList = p
8f40: 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Lock;.    }else{
8f50: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52  .      pLock->nR
8f60: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
8f70: 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  *ppLock = pLock;
8f80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 70 4f 70 65  .  }.  if( ppOpe
8f90: 6e 21 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 65  n!=0 ){.    pOpe
8fa0: 6e 20 3d 20 6f 70 65 6e 4c 69 73 74 3b 0a 20 20  n = openList;.  
8fb0: 20 20 77 68 69 6c 65 28 20 70 4f 70 65 6e 20 26    while( pOpen &
8fc0: 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64  & memcmp(&fileId
8fd0: 2c 20 26 70 4f 70 65 6e 2d 3e 66 69 6c 65 49 64  , &pOpen->fileId
8fe0: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
8ff0: 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e  ) ){.      pOpen
9000: 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b   = pOpen->pNext;
9010: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
9020: 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Open==0 ){.     
9030: 20 70 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33   pOpen = sqlite3
9040: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
9050: 2a 70 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 20  *pOpen) );.     
9060: 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b   if( pOpen==0 ){
9070: 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
9080: 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b  LockInfo(pLock);
9090: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
90a0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
90b0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69      goto exit_fi
90c0: 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20  ndlockinfo;.    
90d0: 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
90e0: 28 70 4f 70 65 6e 2c 20 30 2c 20 73 69 7a 65 6f  (pOpen, 0, sizeo
90f0: 66 28 2a 70 4f 70 65 6e 29 29 3b 0a 20 20 20 20  f(*pOpen));.    
9100: 20 20 70 4f 70 65 6e 2d 3e 66 69 6c 65 49 64 20    pOpen->fileId 
9110: 3d 20 66 69 6c 65 49 64 3b 0a 20 20 20 20 20 20  = fileId;.      
9120: 70 4f 70 65 6e 2d 3e 6e 52 65 66 20 3d 20 31 3b  pOpen->nRef = 1;
9130: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70 4e  .      pOpen->pN
9140: 65 78 74 20 3d 20 6f 70 65 6e 4c 69 73 74 3b 0a  ext = openList;.
9150: 20 20 20 20 20 20 69 66 28 20 6f 70 65 6e 4c 69        if( openLi
9160: 73 74 20 29 20 6f 70 65 6e 4c 69 73 74 2d 3e 70  st ) openList->p
9170: 50 72 65 76 20 3d 20 70 4f 70 65 6e 3b 0a 20 20  Prev = pOpen;.  
9180: 20 20 20 20 6f 70 65 6e 4c 69 73 74 20 3d 20 70      openList = p
9190: 4f 70 65 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Open;.    }else{
91a0: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52  .      pOpen->nR
91b0: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
91c0: 2a 70 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 3b  *ppOpen = pOpen;
91d0: 0a 20 20 7d 0a 0a 65 78 69 74 5f 66 69 6e 64 6c  .  }..exit_findl
91e0: 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72 65 74 75 72  ockinfo:.  retur
91f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
9200: 66 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  f we are current
9210: 6c 79 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  ly in a differen
9220: 74 20 74 68 72 65 61 64 20 74 68 61 6e 20 74 68  t thread than th
9230: 65 20 74 68 72 65 61 64 20 74 68 61 74 20 74 68  e thread that th
9240: 65 0a 2a 2a 20 75 6e 69 78 46 69 6c 65 20 61 72  e.** unixFile ar
9250: 67 75 6d 65 6e 74 20 62 65 6c 6f 6e 67 73 20 74  gument belongs t
9260: 6f 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  o, then transfer
9270: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
9280: 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 6f 76  e unixFile.** ov
9290: 65 72 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  er to the curren
92a0: 74 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  t thread..**.** 
92b0: 41 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6f 6e  A unixFile is on
92c0: 6c 79 20 6f 77 6e 65 64 20 62 79 20 61 20 74 68  ly owned by a th
92d0: 72 65 61 64 20 6f 6e 20 73 79 73 74 65 6d 73 20  read on systems 
92e0: 74 68 61 74 20 75 73 65 20 4c 69 6e 75 78 54 68  that use LinuxTh
92f0: 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e  reads..**.** Own
9300: 65 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 20  ership transfer 
9310: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
9320: 69 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  if the unixFile 
9330: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c  is currently unl
9340: 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65  ocked..** If the
9350: 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6c 6f 63   unixFile is loc
9360: 6b 65 64 20 61 6e 64 20 61 6e 20 6f 77 6e 65 72  ked and an owner
9370: 73 68 69 70 20 69 73 20 77 72 6f 6e 67 2c 20 74  ship is wrong, t
9380: 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  hen return.** SQ
9390: 4c 49 54 45 5f 4d 49 53 55 53 45 2e 20 20 53 51  LITE_MISUSE.  SQ
93a0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
93b0: 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e  ned if everythin
93c0: 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a 23 69 66 20  g works..*/.#if 
93d0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
93e0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c  E && defined(__l
93f0: 69 6e 75 78 5f 5f 29 0a 73 74 61 74 69 63 20 69  inux__).static i
9400: 6e 74 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72  nt transferOwner
9410: 73 68 69 70 28 75 6e 69 78 46 69 6c 65 20 2a 70  ship(unixFile *p
9420: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  File){.  int rc;
9430: 0a 20 20 70 74 68 72 65 61 64 5f 74 20 68 53 65  .  pthread_t hSe
9440: 6c 66 3b 0a 20 20 69 66 28 20 74 68 72 65 61 64  lf;.  if( thread
9450: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
9460: 65 72 73 4c 6f 63 6b 73 20 29 7b 0a 20 20 20 20  ersLocks ){.    
9470: 2f 2a 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61  /* Ownership tra
9480: 6e 73 66 65 72 73 20 6e 6f 74 20 6e 65 65 64 65  nsfers not neede
9490: 64 20 6f 6e 20 74 68 69 73 20 73 79 73 74 65 6d  d on this system
94a0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
94b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
94c0: 68 53 65 6c 66 20 3d 20 70 74 68 72 65 61 64 5f  hSelf = pthread_
94d0: 73 65 6c 66 28 29 3b 0a 20 20 69 66 28 20 70 74  self();.  if( pt
94e0: 68 72 65 61 64 5f 65 71 75 61 6c 28 70 46 69 6c  hread_equal(pFil
94f0: 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29 20 29  e->tid, hSelf) )
9500: 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
9510: 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 73 61 6d  still in the sam
9520: 65 20 74 68 72 65 61 64 20 2a 2f 0a 20 20 20 20  e thread */.    
9530: 4f 53 54 52 41 43 45 31 28 22 4e 6f 2d 74 72 61  OSTRACE1("No-tra
9540: 6e 73 66 65 72 2c 20 73 61 6d 65 20 74 68 72 65  nsfer, same thre
9550: 61 64 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75  ad\n");.    retu
9560: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
9570: 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  }.  if( pFile->l
9580: 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
9590: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 63 61   ){.    /* We ca
95a0: 6e 6e 6f 74 20 63 68 61 6e 67 65 20 6f 77 6e 65  nnot change owne
95b0: 72 73 68 69 70 20 77 68 69 6c 65 20 77 65 20 61  rship while we a
95c0: 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63  re holding a loc
95d0: 6b 21 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  k! */.    return
95e0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
95f0: 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22    }.  OSTRACE4("
9600: 54 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73 68  Transfer ownersh
9610: 69 70 20 6f 66 20 25 64 20 66 72 6f 6d 20 25 64  ip of %d from %d
9620: 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   to %d\n",.     
9630: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
9640: 20 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65   pFile->tid, hSe
9650: 6c 66 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 74 69  lf);.  pFile->ti
9660: 64 20 3d 20 68 53 65 6c 66 3b 0a 20 20 69 66 20  d = hSelf;.  if 
9670: 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 21 3d  (pFile->pLock !=
9680: 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 72 65 6c   NULL) {.    rel
9690: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69  easeLockInfo(pFi
96a0: 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  le->pLock);.    
96b0: 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66  rc = findLockInf
96c0: 6f 28 70 46 69 6c 65 2c 20 26 70 46 69 6c 65 2d  o(pFile, &pFile-
96d0: 3e 70 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20  >pLock, 0);.    
96e0: 4f 53 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 20  OSTRACE5("LOCK  
96f0: 20 20 25 64 20 69 73 20 6e 6f 77 20 25 73 28 25    %d is now %s(%
9700: 73 2c 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  s,%d)\n", pFile-
9710: 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c  >h,.           l
9720: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c  ocktypeName(pFil
9730: 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20  e->locktype),.  
9740: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
9750: 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 4c 6f  eName(pFile->pLo
9760: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70  ck->locktype), p
9770: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74  File->pLock->cnt
9780: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
9790: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
97a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
97b0: 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 20 20  K;.  }.}.#else  
97c0: 2f 2a 20 69 66 20 6e 6f 74 20 53 51 4c 49 54 45  /* if not SQLITE
97d0: 5f 54 48 52 45 41 44 53 41 46 45 20 2a 2f 0a 20  _THREADSAFE */. 
97e0: 20 2f 2a 20 4f 6e 20 73 69 6e 67 6c 65 2d 74 68   /* On single-th
97f0: 72 65 61 64 65 64 20 62 75 69 6c 64 73 2c 20 6f  readed builds, o
9800: 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66 65  wnership transfe
9810: 72 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a  r is a no-op */.
9820: 23 20 64 65 66 69 6e 65 20 74 72 61 6e 73 66 65  # define transfe
9830: 72 4f 77 6e 65 72 73 68 69 70 28 58 29 20 53 51  rOwnership(X) SQ
9840: 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 20 2f  LITE_OK.#endif /
9850: 2a 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  * SQLITE_THREADS
9860: 41 46 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54  AFE */.../*.** T
9870: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
9880: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
9890: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
98a0: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
98b0: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
98c0: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
98d0: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
98e0: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
98f0: 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
9900: 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
9910: 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
9920: 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
9930: 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
9940: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
9950: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
9960: 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
9970: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
9980: 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
9990: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
99a0: 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72  t unixCheckReser
99b0: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
99c0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
99d0: 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
99e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
99f0: 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
9a00: 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
9a10: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
9a20: 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
9a30: 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
9a40: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
9a50: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
9a60: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
9a70: 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e  File );.  unixEn
9a80: 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
9a90: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c  ecause pFile->pL
9aa0: 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63  ock is shared ac
9ab0: 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
9ac0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
9ad0: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
9ae0: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
9af0: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
9b00: 66 28 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  f( pFile->pLock-
9b10: 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44  >locktype>SHARED
9b20: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
9b30: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  erved = 1;.  }..
9b40: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
9b50: 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
9b60: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
9b70: 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  t..  */.#ifndef 
9b80: 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20  __DJGPP__.  if( 
9b90: 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
9ba0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
9bb0: 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ck;.    lock.l_w
9bc0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
9bd0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
9be0: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
9bf0: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
9c00: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b  en = 1;.    lock
9c10: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
9c20: 4b 3b 0a 20 20 20 20 69 66 20 28 2d 31 20 3d 3d  K;.    if (-1 ==
9c30: 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c   fcntl(pFile->h,
9c40: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_GETLK, &lock)
9c50: 29 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45  ) {.      int tE
9c60: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
9c70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
9c80: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
9c90: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
9ca0: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
9cb0: 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  ERVEDLOCK);.    
9cc0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
9cd0: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
9ce0: 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b   } else if( lock
9cf0: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
9d00: 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76   ){.      reserv
9d10: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
9d20: 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e  }.#endif.  .  un
9d30: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
9d40: 20 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54    OSTRACE4("TEST
9d50: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
9d60: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
9d70: 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
9d80: 76 65 64 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75  ved);..  *pResOu
9d90: 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
9da0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9db0: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
9dc0: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
9dd0: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
9de0: 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
9df0: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
9e00: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
9e10: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
9e20: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
9e30: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
9e40: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
9e50: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
9e60: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
9e70: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
9e80: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
9e90: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
9ea0: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
9eb0: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
9ec0: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
9ed0: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
9ee0: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
9ef0: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
9f00: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
9f10: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
9f20: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
9f30: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
9f40: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
9f50: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
9f60: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
9f70: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
9f80: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
9f90: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
9fa0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
9fb0: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
9fc0: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
9fd0: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
9fe0: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
9ff0: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
a000: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
a010: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
a020: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
a030: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
a040: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
a050: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
a060: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a070: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
a080: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
a090: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
a0a0: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
a0b0: 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
a0c0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
a0d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
a0e0: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
a0f0: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
a100: 79 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66  ype){.  /* The f
a110: 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62  ollowing describ
a120: 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  es the implement
a130: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72  ation of the var
a140: 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20  ious locks and. 
a150: 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74   ** lock transit
a160: 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66  ions in terms of
a170: 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73   the POSIX advis
a180: 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65  ory shared and e
a190: 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f  xclusive.  ** lo
a1a0: 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63  ck primitives (c
a1b0: 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73  alled read-locks
a1c0: 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73   and write-locks
a1d0: 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64   below, to avoid
a1e0: 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20  .  ** confusion 
a1f0: 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b  with SQLite lock
a200: 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67   names). The alg
a210: 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70  orithms are comp
a220: 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69  licated.  ** sli
a230: 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  ghtly in order t
a240: 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  o be compatible 
a250: 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73  with windows sys
a260: 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75  tems simultaneou
a270: 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69  sly.  ** accessi
a280: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
a290: 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61  base file, in ca
a2a0: 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20  se that is ever 
a2b0: 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20  required..  **. 
a2c0: 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69   ** Symbols defi
a2d0: 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65  ned in os.h inde
a2e0: 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69  ntify the 'pendi
a2f0: 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65  ng byte' and the
a300: 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20   'reserved.  ** 
a310: 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67  byte', each sing
a320: 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c  le bytes at well
a330: 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20   known offsets, 
a340: 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20  and the 'shared 
a350: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
a360: 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30  , a range of 510
a370: 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c   bytes at a well
a380: 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20   known offset.. 
a390: 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61   **.  ** To obta
a3a0: 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  in a SHARED lock
a3b0: 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73  , a read-lock is
a3c0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
a3d0: 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62   'pending.  ** b
a3e0: 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69  yte'.  If this i
a3f0: 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20  s successful, a 
a400: 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d  random byte from
a410: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
a420: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73  e.  ** range' is
a430: 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64   read-locked and
a440: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
a450: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20   'pending byte' 
a460: 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20  released..  **. 
a470: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
a480: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
a490: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66  RESERVED lock af
a4a0: 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41  ter it has a SHA
a4b0: 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41  RED lock..  ** A
a4c0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
a4d0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
a4e0: 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74   grabbing a writ
a4f0: 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e-lock on the.  
a500: 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74  ** 'reserved byt
a510: 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  e'. .  **.  ** A
a520: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c   process may onl
a530: 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49  y obtain a PENDI
a540: 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74  NG lock after it
a550: 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a   has obtained a.
a560: 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b    ** SHARED lock
a570: 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  . A PENDING lock
a580: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
a590: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
a5a0: 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  rite-lock.  ** o
a5b0: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
a5c0: 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72  yte'. This ensur
a5d0: 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53  es that no new S
a5e0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20  HARED locks can 
a5f0: 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64  be.  ** obtained
a600: 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53  , but existing S
a610: 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20  HARED locks are 
a620: 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69  allowed to persi
a630: 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20  st. A process.  
a640: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ** does not have
a650: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53   to obtain a RES
a660: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
a670: 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49  e way to a PENDI
a680: 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68  NG lock..  ** Th
a690: 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75  is property is u
a6a0: 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72  sed by the algor
a6b0: 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67  ithm for rolling
a6c0: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
a6d0: 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20  file.  ** after 
a6e0: 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20  a crash..  **.  
a6f0: 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20  ** An EXCLUSIVE 
a700: 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61  lock, obtained a
a710: 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c  fter a PENDING l
a720: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a  ock is held, is.
a730: 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64    ** implemented
a740: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
a750: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
a760: 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64  e entire 'shared
a770: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
a780: 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68  '. Since all oth
a790: 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65  er locks require
a7a0: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
a7b0: 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73  one of the bytes
a7c0: 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  .  ** within thi
a7d0: 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e  s range, this en
a7e0: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74  sures that no ot
a7f0: 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  her locks are he
a800: 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ld on the.  ** d
a810: 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20  atabase. .  **. 
a820: 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61   ** The reason a
a830: 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e   single byte can
a840: 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73 74  not be used inst
a850: 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61 72  ead of the 'shar
a860: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
a870: 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65  ge' is that some
a880: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e   versions of win
a890: 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70  dows do not supp
a8a0: 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20  ort read-locks. 
a8b0: 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20  By.  ** locking 
a8c0: 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72  a random byte fr
a8d0: 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63  om a range, conc
a8e0: 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f  urrent SHARED lo
a8f0: 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20  cks may exist.  
a900: 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c  ** even if the l
a910: 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65  ocking primitive
a920: 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73 20   used is always 
a930: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20  a write-lock..  
a940: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
a950: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
a960: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
a970: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74  ixFile*)id;.  st
a980: 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66  ruct unixLockInf
a990: 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65  o *pLock = pFile
a9a0: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63  ->pLock;.  struc
a9b0: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
a9c0: 69 6e 74 20 73 20 3d 20 30 3b 0a 20 20 69 6e 74  int s = 0;.  int
a9d0: 20 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65   tErrno;..  asse
a9e0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
a9f0: 53 54 52 41 43 45 37 28 22 4c 4f 43 4b 20 20 20  STRACE7("LOCK   
aa00: 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
aa10: 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69  ,%d) pid=%d (uni
aa20: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
aa30: 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e  .      locktypeN
aa40: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c  ame(locktype), l
aa50: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c  ocktypeName(pFil
aa60: 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20  e->locktype),.  
aa70: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
aa80: 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  (pLock->locktype
aa90: 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c 20  ), pLock->cnt , 
aaa0: 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a  getpid());..  /*
aab0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
aac0: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
aad0: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
aae0: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
aaf0: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
ab00: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
ab10: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
ab20: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
ab30: 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
ab40: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
ab50: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
ab60: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
ab70: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c  ile->locktype>=l
ab80: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f  ocktype ){.    O
ab90: 53 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20 20  STRACE3("LOCK   
aba0: 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
abb0: 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c  dy held) (unix)\
abc0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
abd0: 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
abe0: 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
abf0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
ac00: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
ac10: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
ac20: 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
ac30: 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20  e is correct..  
ac40: 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72  **  (1) We never
ac50: 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63   move from unloc
ac60: 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ked to anything 
ac70: 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72  higher than shar
ac80: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ed lock..  **  (
ac90: 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  2) SQLite never 
aca0: 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65  explicitly reque
acb0: 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63  sts a pendig loc
acc0: 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73  k..  **  (3) A s
acd0: 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c  hared lock is al
ace0: 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61  ways held when a
acf0: 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73   reserve lock is
ad00: 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
ad10: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
ad20: 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c  ->locktype!=NO_L
ad30: 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d  OCK || locktype=
ad40: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
ad50: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
ad60: 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe!=PENDING_LOCK
ad70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
ad80: 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44  cktype!=RESERVED
ad90: 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
ada0: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
adb0: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54  _LOCK );..  /* T
adc0: 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65  his mutex is nee
add0: 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c  ded because pFil
ade0: 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72  e->pLock is shar
adf0: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
ae00: 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
ae10: 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
ae20: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
ae30: 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77  urrent thread ow
ae40: 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20  ns the pFile..  
ae50: 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66  */.  rc = transf
ae60: 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c  erOwnership(pFil
ae70: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
ae80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
ae90: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
aea0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
aeb0: 20 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46    }.  pLock = pF
aec0: 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f  ile->pLock;..  /
aed0: 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64  * If some thread
aee0: 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
aef0: 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61  has a lock via a
af00: 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46   different unixF
af10: 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65  ile*.  ** handle
af20: 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20   that precludes 
af30: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
af40: 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e  ck, return BUSY.
af50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69  .  */.  if( (pFi
af60: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 70 4c  le->locktype!=pL
af70: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 26 26  ock->locktype &&
af80: 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 4c 6f   .          (pLo
af90: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45  ck->locktype>=PE
afa0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f  NDING_LOCK || lo
afb0: 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f  cktype>SHARED_LO
afc0: 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63  CK)).  ){.    rc
afd0: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
afe0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
aff0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  k;.  }..  /* If 
b000: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  a SHARED lock is
b010: 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20   requested, and 
b020: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
b030: 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61  g this PID alrea
b040: 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48  dy.  ** has a SH
b050: 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44  ARED or RESERVED
b060: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72   lock, then incr
b070: 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20  ement reference 
b080: 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20  counts and.  ** 
b090: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b0a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ..  */.  if( loc
b0b0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
b0c0: 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 4c  CK && .      (pL
b0d0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ock->locktype==S
b0e0: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c  HARED_LOCK || pL
b0f0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52  ock->locktype==R
b100: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b  ESERVED_LOCK) ){
b110: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63  .    assert( loc
b120: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
b130: 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
b140: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
b150: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
b160: 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 30  rt( pLock->cnt>0
b170: 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   );.    pFile->l
b180: 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
b190: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b  _LOCK;.    pLock
b1a0: 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 70 46 69  ->cnt++;.    pFi
b1b0: 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  le->pOpen->nLock
b1c0: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  ++;.    goto end
b1d0: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  _lock;.  }...  /
b1e0: 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
b1f0: 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
b200: 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
b210: 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
b220: 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
b230: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
b240: 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
b250: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
b260: 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
b270: 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
b280: 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65    */.  lock.l_le
b290: 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c  n = 1L;.  lock.l
b2a0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
b2b0: 45 54 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79  ET;.  if( lockty
b2c0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
b2d0: 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74  .      || (lockt
b2e0: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
b2f0: 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  OCK && pFile->lo
b300: 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c  cktype<PENDING_L
b310: 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f  OCK).  ){.    lo
b320: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 6c 6f 63  ck.l_type = (loc
b330: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
b340: 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c  CK?F_RDLCK:F_WRL
b350: 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  CK);.    lock.l_
b360: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
b370: 42 59 54 45 3b 0a 20 20 20 20 73 20 3d 20 66 63  BYTE;.    s = fc
b380: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
b390: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
b3a0: 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29     if( s==(-1) )
b3b0: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
b3c0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
b3d0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
b3e0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
b3f0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
b400: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
b410: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
b420: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
b430: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
b440: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
b450: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
b460: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
b470: 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  }...  /* If cont
b480: 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
b490: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
b4a0: 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
b4b0: 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
b4c0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
b4d0: 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
b4e0: 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
b4f0: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
b500: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
b510: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
b520: 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20  k->cnt==0 );.   
b530: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
b540: 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 0a  locktype==0 );..
b550: 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
b560: 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a  he read-lock */.
b570: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
b580: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
b590: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
b5a0: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
b5b0: 20 20 20 69 66 28 20 28 73 20 3d 20 66 63 6e 74     if( (s = fcnt
b5c0: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
b5d0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29 3d 3d 28 2d  TLK, &lock))==(-
b5e0: 31 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  1) ){.      tErr
b5f0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
b600: 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  }.    /* Drop th
b610: 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
b620: 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
b630: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
b640: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
b650: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
b660: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
b670: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
b680: 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65   if( fcntl(pFile
b690: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
b6a0: 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ock)!=0 ){.     
b6b0: 20 69 66 28 20 73 20 21 3d 20 2d 31 20 29 7b 0a   if( s != -1 ){.
b6c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
b6d0: 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74  could happen wit
b6e0: 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e  h a network moun
b6f0: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 45 72  t */.        tEr
b700: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 0a 20 20  rno = errno; .  
b710: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b720: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
b730: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
b740: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
b750: 29 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20  ); .        if( 
b760: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
b770: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
b780: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
b790: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
b7a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f    }.        goto
b7b0: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20   end_lock;.     
b7c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
b7d0: 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20   s==(-1) ){.    
b7e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
b7f0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
b800: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
b810: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
b820: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
b830: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
b840: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
b850: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
b860: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
b870: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
b880: 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
b890: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69  _LOCK;.      pFi
b8a0: 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  le->pOpen->nLock
b8b0: 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d  ++;.      pLock-
b8c0: 3e 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  >cnt = 1;.    }.
b8d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
b8e0: 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
b8f0: 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63  LOCK && pLock->c
b900: 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57  nt>1 ){.    /* W
b910: 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72  e are trying for
b920: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
b930: 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74  ck but another t
b940: 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20  hread in this.  
b950: 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73    ** same proces
b960: 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  s is still holdi
b970: 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
b980: 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  . */.    rc = SQ
b990: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  LITE_BUSY;.  }el
b9a0: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
b9b0: 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61  equest was for a
b9c0: 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
b9d0: 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74  LUSIVE lock.  It
b9e0: 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d   is.    ** assum
b9f0: 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ed that there is
ba00: 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65   a SHARED or gre
ba10: 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
ba20: 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72   file.    ** alr
ba30: 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
ba40: 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c   assert( 0!=pFil
ba50: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20  e->locktype );. 
ba60: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
ba70: 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77   F_WRLCK;.    sw
ba80: 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29  itch( locktype )
ba90: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52 45 53  {.      case RES
baa0: 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20  ERVED_LOCK:.    
bab0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
bac0: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
bad0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
bae0: 0a 20 20 20 20 20 20 63 61 73 65 20 45 58 43 4c  .      case EXCL
baf0: 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20  USIVE_LOCK:.    
bb00: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
bb10: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
bb20: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
bb30: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
bb40: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
bb50: 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ;.      default:
bb60: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
bb70: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20  0);.    }.    s 
bb80: 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  = fcntl(pFile->h
bb90: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
bba0: 29 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d  );.    if( s==(-
bbb0: 31 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  1) ){.      tErr
bbc0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
bbd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
bbe0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
bbf0: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
bc00: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
bc10: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
bc20: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
bc30: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
bc40: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
bc50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
bc60: 0a 20 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  ..#ifndef NDE
bc70: 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20  BUG.  /* Set up 
bc80: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d  the transaction-
bc90: 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63  counter change c
bca0: 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68  hecking flags wh
bcb0: 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69  en.  ** transiti
bcc0: 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41  oning from a SHA
bcd0: 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45  RED to a RESERVE
bce0: 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61  D lock.  The cha
bcf0: 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48  nge.  ** from SH
bd00: 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
bd10: 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e   marks the begin
bd20: 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c  ning of a normal
bd30: 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72  .  ** write oper
bd40: 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74  ation (not a hot
bd50: 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63   journal rollbac
bd60: 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  k)..  */.  if( r
bd70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
bd80: 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
bd90: 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  pe<=SHARED_LOCK.
bda0: 20 20 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d     && locktype==
bdb0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20  RESERVED_LOCK.  
bdc0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72  ){.    pFile->tr
bdd0: 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b  ansCntrChng = 0;
bde0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
bdf0: 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  date = 0;.    pF
be00: 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
be10: 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  te = 1;.  }.#end
be20: 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  if...  if( rc==S
be30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
be40: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
be50: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
be60: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
be70: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65  = locktype;.  }e
be80: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
be90: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
bea0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
beb0: 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
bec0: 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63  G_LOCK;.    pLoc
bed0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45  k->locktype = PE
bee0: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  NDING_LOCK;.  }.
bef0: 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  .end_lock:.  uni
bf00: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
bf10: 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20   OSTRACE4("LOCK 
bf20: 20 20 20 25 64 20 25 73 20 25 73 20 28 75 6e 69     %d %s %s (uni
bf30: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
bf40: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
bf50: 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20 20  cktype), .      
bf60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
bf70: 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
bf80: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
bf90: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
bfa0: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
bfb0: 72 73 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e  rs accumuated in
bfc0: 20 74 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74   the unixOpenCnt
bfd0: 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a  ->pUnused list..
bfe0: 2a 2a 20 49 66 20 61 6c 6c 20 73 75 63 68 20 66  ** If all such f
bff0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
c000: 61 72 65 20 63 6c 6f 73 65 64 20 77 69 74 68 6f  are closed witho
c010: 75 74 20 65 72 72 6f 72 2c 20 74 68 65 20 6c 69  ut error, the li
c020: 73 74 20 69 73 0a 2a 2a 20 63 6c 65 61 72 65 64  st is.** cleared
c030: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
c040: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  eturned..**.** O
c050: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20  therwise, if an 
c060: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
c070: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
c080: 63 6c 6f 73 65 64 20 66 69 6c 65 20 64 65 73 63  closed file desc
c090: 72 69 70 74 6f 72 0a 2a 2a 20 65 6e 74 72 69 65  riptor.** entrie
c0a0: 73 20 61 72 65 20 72 65 6d 6f 76 65 64 20 66 72  s are removed fr
c0b0: 6f 6d 20 74 68 65 20 6c 69 73 74 2c 20 61 6e 64  om the list, and
c0c0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c   SQLITE_IOERR_CL
c0d0: 4f 53 45 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a  OSE returned. .*
c0e0: 2a 20 6e 6f 74 20 64 65 6c 65 74 65 64 20 61 6e  * not deleted an
c0f0: 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  d SQLITE_IOERR_C
c100: 4c 4f 53 45 20 72 65 74 75 72 6e 65 64 2e 0a 2a  LOSE returned..*
c110: 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  / .static int cl
c120: 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e  osePendingFds(un
c130: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
c140: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c150: 45 5f 4f 4b 3b 0a 20 20 73 74 72 75 63 74 20 75  E_OK;.  struct u
c160: 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65  nixOpenCnt *pOpe
c170: 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e  n = pFile->pOpen
c180: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
c190: 20 2a 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20   *pError = 0;.  
c1a0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b  UnixUnusedFd *p;
c1b0: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
c1c0: 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d  *pNext;.  for(p=
c1d0: 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64 3b 20  pOpen->pUnused; 
c1e0: 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20  p; p=pNext){.   
c1f0: 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
c200: 74 3b 0a 20 20 20 20 69 66 28 20 63 6c 6f 73 65  t;.    if( close
c210: 28 70 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  (p->fd) ){.     
c220: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
c230: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
c240: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
c250: 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  RR_CLOSE;.      
c260: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 45 72 72 6f  p->pNext = pErro
c270: 72 3b 0a 20 20 20 20 20 20 70 45 72 72 6f 72 20  r;.      pError 
c280: 3d 20 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = p;.    }else{.
c290: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
c2a0: 65 65 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ee(p);.    }.  }
c2b0: 0a 20 20 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65  .  pOpen->pUnuse
c2c0: 64 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 72 65  d = pError;.  re
c2d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c2e0: 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 64  * Add the file d
c2f0: 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 62  escriptor used b
c300: 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46  y file handle pF
c310: 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ile to the corre
c320: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75  sponding.** pUnu
c330: 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  sed list..*/.sta
c340: 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64  tic void setPend
c350: 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a  ingFd(unixFile *
c360: 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63 74  pFile){.  struct
c370: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f   unixOpenCnt *pO
c380: 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70  pen = pFile->pOp
c390: 65 6e 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  en;.  UnixUnused
c3a0: 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70  Fd *p = pFile->p
c3b0: 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65  Unused;.  p->pNe
c3c0: 78 74 20 3d 20 70 4f 70 65 6e 2d 3e 70 55 6e 75  xt = pOpen->pUnu
c3d0: 73 65 64 3b 0a 20 20 70 4f 70 65 6e 2d 3e 70 55  sed;.  pOpen->pU
c3e0: 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69  nused = p;.  pFi
c3f0: 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46  le->h = -1;.  pF
c400: 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30  ile->pUnused = 0
c410: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
c420: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
c430: 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
c440: 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c  iptor pFile to l
c450: 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
c460: 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
c470: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
c480: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
c490: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
c4a0: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
c4b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
c4c0: 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
c4d0: 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
c4e0: 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
c4f0: 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
c500: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
c510: 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e  * .** If handleN
c520: 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65  FSUnlock is true
c530: 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72  , then on downgr
c540: 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  ading an EXCLUSI
c550: 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45  VE_LOCK to SHARE
c560: 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61  D.** the byte ra
c570: 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20 69  nge is divided i
c580: 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20  nto 2 parts and 
c590: 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20 69  the first part i
c5a0: 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a  s unlocked then.
c5b0: 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61 64  ** set to a read
c5c0: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20   lock, then the 
c5d0: 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73 69  other part is si
c5e0: 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20  mply unlocked.  
c5f0: 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61  This works .** a
c600: 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42  round a bug in B
c610: 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c  SD NFS lockd (al
c620: 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53  so seen on MacOS
c630: 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61  X 10.3+) that fa
c640: 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76  ils to .** remov
c650: 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
c660: 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65   on a region whe
c670: 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
c680: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
c690: 69 6e 74 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b  int _posixUnlock
c6a0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
c6b0: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 2c  d, int locktype,
c6c0: 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e   int handleNFSUn
c6d0: 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c  lock){.  unixFil
c6e0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
c6f0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74 72 75  File*)id;.  stru
c700: 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  ct unixLockInfo 
c710: 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74  *pLock;.  struct
c720: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
c730: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c740: 4b 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e  K;.  int h;.  in
c750: 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  t tErrno;       
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c770: 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
c780: 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 65 72  m system call er
c790: 72 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  rors */..  asser
c7a0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
c7b0: 54 52 41 43 45 37 28 22 55 4e 4c 4f 43 4b 20 20  TRACE7("UNLOCK  
c7c0: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
c7d0: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
c7e0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
c7f0: 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20  locktype,.      
c800: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
c810: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c   pFile->pLock->l
c820: 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
c830: 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70  pLock->cnt, getp
c840: 69 64 28 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  id());..  assert
c850: 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ( locktype<=SHAR
c860: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  ED_LOCK );.  if(
c870: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
c880: 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  <=locktype ){.  
c890: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c8a0: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 48  OK;.  }.  if( CH
c8b0: 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70 46 69  ECK_THREADID(pFi
c8c0: 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  le) ){.    retur
c8d0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
c8e0: 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
c8f0: 4d 75 74 65 78 28 29 3b 0a 20 20 68 20 3d 20 70  Mutex();.  h = p
c900: 46 69 6c 65 2d 3e 68 3b 0a 20 20 70 4c 6f 63 6b  File->h;.  pLock
c910: 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b   = pFile->pLock;
c920: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b  .  assert( pLock
c930: 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66  ->cnt!=0 );.  if
c940: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
c950: 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  e>SHARED_LOCK ){
c960: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
c970: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70 46  ck->locktype==pF
c980: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b  ile->locktype );
c990: 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
c9a0: 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
c9b0: 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
c9c0: 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20  or( h=(-1) ).   
c9d0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
c9e0: 42 65 6e 69 67 6e 28 30 29 3b 0a 0a 23 69 66 6e  Benign(0);..#ifn
c9f0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f  def NDEBUG.    /
ca00: 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
ca10: 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
ca20: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
ca30: 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
ca40: 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
ca50: 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
ca60: 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
ca70: 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
ca80: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
ca90: 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
caa0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
cab0: 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
cac0: 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
cad0: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
cae0: 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
caf0: 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
cb00: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
cb10: 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
cb20: 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
cb30: 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
cb40: 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
cb50: 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
cb60: 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
cb70: 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
cb80: 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
cb90: 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
cba0: 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
cbb0: 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
cbc0: 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
cbd0: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
cbe0: 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
cbf0: 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
cc00: 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d  File->dbUpdate==
cc10: 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46  0.         || pF
cc20: 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
cc30: 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69  ng==1 );.    pFi
cc40: 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
cc50: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  e = 0;.#endif.. 
cc60: 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e     /* downgradin
cc70: 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  g to a shared lo
cc80: 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76  ck on NFS involv
cc90: 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  es clearing the 
cca0: 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a  write lock.    *
ccb0: 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69  * before establi
ccc0: 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f  shing the readlo
ccd0: 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ck - to avoid a 
cce0: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77  race condition w
ccf0: 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20  e downgrade.    
cd00: 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32  ** the lock in 2
cd10: 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74   blocks, so that
cd20: 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e   part of the ran
cd30: 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72  ge will be cover
cd40: 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20  ed by a .    ** 
cd50: 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c  write lock until
cd60: 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f 76   the rest is cov
cd70: 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20 6c  ered by a read l
cd80: 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20  ock:.    **  1: 
cd90: 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a    [WWWWW].    **
cda0: 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20    2:   [....W]. 
cdb0: 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52     **  3:   [RRR
cdc0: 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20  RW].    **  4:  
cdd0: 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a   [RRRR.].    */.
cde0: 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65      if( locktype
cdf0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
ce00: 0a 20 20 20 20 20 20 69 66 28 20 68 61 6e 64 6c  .      if( handl
ce10: 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20  eNFSUnlock ){.  
ce20: 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53        off_t divS
ce30: 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  ize = SHARED_SIZ
ce40: 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a  E - 1;.        .
ce50: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
ce60: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
ce70: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
ce80: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
ce90: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
cea0: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
ceb0: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
cec0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69  ck.l_len = divSi
ced0: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
cee0: 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b  fcntl(h, F_SETLK
cef0: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
cf00: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
cf10: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
cf20: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
cf30: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
cf40: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
cf50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
cf60: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
cf70: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
cf80: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
cf90: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
cfa0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
cfb0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
cfc0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
cfd0: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
cfe0: 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  }.        lock.l
cff0: 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
d000: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
d010: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
d020: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
d030: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
d040: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
d050: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76  lock.l_len = div
d060: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
d070: 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54  ( fcntl(h, F_SET
d080: 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  LK, &lock)==(-1)
d090: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
d0a0: 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
d0b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
d0c0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
d0d0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
d0e0: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
d0f0: 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  RDLOCK);.       
d100: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
d110: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
d120: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
d130: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
d140: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
d150: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
d160: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
d170: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
d180: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
d190: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
d1a0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
d1b0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
d1c0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
d1d0: 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65  ED_FIRST+divSize
d1e0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
d1f0: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
d200: 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ZE-divSize;.    
d210: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c      if( fcntl(h,
d220: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
d230: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
d240: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
d250: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
d260: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
d270: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
d280: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
d290: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
d2a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
d2b0: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
d2c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  {.            pF
d2d0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
d2e0: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
d2f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
d300: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
d310: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d320: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c  }else{.        l
d330: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  ock.l_type = F_R
d340: 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  DLCK;.        lo
d350: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
d360: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
d370: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
d380: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
d390: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
d3a0: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
d3b0: 20 20 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c         if( fcntl
d3c0: 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  (h, F_SETLK, &lo
d3d0: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
d3e0: 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e         int tErrn
d3f0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
d400: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d410: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
d420: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
d430: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29  TE_IOERR_RDLOCK)
d440: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d450: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
d460: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d470: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d480: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
d490: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d4a0: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
d4b0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
d4c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c     }.    }.    l
d4d0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
d4e0: 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  NLCK;.    lock.l
d4f0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
d500: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
d510: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
d520: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
d530: 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72  len = 2L;  asser
d540: 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t( PENDING_BYTE+
d550: 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45  1==RESERVED_BYTE
d560: 20 29 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74   );.    if( fcnt
d570: 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  l(h, F_SETLK, &l
d580: 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)!=(-1) ){.  
d590: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74      pLock->lockt
d5a0: 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
d5b0: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
d5c0: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
d5d0: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
d5e0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
d5f0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
d600: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
d610: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
d620: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
d630: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
d640: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
d650: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
d660: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
d670: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  unlock;.    }.  
d680: 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  }.  if( locktype
d690: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ==NO_LOCK ){.   
d6a0: 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e   struct unixOpen
d6b0: 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20 20 20  Cnt *pOpen;..   
d6c0: 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
d6d0: 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
d6e0: 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
d6f0: 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
d700: 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
d710: 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
d720: 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
d730: 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
d740: 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
d750: 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
d760: 2f 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74  /.    pLock->cnt
d770: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63  --;.    if( pLoc
d780: 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  k->cnt==0 ){.   
d790: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
d7a0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
d7b0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
d7c0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
d7d0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c  lock.l_start = l
d7e0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a  ock.l_len = 0L;.
d7f0: 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
d800: 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
d810: 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
d820: 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
d830: 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
d840: 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
d850: 20 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28        if( fcntl(
d860: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
d870: 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)!=(-1) ){.    
d880: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74      pLock->lockt
d890: 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
d8a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d8b0: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
d8c0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  no;.        rc =
d8d0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
d8e0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
d8f0: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
d900: 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  UNLOCK);.       
d910: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
d920: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
d930: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
d940: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
d950: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d960: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
d970: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
d980: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
d990: 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
d9a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
d9b0: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
d9c0: 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b  he count of lock
d9d0: 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73  s against this s
d9e0: 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20  ame file.  When 
d9f0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  the.    ** count
da00: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63   reaches zero, c
da10: 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66  lose any other f
da20: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
da30: 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20  whose close.    
da40: 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20  ** was deferred 
da50: 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74  because of outst
da60: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20  anding locks..  
da70: 20 20 2a 2f 0a 20 20 20 20 70 4f 70 65 6e 20 3d    */.    pOpen =
da80: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20   pFile->pOpen;. 
da90: 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d     pOpen->nLock-
daa0: 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
dab0: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  Open->nLock>=0 )
dac0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d  ;.    if( pOpen-
dad0: 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
dae0: 20 20 20 69 6e 74 20 72 63 32 20 3d 20 63 6c 6f     int rc2 = clo
daf0: 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
db00: 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  le);.      if( r
db10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
db20: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
db30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
db40: 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b    }...end_unlock
db50: 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
db60: 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex();.  if( rc==
db70: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c  SQLITE_OK ) pFil
db80: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
db90: 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e  cktype;.  return
dba0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
dbb0: 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
dbc0: 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
dbd0: 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
dbe0: 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63  o locktype.  loc
dbf0: 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65  ktype.** must be
dc00: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
dc10: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
dc20: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
dc30: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
dc40: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
dc50: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
dc60: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
dc70: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
dc80: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
dc90: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
dca0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dcb0: 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  unixUnlock(sqlit
dcc0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
dcd0: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 72 65   locktype){.  re
dce0: 74 75 72 6e 20 5f 70 6f 73 69 78 55 6e 6c 6f 63  turn _posixUnloc
dcf0: 6b 28 69 64 2c 20 6c 6f 63 6b 74 79 70 65 2c 20  k(id, locktype, 
dd00: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
dd10: 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f  s function perfo
dd20: 72 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66  rms the parts of
dd30: 20 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65   the "close file
dd40: 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20  " operation .** 
dd50: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f  common to all lo
dd60: 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49  cking schemes. I
dd70: 74 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72  t closes the dir
dd80: 65 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a  ectory and file.
dd90: 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74  ** handles, if t
dda0: 68 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61  hey are valid, a
ddb0: 6e 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c  nd sets all fiel
ddc0: 64 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ds of the unixFi
ddd0: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  le.** structure 
dde0: 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  to 0..**.** It i
ddf0: 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72  s *not* necessar
de00: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  y to hold the mu
de10: 74 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f  tex when this ro
de20: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
de30: 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f  .** even on VxWo
de40: 72 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69  rks.  A mutex wi
de50: 6c 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f  ll be acquired o
de60: 6e 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65  n VxWorks by the
de70: 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61  .** vxworksRelea
de80: 73 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69  seFileId() routi
de90: 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
dea0: 74 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  t closeUnixFile(
deb0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
dec0: 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
ded0: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
dee0: 2a 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c  *)id;.  if( pFil
def0: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69  e ){.    if( pFi
df00: 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a  le->dirfd>=0 ){.
df10: 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20        int err = 
df20: 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72  close(pFile->dir
df30: 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  fd);.      if( e
df40: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  rr ){.        pF
df50: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
df60: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
df70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
df80: 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20  ERR_DIR_CLOSE;. 
df90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
dfa0: 20 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64      pFile->dirfd
dfb0: 3d 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  =-1;.      }.   
dfc0: 20 7d 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65   }.    if( pFile
dfd0: 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
dfe0: 69 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28  int err = close(
dff0: 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20  pFile->h);.     
e000: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
e010: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
e020: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
e030: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e040: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b  ITE_IOERR_CLOSE;
e050: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
e060: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
e070: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64    if( pFile->pId
e080: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46   ){.      if( pF
e090: 69 6c 65 2d 3e 69 73 44 65 6c 65 74 65 20 29 7b  ile->isDelete ){
e0a0: 0a 20 20 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28  .        unlink(
e0b0: 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e  pFile->pId->zCan
e0c0: 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
e0d0: 20 20 20 7d 0a 20 20 20 20 20 20 76 78 77 6f 72     }.      vxwor
e0e0: 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
e0f0: 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20  pFile->pId);.   
e100: 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20     pFile->pId = 
e110: 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  0;.    }.#endif.
e120: 20 20 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c      OSTRACE2("CL
e130: 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  OSE   %-3d\n", p
e140: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 4f 70  File->h);.    Op
e150: 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
e160: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
e170: 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b  pFile->pUnused);
e180: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  .    memset(pFil
e190: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  e, 0, sizeof(uni
e1a0: 78 46 69 6c 65 29 29 3b 0a 20 20 7d 0a 20 20 72  xFile));.  }.  r
e1b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e1c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
e1d0: 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
e1e0: 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28  c int unixClose(
e1f0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
e200: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
e210: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
e220: 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
e230: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
e240: 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 20 20 75  File *)id;.    u
e250: 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  nixUnlock(id, NO
e260: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78  _LOCK);.    unix
e270: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
e280: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4f 70    if( pFile->pOp
e290: 65 6e 20 26 26 20 70 46 69 6c 65 2d 3e 70 4f 70  en && pFile->pOp
e2a0: 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  en->nLock ){.   
e2b0: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
e2c0: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
e2d0: 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
e2e0: 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
e2f0: 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20  file just.      
e300: 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
e310: 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
e320: 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
e330: 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
e340: 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
e350: 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e  criptor to pOpen
e360: 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20  ->pUnused list. 
e370: 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
e380: 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
e390: 20 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20   .      ** when 
e3a0: 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73  the last lock is
e3b0: 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20   cleared..      
e3c0: 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64  */.      setPend
e3d0: 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
e3e0: 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 4c    }.    releaseL
e3f0: 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70  ockInfo(pFile->p
e400: 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61  Lock);.    relea
e410: 73 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d  seOpenCnt(pFile-
e420: 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 72 63 20  >pOpen);.    rc 
e430: 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
e440: 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61  id);.    unixLea
e450: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20  veMutex();.  }. 
e460: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
e480: 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20  nd of the posix 
e490: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d  advisory lock im
e4a0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
e4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
e4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e4f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
e510: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
e520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
e560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
e580: 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  o-op Locking ***
e590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
e5b0: 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72  **.** Of the var
e5c0: 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  ious locking imp
e5d0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61  lementations ava
e5e0: 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20  ilable, this is 
e5f0: 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69  by far the.** si
e600: 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67  mplest:  locking
e610: 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f   is ignored.  No
e620: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
e630: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74   to lock the dat
e640: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f  abase.** file fo
e650: 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  r reading or wri
e660: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ting..**.** This
e670: 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
e680: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
e690: 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c   use on read-onl
e6a0: 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28  y databases.** (
e6b0: 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68  ex: databases th
e6c0: 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e  at are burned in
e6d0: 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65  to CD-ROM, for e
e6e0: 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e  xample.)  It can
e6f0: 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64  .** also be used
e700: 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   if the applicat
e710: 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65  ion employs some
e720: 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e   external mechan
e730: 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e  ism to.** preven
e740: 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61  t simultaneous a
e750: 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d  ccess of the sam
e760: 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77  e database by tw
e770: 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74  o or more.** dat
e780: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
e790: 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  s.  But there is
e7a0: 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20   a serious risk 
e7b0: 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  of database.** c
e7c0: 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69  orruption if thi
e7d0: 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
e7e0: 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74  s used in situat
e7f0: 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69  ions where multi
e800: 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ple.** database 
e810: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20  connections are 
e820: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
e830: 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
e840: 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   at the same.** 
e850: 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20  time and one or 
e860: 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f  more of those co
e870: 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72  nnections are wr
e880: 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69  iting..*/..stati
e890: 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63  c int nolockChec
e8a0: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
e8b0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
e8c0: 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  sed, int *pResOu
e8d0: 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
e8e0: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
e8f0: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b  .  *pResOut = 0;
e900: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e910: 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
e920: 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  t nolockLock(sql
e930: 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
e940: 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
e950: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
e960: 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
e970: 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
e980: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e990: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
e9a0: 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
e9b0: 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
e9c0: 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
e9d0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
e9e0: 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
e9f0: 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
ea00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
ea10: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69  .** Close the fi
ea20: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
ea30: 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  t nolockClose(sq
ea40: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
ea50: 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65  {.  return close
ea60: 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a  UnixFile(id);.}.
ea70: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
ea80: 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
ea90: 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c   no-op lock impl
eaa0: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
eab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eac0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
ead0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eaf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
eb10: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
eb20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb60: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
eb70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
eb80: 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69  n dot-file Locki
eb90: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
eba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebb0: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66  *.**.** The dotf
ebc0: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ile locking impl
ebd0: 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20  ementation uses 
ebe0: 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66  the existance of
ebf0: 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a   separate lock.*
ec00: 2a 20 66 69 6c 65 73 20 69 6e 20 6f 72 64 65 72  * files in order
ec10: 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65   to control acce
ec20: 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ss to the databa
ec30: 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20  se.  This works 
ec40: 6f 6e 20 6a 75 73 74 0a 2a 2a 20 61 62 6f 75 74  on just.** about
ec50: 20 65 76 65 72 79 20 66 69 6c 65 73 79 73 74 65   every filesyste
ec60: 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42  m imaginable.  B
ec70: 75 74 20 74 68 65 72 65 20 61 72 65 20 73 65 72  ut there are ser
ec80: 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a  ious downsides:.
ec90: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
eca0: 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63  ere is zero conc
ecb0: 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67  urrency.  A sing
ecc0: 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73  le reader blocks
ecd0: 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20   all other.**   
ece0: 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
ecf0: 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f  s from reading o
ed00: 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61  r writing the da
ed10: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  tabase..**.**   
ed20: 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61   (2)  An applica
ed30: 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f  tion crash or po
ed40: 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61  wer loss can lea
ed50: 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69  ve stale lock fi
ed60: 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  les.**         s
ed70: 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68  itting around th
ed80: 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c  at need to be cl
ed90: 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a  eared manually..
eda0: 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65  **.** Neverthele
edb0: 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73  ss, a dotlock is
edc0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
edd0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72  locking mode for
ede0: 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74   use if no.** ot
edf0: 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  her locking stra
ee00: 74 65 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c  tegy is availabl
ee10: 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65  e..**.** Dotfile
ee20: 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62   locking works b
ee30: 79 20 63 72 65 61 74 69 6e 67 20 61 20 66 69 6c  y creating a fil
ee40: 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  e in the same di
ee50: 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 0a 2a  rectory as the.*
ee60: 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 77  * database and w
ee70: 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
ee80: 65 20 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c  e but with a ".l
ee90: 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61  ock" extension a
eea0: 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69  dded..** The exi
eeb0: 73 74 61 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b  stance of a lock
eec0: 20 66 69 6c 65 20 69 6d 70 6c 69 65 73 20 61 6e   file implies an
eed0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
eee0: 20 20 41 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b    All other lock
eef0: 0a 2a 2a 20 74 79 70 65 73 20 28 53 48 41 52 45  .** types (SHARE
ef00: 44 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e  D, RESERVED, PEN
ef10: 44 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64  DING) are mapped
ef20: 20 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e   into EXCLUSIVE.
ef30: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .*/../*.** The f
ef40: 69 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64  ile suffix added
ef50: 20 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73   to the data bas
ef60: 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72  e filename in or
ef70: 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68  der to create th
ef80: 65 0a 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a  e.** lock file..
ef90: 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f  */.#define DOTLO
efa0: 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b  CK_SUFFIX ".lock
efb0: 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "../*.** This ro
efc0: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
efd0: 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
efe0: 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
eff0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
f000: 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
f010: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
f020: 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
f030: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
f040: 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
f050: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
f060: 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
f070: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
f080: 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
f090: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
f0a0: 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
f0b0: 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
f0c0: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
f0d0: 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a  ock checking..**
f0e0: 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c  .** In dotfile l
f0f0: 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61  ocking, either a
f100: 20 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20   lock exists or 
f110: 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f  it does not.  So
f120: 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69   in this.** vari
f130: 61 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65  ation of CheckRe
f140: 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70  servedLock(), *p
f150: 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
f160: 20 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63   true if any loc
f170: 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20  k.** is held on 
f180: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c  the file and fal
f190: 73 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  se if the file i
f1a0: 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73  s unlocked..*/.s
f1b0: 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
f1c0: 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
f1d0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
f1e0: 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
f1f0: 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t) {.  int rc = 
f200: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
f210: 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
f220: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
f230: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
f240: 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
f250: 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
f260: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
f270: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
f280: 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
f290: 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  le );..  /* Chec
f2a0: 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
f2b0: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
f2c0: 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
f2d0: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
f2e0: 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
f2f0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45  LOCK ){.    /* E
f300: 69 74 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65  ither this conne
f310: 63 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74  ction or some ot
f320: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
f330: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
f340: 73 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20  ss.    ** holds 
f350: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  a lock on the fi
f360: 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  le.  No need to 
f370: 63 68 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a  check further. *
f380: 2f 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  /.    reserved =
f390: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
f3a0: 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20   /* The lock is 
f3b0: 68 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79  held if and only
f3c0: 20 69 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65   if the lockfile
f3d0: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63   exists */.    c
f3e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  onst char *zLock
f3f0: 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  File = (const ch
f400: 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
f410: 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72  ngContext;.    r
f420: 65 73 65 72 76 65 64 20 3d 20 61 63 63 65 73 73  eserved = access
f430: 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d  (zLockFile, 0)==
f440: 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  0;.  }.  OSTRACE
f450: 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  4("TEST WR-LOCK 
f460: 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63  %d %d %d (dotloc
f470: 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
f480: 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a   rc, reserved);.
f490: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
f4a0: 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
f4b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
f4c0: 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
f4d0: 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
f4e0: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
f4f0: 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a  locktype - one.*
f500: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
f510: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
f520: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
f530: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
f540: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
f550: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
f560: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
f570: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
f580: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
f590: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
f5a0: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
f5b0: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
f5c0: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
f5d0: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
f5e0: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
f5f0: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
f600: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
f610: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
f620: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
f630: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
f640: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
f650: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
f660: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
f670: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
f680: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
f690: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
f6a0: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
f6b0: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
f6c0: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
f6d0: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
f6e0: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
f6f0: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
f700: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
f710: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
f720: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
f730: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
f740: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
f750: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
f760: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
f770: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
f780: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
f790: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
f7a0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
f7b0: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
f7c0: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
f7d0: 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  level..**.** Wit
f7e0: 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  h dotfile lockin
f7f0: 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c  g, we really onl
f800: 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20  y support state 
f810: 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a  (4): EXCLUSIVE..
f820: 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20  ** But we track 
f830: 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  the other lockin
f840: 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61  g levels interna
f850: 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lly..*/.static i
f860: 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73  nt dotlockLock(s
f870: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
f880: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
f890: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
f8a0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
f8b0: 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20  id;.  int fd;.  
f8c0: 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
f8d0: 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
f8e0: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
f8f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
f900: 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66  TE_OK;...  /* If
f910: 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63   we have any loc
f920: 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  k, then the lock
f930: 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78   file already ex
f940: 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61  ists.  All we ha
f950: 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
f960: 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65   adjust our inte
f970: 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
f980: 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20  he lock level.. 
f990: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
f9a0: 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c  >locktype > NO_L
f9b0: 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
f9c0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
f9d0: 6b 74 79 70 65 3b 0a 23 69 66 20 21 4f 53 5f 56  ktype;.#if !OS_V
f9e0: 58 57 4f 52 4b 53 0a 20 20 20 20 2f 2a 20 41 6c  XWORKS.    /* Al
f9f0: 77 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20  ways update the 
fa00: 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65  timestamp on the
fa10: 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20   old file */.   
fa20: 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c   utimes(zLockFil
fa30: 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  e, NULL);.#endif
fa40: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fa50: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
fa60: 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
fa70: 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66  sive lock */.  f
fa80: 64 20 3d 20 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69  d = open(zLockFi
fa90: 6c 65 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52  le,O_RDONLY|O_CR
faa0: 45 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29  EAT|O_EXCL,0600)
fab0: 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  ;.  if( fd<0 ){.
fac0: 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f      /* failed to
fad0: 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65   open/create the
fae0: 20 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65   file, someone e
faf0: 6c 73 65 20 6d 61 79 20 68 61 76 65 20 73 74 6f  lse may have sto
fb00: 6c 65 6e 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  len the lock */.
fb10: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
fb20: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
fb30: 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f  EEXIST == tErrno
fb40: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
fb50: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
fb60: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72  } else {.      r
fb70: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
fb80: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
fb90: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
fba0: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
fbb0: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
fbc0: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
fbd0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
fbe0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
fbf0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
fc00: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20  turn rc;.  } .  
fc10: 69 66 28 20 63 6c 6f 73 65 28 66 64 29 20 29 7b  if( close(fd) ){
fc20: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
fc30: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
fc40: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
fc50: 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 7d 0a  OERR_CLOSE;.  }.
fc60: 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20    .  /* got it, 
fc70: 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
fc80: 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
fc90: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
fca0: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65  = locktype;.  re
fcb0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
fcc0: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
fcd0: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
fce0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
fcf0: 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  le to locktype. 
fd00: 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
fd10: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
fd20: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
fd30: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
fd40: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
fd50: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
fd60: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
fd70: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
fd80: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
fd90: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
fda0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
fdb0: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  o-op..**.** When
fdc0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
fdd0: 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f  el reaches NO_LO
fde0: 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  CK, delete the l
fdf0: 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ock file..*/.sta
fe00: 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
fe10: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
fe20: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
fe30: 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69  type) {.  unixFi
fe40: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
fe50: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61  xFile*)id;.  cha
fe60: 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
fe70: 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
fe80: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20  ckingContext;.. 
fe90: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
fea0: 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e  ;.  OSTRACE5("UN
feb0: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
fec0: 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f  %d pid=%d (dotlo
fed0: 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
fee0: 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 09 20 20 20  , locktype,..   
fef0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
ff00: 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 61 73   getpid());.  as
ff10: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d  sert( locktype<=
ff20: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
ff30: 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
ff40: 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
ff50: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
ff60: 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e==locktype ){. 
ff70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ff80: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  _OK;.  }..  /* T
ff90: 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73  o downgrade to s
ffa0: 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70  hared, simply up
ffb0: 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
ffc0: 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a  l notion of the.
ffd0: 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e    ** lock state.
ffe0: 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73    No need to mes
fff0: 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  s with the file 
10000 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
10010 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
10020 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
10030 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
10040 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
10050 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10060 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
10070 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63  * To fully unloc
10080 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
10090 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20  delete the lock 
100a0 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  file */.  assert
100b0 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ( locktype==NO_L
100c0 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  OCK );.  if( unl
100d0 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 20 29  ink(zLockFile) )
100e0 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 30  {.    int rc = 0
100f0 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  ;.    int tErrno
10100 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66   = errno;.    if
10110 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72  ( ENOENT != tErr
10120 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  no ){.      rc =
10130 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
10140 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
10150 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
10160 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20  UNLOCK);.    }. 
10170 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
10180 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
10190 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
101a0 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
101b0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
101c0 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  ; .  }.  pFile->
101d0 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f  locktype = NO_LO
101e0 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  CK;.  return SQL
101f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10200 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20   Close a file.  
10210 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
10220 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65  ck has been rele
10230 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73  ased before clos
10240 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
10250 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28  nt dotlockClose(
10260 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
10270 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ) {.  int rc;.  
10280 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
10290 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
102a0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
102b0 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b     dotlockUnlock
102c0 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
102d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
102e0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
102f0 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72 63  ntext);.  }.  rc
10300 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
10310 28 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (id);.  return r
10320 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c;.}./**********
10330 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
10340 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63  the dot-file loc
10350 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
10360 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
10370 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
10380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103c0 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
103d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10410 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
10420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10430 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63   Begin flock Loc
10440 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
10450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10460 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20  *****.**.** Use 
10470 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73 74  the flock() syst
10480 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69  em call to do fi
10490 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  le locking..**.*
104a0 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  * flock() lockin
104b0 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69  g is like dot-fi
104c0 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68  le locking in th
104d0 61 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a  at the various.*
104e0 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63  * fine-grain loc
104f0 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70 70  king levels supp
10500 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74 65 20  orted by SQLite 
10510 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e  are collapsed in
10520 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65  to.** a single e
10530 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20  xclusive lock.  
10540 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
10550 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
10560 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47  , and.** PENDING
10570 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20 73   locks are the s
10580 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e 20  ame thing as an 
10590 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
105a0 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c   SQLite.** still
105b0 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75 20   works when you 
105c0 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f 6e  do this, but con
105d0 63 75 72 72 65 6e 63 79 20 69 73 20 72 65 64 75  currency is redu
105e0 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c  ced since.** onl
105f0 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  y a single proce
10600 73 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e  ss can be readin
10610 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  g the database a
10620 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  t a time..**.** 
10630 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74 69 6f  Omit this sectio
10640 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  n if SQLITE_ENAB
10650 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
10660 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 6f   is turned off o
10670 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e  r if.** compilin
10680 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a 2a  g for VXWORKS..*
10690 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
106a0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
106b0 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53  E && !OS_VXWORKS
106c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
106d0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
106e0 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
106f0 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
10700 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
10710 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
10720 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
10730 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
10740 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
10750 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
10760 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
10770 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
10780 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
10790 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
107a0 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
107b0 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
107c0 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
107d0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
107e0 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
107f0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
10800 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
10810 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10820 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
10830 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
10840 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
10850 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
10860 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
10870 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
10880 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45    .  SimulateIOE
10890 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
108a0 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
108b0 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
108c0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
108d0 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68  le );.  .  /* Ch
108e0 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
108f0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
10900 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
10910 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
10920 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  ->locktype>SHARE
10930 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
10940 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
10950 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
10960 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
10970 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
10980 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21  s it. */.  if( !
10990 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
109a0 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65  /* attempt to ge
109b0 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  t the lock */.  
109c0 20 20 69 6e 74 20 6c 72 63 20 3d 20 66 6c 6f 63    int lrc = floc
109d0 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
109e0 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a  _EX | LOCK_NB);.
109f0 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a      if( !lrc ){.
10a00 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65        /* got the
10a10 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
10a20 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
10a30 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
10a40 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20  LOCK_UN);.      
10a50 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20  if ( lrc ) {.   
10a60 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
10a70 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
10a80 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65   /* unlock faile
10a90 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  d with an error 
10aa0 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d  */.        lrc =
10ab0 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
10ac0 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
10ad0 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
10ae0 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20  UNLOCK); .      
10af0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
10b00 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
10b10 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
10b20 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
10b30 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
10b40 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  lrc;.        }. 
10b50 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
10b60 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45  e {.      int tE
10b70 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
10b80 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
10b90 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f  ;.      /* someo
10ba0 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61  ne else might ha
10bb0 76 65 20 69 74 20 72 65 73 65 72 76 65 64 20 2a  ve it reserved *
10bc0 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71  /.      lrc = sq
10bd0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
10be0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
10bf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
10c00 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49  K); .      if( I
10c10 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
10c20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
10c30 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
10c40 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
10c50 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20  rc = lrc;.      
10c60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  }.    }.  }.  OS
10c70 54 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d  TRACE4("TEST WR-
10c80 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 66  LOCK %d %d %d (f
10c90 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
10ca0 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
10cb0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
10cc0 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
10cd0 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28  OCK_ERRORS.  if(
10ce0 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f   (rc & SQLITE_IO
10cf0 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ERR) == SQLITE_I
10d00 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d  OERR ){.    rc =
10d10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
10d20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a  reserved=1;.  }.
10d30 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
10d40 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
10d50 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a  CK_ERRORS */.  *
10d60 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
10d70 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
10d80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
10d90 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
10da0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
10db0 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
10dc0 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
10dd0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
10de0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
10df0 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
10e00 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
10e10 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
10e20 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
10e30 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
10e40 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
10e50 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
10e60 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
10e70 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
10e80 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
10e90 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
10ea0 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
10eb0 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
10ec0 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
10ed0 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
10ee0 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
10ef0 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
10f00 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
10f10 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
10f20 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
10f30 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
10f40 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
10f50 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
10f60 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
10f70 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
10f80 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
10f90 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
10fa0 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
10fb0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
10fc0 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
10fd0 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
10fe0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
10ff0 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
11000 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
11010 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
11020 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
11030 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63  USIVE.**.** floc
11040 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20  k() only really 
11050 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56  support EXCLUSIV
11060 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61  E locks.  We tra
11070 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a  ck intermediate.
11080 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69  ** lock states i
11090 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  n the sqlite3_fi
110a0 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75  le structure, bu
110b0 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52  t all locks SHAR
110c0 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61  ED or.** above a
110d0 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53  re really EXCLUS
110e0 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78  IVE locks and ex
110f0 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20  clude all other 
11100 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a  processes from.*
11110 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  * access the fil
11120 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
11130 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
11140 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
11150 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
11160 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
11170 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
11180 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
11190 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
111a0 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
111b0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
111c0 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 69 6e 74  ocktype) {.  int
111d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
111e0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
111f0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
11200 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  id;..  assert( p
11210 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66  File );..  /* if
11220 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
11230 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
11240 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
11250 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
11260 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
11270 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
11280 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if (pFile->lockt
11290 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ype > NO_LOCK) {
112a0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
112b0 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
112c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
112d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
112e0 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
112f0 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a  sive lock */.  .
11300 20 20 69 66 20 28 66 6c 6f 63 6b 28 70 46 69 6c    if (flock(pFil
11310 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20  e->h, LOCK_EX | 
11320 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20  LOCK_NB)) {.    
11330 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
11340 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27  no;.    /* didn'
11350 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62  t get, must be b
11360 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  usy */.    rc = 
11370 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
11380 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
11390 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
113a0 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
113b0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
113c0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
113d0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
113e0 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c  no;.    }.  } el
113f0 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20  se {.    /* got 
11400 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
11410 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
11420 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  /.    pFile->loc
11430 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
11440 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34  ;.  }.  OSTRACE4
11450 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
11460 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %s (flock)\n", p
11470 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
11480 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c  eName(locktype),
11490 20 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d   .           rc=
114a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
114b0 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 23  " : "failed");.#
114c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
114d0 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
114e0 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20  RRORS.  if( (rc 
114f0 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
11500 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
11510 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
11520 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e  TE_BUSY;.  }.#en
11530 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
11540 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
11550 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75  ERRORS */.  retu
11560 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
11570 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
11580 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
11590 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
115a0 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20  e to locktype.  
115b0 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74  locktype.** must
115c0 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
115d0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
115e0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
115f0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
11600 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
11610 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
11620 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
11630 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
11640 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
11650 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
11660 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
11670 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  nt flockUnlock(s
11680 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
11690 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
116a0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
116b0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
116c0 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  id;.  .  assert(
116d0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
116e0 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE5("UNLOCK  %d
116f0 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25   %d was %d pid=%
11700 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  d (flock)\n", pF
11710 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
11720 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
11730 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65  le->locktype, ge
11740 74 70 69 64 28 29 29 3b 0a 20 20 61 73 73 65 72  tpid());.  asser
11750 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
11760 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
11770 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
11780 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
11790 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
117a0 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
117b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
117c0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
117d0 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
117e0 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
117f0 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
11800 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
11810 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52   (locktype==SHAR
11820 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  ED_LOCK) {.    p
11830 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
11840 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72   locktype;.    r
11850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11860 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c  .  }.  .  /* no,
11870 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e   really, unlock.
11880 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 66   */.  int rc = f
11890 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
118a0 4f 43 4b 5f 55 4e 29 3b 0a 20 20 69 66 20 28 72  OCK_UN);.  if (r
118b0 63 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 2c 20  c) {.    int r, 
118c0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
118d0 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 45 72      r = sqliteEr
118e0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
118f0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
11900 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
11910 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
11920 45 52 52 4f 52 28 72 29 20 29 7b 0a 20 20 20 20  ERROR(r) ){.    
11930 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11940 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
11950 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
11960 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
11970 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 69 66  CK_ERRORS.    if
11980 28 20 28 72 20 26 20 53 51 4c 49 54 45 5f 49 4f  ( (r & SQLITE_IO
11990 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ERR) == SQLITE_I
119a0 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20 72 20  OERR ){.      r 
119b0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
119c0 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
119d0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
119e0 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
119f0 2f 0a 20 20 20 20 0a 20 20 20 20 72 65 74 75 72  /.    .    retur
11a00 6e 20 72 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  n r;.  } else {.
11a10 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
11a20 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
11a30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11a40 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
11a50 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
11a60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
11a70 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
11a80 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
11a90 66 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f  f( id ){.    flo
11aa0 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
11ab0 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74  LOCK);.  }.  ret
11ac0 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
11ad0 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  e(id);.}..#endif
11ae0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
11af0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
11b00 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f  && !OS_VXWORK */
11b10 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
11b20 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
11b30 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70  e flock lock imp
11b40 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
11b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b60 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
11b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bb0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
11bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c00 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
11c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
11c20 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72  n Named Semaphor
11c30 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  e Locking ******
11c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c50 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73  **.**.** Named s
11c60 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
11c70 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   is only support
11c80 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ed on VxWorks..*
11c90 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
11ca0 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
11cb0 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63  ot-lock and floc
11cc0 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61  k in that it rea
11cd0 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70  lly only.** supp
11ce0 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c  orts EXCLUSIVE l
11cf0 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20  ocking.  Only a 
11d00 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
11d10 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  an read or write
11d20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
11d30 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e   file at a time.
11d40 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70    This reduces p
11d50 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72  otential concurr
11d60 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b  ency, but.** mak
11d70 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c  es the lock impl
11d80 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20  ementation much 
11d90 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f  easier..*/.#if O
11da0 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
11db0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
11dc0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
11dd0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
11de0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
11df0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
11e00 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
11e10 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
11e20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
11e30 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
11e40 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
11e50 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
11e60 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
11e70 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
11e80 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
11e90 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
11ea0 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
11eb0 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
11ec0 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
11ed0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
11ee0 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73 65  int semCheckRese
11ef0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
11f00 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
11f10 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74  pResOut) {.  int
11f20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11f30 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
11f40 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
11f50 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
11f60 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
11f70 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
11f80 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
11f90 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
11fa0 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
11fb0 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
11fc0 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
11fd0 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
11fe0 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
11ff0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
12000 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53  File->locktype>S
12010 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
12020 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
12030 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
12040 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
12050 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
12060 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69  holds it. */.  i
12070 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
12080 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20      sem_t *pSem 
12090 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e  = pFile->pOpen->
120a0 70 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74  pSem;.    struct
120b0 20 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a   stat statBuf;..
120c0 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77      if( sem_tryw
120d0 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b  ait(pSem)==-1 ){
120e0 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
120f0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
12100 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74   if( EAGAIN != t
12110 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  Errno ){.       
12120 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
12130 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
12140 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
12150 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
12160 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  EDLOCK);.       
12170 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
12180 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
12190 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
121a0 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c     /* someone el
121b0 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20  se has the lock 
121c0 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e  when we are in N
121d0 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20  O_LOCK */.      
121e0 20 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46    reserved = (pF
121f0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20  ile->locktype < 
12200 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
12210 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
12220 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75  .      /* we cou
12230 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65  ld have it if we
12240 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20   want it */.    
12250 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29    sem_post(pSem)
12260 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
12270 54 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d  TRACE4("TEST WR-
12280 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73  LOCK %d %d %d (s
12290 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
122a0 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b  , rc, reserved);
122b0 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
122c0 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
122d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
122e0 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
122f0 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
12300 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
12310 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65  r locktype - one
12320 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
12330 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
12340 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
12350 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
12360 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
12370 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
12380 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
12390 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
123a0 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
123b0 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
123c0 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
123d0 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
123e0 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
123f0 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
12400 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
12410 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
12420 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
12430 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
12440 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
12450 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
12460 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
12470 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
12480 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
12490 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
124a0 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
124b0 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
124c0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
124d0 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
124e0 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
124f0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
12500 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
12510 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
12520 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
12530 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
12540 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
12550 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
12560 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
12570 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
12580 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
12590 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73   Semaphore locks
125a0 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70   only really sup
125b0 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c  port EXCLUSIVE l
125c0 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20  ocks.  We track 
125d0 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20  intermediate.** 
125e0 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74  lock states in t
125f0 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
12600 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61  structure, but a
12610 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20  ll locks SHARED 
12620 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20  or.** above are 
12630 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45  really EXCLUSIVE
12640 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75   locks and exclu
12650 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f  de all other pro
12660 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61  cesses from.** a
12670 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a  ccess the file..
12680 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
12690 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
126a0 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
126b0 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
126c0 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
126d0 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
126e0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
126f0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 4c  .static int semL
12700 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
12710 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
12720 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
12730 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
12740 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66  ile*)id;.  int f
12750 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  d;.  sem_t *pSem
12760 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d   = pFile->pOpen-
12770 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20  >pSem;.  int rc 
12780 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
12790 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
127a0 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
127b0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
127c0 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
127d0 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
127e0 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
127f0 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
12800 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f  locktype > NO_LO
12810 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
12820 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
12830 74 79 70 65 3b 0a 20 20 20 20 72 63 20 3d 20 53  type;.    rc = S
12840 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
12850 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
12860 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63  .  }.  .  /* loc
12870 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20  k semaphore now 
12880 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65  but bail out whe
12890 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64  n already locked
128a0 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74  . */.  if( sem_t
128b0 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
128c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
128d0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
128e0 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
128f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69  .  }..  /* got i
12900 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
12910 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
12920 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
12930 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 0a  pe = locktype;..
12940 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20   sem_end_lock:. 
12950 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12960 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
12970 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
12980 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
12990 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  pFile to locktyp
129a0 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
129b0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
129c0 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
129d0 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
129e0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
129f0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
12a00 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
12a10 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
12a20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
12a30 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
12a40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
12a50 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
12a60 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b  ic int semUnlock
12a70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12a80 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
12a90 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
12aa0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
12ab0 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
12ac0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70  Sem = pFile->pOp
12ad0 65 6e 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73  en->pSem;..  ass
12ae0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
12af0 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a  assert( pSem );.
12b00 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f    OSTRACE5("UNLO
12b10 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
12b20 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22   pid=%d (sem)\n"
12b30 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
12b40 74 79 70 65 2c 0a 09 20 20 20 70 46 69 6c 65 2d  type,..   pFile-
12b50 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69  >locktype, getpi
12b60 64 28 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d());.  assert( 
12b70 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
12b80 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
12b90 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
12ba0 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
12bb0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63  e->locktype==loc
12bc0 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74  ktype ){.    ret
12bd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12be0 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65   }.  .  /* share
12bf0 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65  d can just be se
12c00 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77  t because we alw
12c10 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c  ays have an excl
12c20 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c  usive */.  if (l
12c30 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
12c40 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
12c50 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
12c60 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75  cktype;.    retu
12c70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12c80 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
12c90 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  ally unlock. */.
12ca0 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28    if ( sem_post(
12cb0 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20  pSem)==-1 ) {.  
12cc0 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f    int rc, tErrno
12cd0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63   = errno;.    rc
12ce0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
12cf0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
12d00 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
12d10 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  R_UNLOCK);.    i
12d20 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
12d30 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
12d40 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12d50 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
12d60 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20     return rc; . 
12d70 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
12d80 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  type = NO_LOCK;.
12d90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12da0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  OK;.}../*. ** Cl
12db0 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
12dc0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c  static int semCl
12dd0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
12de0 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64   *id) {.  if( id
12df0 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
12e00 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
12e10 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d  ile*)id;.    sem
12e20 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
12e30 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  CK);.    assert(
12e40 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e   pFile );.    un
12e50 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
12e60 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
12e70 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  nfo(pFile->pLock
12e80 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70  );.    releaseOp
12e90 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70  enCnt(pFile->pOp
12ea0 65 6e 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61  en);.    unixLea
12eb0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63  veMutex();.    c
12ec0 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
12ed0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
12ee0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
12ef0 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
12f00 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64  S */./*.** Named
12f10 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
12f20 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ng is only avail
12f30 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  able on VxWorks.
12f40 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
12f50 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e  *** End of the n
12f60 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
12f70 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
12f80 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
12f90 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
12fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12fe0 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/.../*********
12ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13030 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
13040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13050 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b  * Begin AFP Lock
13060 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
13070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13080 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20  *****.**.** AFP 
13090 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c  is the Apple Fil
130a0 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41  ing Protocol.  A
130b0 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20  FP is a network 
130c0 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64  filesystem found
130d0 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63  .** on Apple Mac
130e0 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73  intosh computers
130f0 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20   - both OS9 and 
13100 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64  OSX..**.** Third
13110 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74  -party implement
13120 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72  ations of AFP ar
13130 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75  e available.  Bu
13140 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65  t this code here
13150 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f  .** only works o
13160 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64  n OSX..*/..#if d
13170 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
13180 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
13190 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
131a0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f  ./*.** The afpLo
131b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72  ckingContext str
131c0 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
131d0 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65  all afp lock spe
131e0 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74  cific state.*/.t
131f0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66  ypedef struct af
13200 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
13210 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
13220 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63  t;.struct afpLoc
13230 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
13240 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20  int reserved;.  
13250 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61  const char *dbPa
13260 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
13270 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
13280 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a  pen file */.};..
13290 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
132a0 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69  LockPB2.{.  unsi
132b0 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f  gned long long o
132c0 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
132d0 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   offset to first
132e0 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f   byte to lock */
132f0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
13300 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20   long length;   
13310 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62       /* nbr of b
13320 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
13330 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
13340 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61  long retRangeSta
13350 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73  rt; /* nbr of 1s
13360 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66  t byte locked if
13370 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20   successful */. 
13380 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75   unsigned char u
13390 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20  nLockFlag;      
133a0 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b     /* 1 = unlock
133b0 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20  , 0 = lock */.  
133c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74  unsigned char st
133d0 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20  artEndFlag;     
133e0 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e    /* 1=rel to en
133f0 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c  d of fork, 0=rel
13400 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69   to start */.  i
13410 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13430 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f   /* file desc to
13440 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b   assoc this lock
13450 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65   with */.};..#de
13460 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61  fine afpfsByteRa
13470 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20  ngeLock2FSCTL   
13480 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20       _IOWR('z', 
13490 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52  23, struct ByteR
134a0 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a  angeLockPB2)../*
134b0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74  .** This is a ut
134c0 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e  ility for settin
134d0 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20  g or clearing a 
134e0 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f  bit-range lock o
134f0 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65  n an.** AFP file
13500 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52  system..** .** R
13510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
13520 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49  on success, SQLI
13530 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75  TE_BUSY on failu
13540 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
13550 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20  t afpSetLock(.  
13560 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
13570 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
13580 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
13590 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
135a0 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20  or unlocked */. 
135b0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
135c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
135d0 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
135e0 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20  criptor on path 
135f0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
13600 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20  ng long offset, 
13610 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
13620 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
13630 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
13640 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20  g long length,  
13650 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13660 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
13670 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c  .  int setLockFl
13680 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
13690 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74    /* True to set
136a0 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f   lock.  False to
136b0 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29   clear lock */.)
136c0 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52  {.  struct ByteR
136d0 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a  angeLockPB2 pb;.
136e0 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20    int err;.  .  
136f0 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20  pb.unLockFlag = 
13700 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20  setLockFlag ? 0 
13710 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45  : 1;.  pb.startE
13720 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62  ndFlag = 0;.  pb
13730 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .offset = offset
13740 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20  ;.  pb.length = 
13750 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64  length; .  pb.fd
13760 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a   = pFile->h;.  .
13770 20 20 4f 53 54 52 41 43 45 36 28 22 41 46 50 53    OSTRACE6("AFPS
13780 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20  ETLOCK [%s] for 
13790 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c  %d%s in range %l
137a0 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20  lx:%llx\n", .   
137b0 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f   (setLockFlag?"O
137c0 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65  N":"OFF"), pFile
137d0 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f  ->h, (pb.fd==-1?
137e0 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22  "[testval-1]":""
137f0 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c  ),.    offset, l
13800 65 6e 67 74 68 29 3b 0a 20 20 65 72 72 20 3d 20  ength);.  err = 
13810 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66  fsctl(path, afpf
13820 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46  sByteRangeLock2F
13830 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20  SCTL, &pb, 0);. 
13840 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20   if ( err==-1 ) 
13850 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
13860 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
13870 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43  rrno;.    OSTRAC
13880 45 34 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66  E4("AFPSETLOCK f
13890 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29  ailed to fsctl()
138a0 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a   '%s' %d %s\n",.
138b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74               pat
138c0 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72  h, tErrno, strer
138d0 72 6f 72 28 74 45 72 72 6e 6f 29 29 3b 0a 23 69  ror(tErrno));.#i
138e0 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
138f0 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f  RE_AFP_LOCK_ERRO
13900 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  RS.    rc = SQLI
13910 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20  TE_BUSY;.#else. 
13920 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
13930 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
13940 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  r(tErrno,.      
13950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
13960 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49  tLockFlag ? SQLI
13970 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20  TE_IOERR_LOCK : 
13980 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
13990 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  OCK);.#endif /* 
139a0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46  SQLITE_IGNORE_AF
139b0 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  P_LOCK_ERRORS */
139c0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
139d0 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
139e0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
139f0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
13a00 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
13a10 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  rc;.  } else {. 
13a20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13a30 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
13a40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
13a50 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
13a60 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
13a70 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
13a80 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
13a90 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
13aa0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
13ab0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
13ac0 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
13ad0 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
13ae0 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
13af0 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
13b00 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
13b10 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
13b20 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
13b30 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
13b40 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
13b50 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
13b60 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
13b70 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73   int afpCheckRes
13b80 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
13b90 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13ba0 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
13bb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13bc0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
13bd0 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
13be0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13bf0 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d  le*)id;.  .  Sim
13c00 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
13c10 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
13c20 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
13c30 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
13c40 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
13c50 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
13c60 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
13c70 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
13c80 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
13c90 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20  gContext;.  if( 
13ca0 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
13cb0 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75  d ){.    *pResOu
13cc0 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  t = 1;.    retur
13cd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13ce0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
13cf0 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
13d00 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20  pFile->pLock is 
13d10 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
13d20 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a  reads */.  .  /*
13d30 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
13d40 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
13d50 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
13d60 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
13d70 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->lock
13d80 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  type>SHARED_LOCK
13d90 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
13da0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
13db0 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
13dc0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
13dd0 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a  ocess holds it..
13de0 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73     */.  if( !res
13df0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
13e00 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45  lock the RESERVE
13e10 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e  D byte */.    in
13e20 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f  t lrc = afpSetLo
13e30 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
13e40 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
13e50 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20  VED_BYTE, 1,1); 
13e60 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45   .    if( SQLITE
13e70 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20  _OK==lrc ){.    
13e80 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65    /* if we succe
13e90 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74  eded in taking t
13ea0 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
13eb0 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72  , unlock it to r
13ec0 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  estore.      ** 
13ed0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  the original sta
13ee0 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  te */.      lrc 
13ef0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
13f00 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
13f10 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
13f20 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
13f30 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a   else {.      /*
13f40 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f   if we failed to
13f50 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68   get the lock th
13f60 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  en someone else 
13f70 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a  must have it */.
13f80 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
13f90 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
13fa0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
13fb0 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63  lrc) ){.      rc
13fc0 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =lrc;.    }.  }.
13fd0 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
13fe0 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
13ff0 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  4("TEST WR-LOCK 
14000 25 64 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e  %d %d %d (afp)\n
14010 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
14020 20 72 65 73 65 72 76 65 64 29 3b 0a 20 20 0a 20   reserved);.  . 
14030 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
14040 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
14050 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
14060 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
14070 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
14080 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
14090 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
140a0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
140b0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
140c0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
140d0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
140e0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
140f0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
14100 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
14110 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
14120 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
14130 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
14140 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
14150 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
14160 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
14170 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
14180 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
14190 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
141a0 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
141b0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
141c0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
141d0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
141e0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
141f0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
14200 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
14210 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
14220 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
14230 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
14240 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
14250 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
14260 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
14270 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
14280 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
14290 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
142a0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
142b0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
142c0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
142d0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
142e0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
142f0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
14300 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
14310 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
14320 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
14330 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
14340 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
14350 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
14360 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
14370 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
14380 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69  int afpLock(sqli
14390 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
143a0 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
143b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
143c0 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
143d0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
143e0 2a 29 69 64 3b 0a 20 20 73 74 72 75 63 74 20 75  *)id;.  struct u
143f0 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f  nixLockInfo *pLo
14400 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ck = pFile->pLoc
14410 6b 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  k;.  afpLockingC
14420 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
14430 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
14440 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
14450 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
14460 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
14470 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28  e );.  OSTRACE7(
14480 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
14490 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
144a0 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
144b0 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
144c0 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28     locktypeName(
144d0 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74  locktype), lockt
144e0 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c  ypeName(pFile->l
144f0 6f 63 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20  ocktype),.      
14500 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
14510 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  e(pLock->locktyp
14520 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c  e), pLock->cnt ,
14530 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f   getpid());..  /
14540 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
14550 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
14560 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
14570 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
14580 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
14590 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
145a0 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66  Don't use the af
145b0 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  p_end_lock: exit
145c0 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
145d0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
145e0 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
145f0 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
14600 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
14610 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe>=locktype ){.
14620 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f      OSTRACE3("LO
14630 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28  CK    %d %s ok (
14640 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61  already held) (a
14650 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
14660 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  ,.           loc
14670 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
14680 70 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  pe));.    return
14690 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
146a0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
146b0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
146c0 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
146d0 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
146e0 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
146f0 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
14700 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
14710 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
14720 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
14730 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
14740 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
14750 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
14760 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
14770 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
14780 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
14790 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
147a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
147b0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
147c0 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70  _LOCK || locktyp
147d0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
147e0 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
147f0 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type!=PENDING_LO
14800 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
14810 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56  locktype!=RESERV
14820 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
14830 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
14840 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
14850 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
14860 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
14870 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20  pFile->pLock is 
14880 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
14890 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69  reads.  */.  uni
148a0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a  xEnterMutex();..
148b0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
148c0 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
148d0 64 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65  d owns the pFile
148e0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72  ..  */.  rc = tr
148f0 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28  ansferOwnership(
14900 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  pFile);.  if( rc
14910 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14920 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
14930 78 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  x();.    return 
14940 72 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b 20  rc;.  }.  pLock 
14950 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a  = pFile->pLock;.
14960 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68  .  /* If some th
14970 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
14980 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76  PID has a lock v
14990 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75  ia a different u
149a0 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61  nixFile*.  ** ha
149b0 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75  ndle that preclu
149c0 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65  des the requeste
149d0 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42  d lock, return B
149e0 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  USY..  */.  if( 
149f0 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
14a00 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  !=pLock->locktyp
14a10 65 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 4c  e && .       (pL
14a20 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50  ock->locktype>=P
14a30 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c  ENDING_LOCK || l
14a40 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
14a50 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20  OCK)).     ){.  
14a60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
14a70 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  SY;.    goto afp
14a80 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
14a90 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52   .  /* If a SHAR
14aa0 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ED lock is reque
14ab0 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74  sted, and some t
14ac0 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
14ad0 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a   PID already.  *
14ae0 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f  * has a SHARED o
14af0 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  r RESERVED lock,
14b00 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
14b10 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73  reference counts
14b20 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
14b30 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f   SQLITE_OK..  */
14b40 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
14b50 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
14b60 0a 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f  .     (pLock->lo
14b70 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
14b80 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f  OCK || pLock->lo
14b90 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
14ba0 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
14bb0 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  sert( locktype==
14bc0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
14bd0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
14be0 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b  ->locktype==0 );
14bf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
14c00 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20  ck->cnt>0 );.   
14c10 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
14c20 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
14c30 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b      pLock->cnt++
14c40 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70  ;.    pFile->pOp
14c50 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  en->nLock++;.   
14c60 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
14c70 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f  ck;.  }.    .  /
14c80 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
14c90 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
14ca0 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
14cb0 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
14cc0 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
14cd0 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
14ce0 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
14cf0 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
14d00 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
14d10 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
14d20 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
14d30 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
14d40 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b   .      || (lock
14d50 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
14d60 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c  LOCK && pFile->l
14d70 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f  ocktype<PENDING_
14d80 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69  LOCK).  ){.    i
14d90 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66  nt failed;.    f
14da0 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
14db0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
14dc0 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
14dd0 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a  NG_BYTE, 1, 1);.
14de0 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20      if (failed) 
14df0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
14e00 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  led;.      goto 
14e10 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
14e20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20    }.  }.  .  /* 
14e30 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
14e40 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
14e50 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
14e60 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
14e70 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
14e80 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
14e90 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
14ea0 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  k..  */.  if( lo
14eb0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
14ec0 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  OCK ){.    int l
14ed0 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45  rc1, lrc2, lrc1E
14ee0 72 72 6e 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c  rrno;.    long l
14ef0 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20  k, mask;.    .  
14f00 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
14f10 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  >cnt==0 );.    a
14f20 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f  ssert( pLock->lo
14f30 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20  cktype==0 );.   
14f40 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d       .    mask =
14f50 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d   (sizeof(long)==
14f60 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54  8) ? LARGEST_INT
14f70 36 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b  64 : 0x7fffffff;
14f80 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
14f90 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48  the read-lock SH
14fa0 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  ARED_LOCK */.   
14fb0 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68   /* note that th
14fc0 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65  e quality of the
14fd0 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73   randomness does
14fe0 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20  n't matter that 
14ff0 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d  much */.    lk =
15000 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20   random(); .    
15010 70 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42 79 74  pLock->sharedByt
15020 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25  e = (lk & mask)%
15030 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
15040 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66  );.    lrc1 = af
15050 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
15060 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
15070 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52   .          SHAR
15080 45 44 5f 46 49 52 53 54 2b 70 4c 6f 63 6b 2d 3e  ED_FIRST+pLock->
15090 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31  sharedByte, 1, 1
150a0 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
150b0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29  CK_ERROR(lrc1) )
150c0 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e  {.      lrc1Errn
150d0 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  o = pFile->lastE
150e0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
150f0 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
15100 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
15110 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d  ck */.    lrc2 =
15120 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
15130 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
15140 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
15150 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20  , 1, 0);.    .  
15160 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
15170 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20  ROR(lrc1) ) {.  
15180 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
15190 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f  rrno = lrc1Errno
151a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  ;.      rc = lrc
151b0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  1;.      goto af
151c0 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
151d0 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f  } else if( IS_LO
151e0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29  CK_ERROR(lrc2) )
151f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  {.      rc = lrc
15200 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  2;.      goto af
15210 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
15220 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20  } else if( lrc1 
15230 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b  != SQLITE_OK ) {
15240 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
15250 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
15260 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
15270 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
15280 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  CK;.      pFile-
15290 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  >pOpen->nLock++;
152a0 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e  .      pLock->cn
152b0 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 1;.    }.  }
152c0 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70  else if( locktyp
152d0 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
152e0 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e  K && pLock->cnt>
152f0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
15300 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
15310 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
15320 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
15330 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20  ad in this.     
15340 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
15350 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
15360 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
15370 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
15380 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
15390 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
153a0 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
153b0 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
153c0 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
153d0 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
153e0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
153f0 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
15400 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
15410 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
15420 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
15430 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20  nt failed = 0;. 
15440 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
15450 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b  ile->locktype );
15460 0a 20 20 20 20 69 66 20 28 6c 6f 63 6b 74 79 70  .    if (locktyp
15470 65 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  e >= RESERVED_LO
15480 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK && pFile->loc
15490 6b 74 79 70 65 20 3c 20 52 45 53 45 52 56 45 44  ktype < RESERVED
154a0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20  _LOCK) {.       
154b0 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
154c0 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20  SERVED lock */. 
154d0 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
154e0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
154f0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
15500 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
15510 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66  , 1,1);.      if
15520 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  ( !failed ){.   
15530 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65       context->re
15540 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
15550 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
15560 20 28 21 66 61 69 6c 65 64 20 26 26 20 6c 6f 63   (!failed && loc
15570 6b 74 79 70 65 20 3d 3d 20 45 58 43 4c 55 53 49  ktype == EXCLUSI
15580 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20  VE_LOCK) {.     
15590 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45   /* Acquire an E
155a0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f  XCLUSIVE lock */
155b0 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
155c0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68  /* Remove the sh
155d0 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65  ared lock before
155e0 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67   trying the rang
155f0 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74  e.  we'll need t
15600 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73  o .      ** rees
15610 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
15620 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61  ed lock if we ca
15630 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70  n't get the  afp
15640 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a  Unlock.      */.
15650 20 20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c        if( !(fail
15660 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
15670 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
15680 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
15690 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20  IRST +.         
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156b0 70 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42 79 74  pLock->sharedByt
156c0 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20  e, 1, 0)) ){.   
156d0 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32       int failed2
156e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
156f0 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74        /* now att
15700 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65  emmpt to get the
15710 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
15720 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20  range */.       
15730 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
15740 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
15750 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
15760 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20  RED_FIRST, .    
15770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15780 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
15790 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20  D_SIZE, 1);.    
157a0 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26      if( failed &
157b0 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70  & (failed2 = afp
157c0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
157d0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
157e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
157f0 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
15800 49 52 53 54 20 2b 20 70 4c 6f 63 6b 2d 3e 73 68  IRST + pLock->sh
15810 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29  aredByte, 1, 1))
15820 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
15830 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69   Can't reestabli
15840 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
15850 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27  ck.  Sqlite can'
15860 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a  t deal, this is.
15870 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63            ** a c
15880 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f  ritical I/O erro
15890 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  r.          */. 
158a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 28           rc = ((
158b0 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f  failed & SQLITE_
158c0 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
158d0 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64  _IOERR) ? failed
158e0 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20  2 : .           
158f0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
15900 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  _LOCK;.         
15910 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
15920 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20  ck;.        } . 
15930 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15940 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
15950 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a   .      }.    }.
15960 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29      if( failed )
15970 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
15980 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  led;.    }.  }. 
15990 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49   .  if( rc==SQLI
159a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
159b0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
159c0 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f  ocktype;.    pLo
159d0 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  ck->locktype = l
159e0 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65  ocktype;.  }else
159f0 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
15a00 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
15a10 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
15a20 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  type = PENDING_L
15a30 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  OCK;.    pLock->
15a40 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  locktype = PENDI
15a50 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a  NG_LOCK;.  }.  .
15a60 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  afp_end_lock:.  
15a70 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
15a80 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f  ;.  OSTRACE4("LO
15a90 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
15aa0 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
15ab0 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  h, locktypeName(
15ac0 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20  locktype), .    
15ad0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
15ae0 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
15af0 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  led");.  return 
15b00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
15b10 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
15b20 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
15b30 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
15b40 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
15b50 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
15b60 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
15b70 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
15b80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
15b90 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
15ba0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
15bb0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
15bc0 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
15bd0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
15be0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
15bf0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
15c00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
15c10 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  fpUnlock(sqlite3
15c20 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
15c30 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 69 6e 74  ocktype) {.  int
15c40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15c50 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
15c60 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
15c70 69 64 3b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  id;.  struct uni
15c80 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b  xLockInfo *pLock
15c90 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
15ca0 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
15cb0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
15cc0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
15cd0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
15ce0 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d  int skipShared =
15cf0 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
15d00 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d  E_TEST.  int h =
15d10 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69   pFile->h;.#endi
15d20 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
15d30 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37  le );.  OSTRACE7
15d40 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
15d50 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
15d60 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
15d70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
15d80 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  e,.           pF
15d90 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ile->locktype, p
15da0 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
15db0 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c  ktype, pFile->pL
15dc0 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64  ock->cnt, getpid
15dd0 28 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ());..  assert( 
15de0 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
15df0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
15e00 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d  File->locktype<=
15e10 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
15e20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15e30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43  ;.  }.  if( CHEC
15e40 4b 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65  K_THREADID(pFile
15e50 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
15e60 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
15e70 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
15e80 74 65 78 28 29 3b 0a 20 20 70 4c 6f 63 6b 20 3d  tex();.  pLock =
15e90 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20   pFile->pLock;. 
15ea0 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
15eb0 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  cnt!=0 );.  if( 
15ec0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
15ed0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
15ee0 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
15ef0 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70 46 69 6c  ->locktype==pFil
15f00 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20  e->locktype );. 
15f10 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
15f20 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
15f30 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
15f40 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53  ( h=(-1) ).    S
15f50 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
15f60 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69  nign(0);.    .#i
15f70 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
15f80 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e   /* When reducin
15f90 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68  g a lock such th
15fa0 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  at other process
15fb0 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20  es can start.   
15fc0 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
15fd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67  database file ag
15fe0 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ain, make sure t
15ff0 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  hat the.    ** t
16000 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
16010 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69  er was updated i
16020 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
16030 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
16040 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20  * file changed. 
16050 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
16060 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e  ion counter is n
16070 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20  ot updated,.    
16080 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
16090 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
160a0 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
160b0 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
160c0 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73   ** the file has
160d0 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e   changed and hen
160e0 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f  ce might not kno
160f0 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  w to flush their
16100 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20  .    ** cache.  
16110 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61  The use of a sta
16120 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61  le cache can lea
16130 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
16140 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  rruption..    */
16150 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
16160 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
16170 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
16180 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61  || pFile->dbUpda
16190 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  te==0.          
161a0 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73   || pFile->trans
161b0 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20  CntrChng==1 );. 
161c0 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
161d0 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
161e0 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28  dif.    .    if(
161f0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
16200 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
16210 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
16220 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
16230 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16240 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
16250 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
16260 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
16270 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6c 6f 63  QLITE_OK && (loc
16280 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
16290 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 63 6e 74  CK || pLock->cnt
162a0 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  >1) ){.        /
162b0 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c  * only re-establ
162c0 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
162d0 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79  ock if necessary
162e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
162f0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
16300 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 4c   SHARED_FIRST+pL
16310 6f 63 6b 2d 3e 73 68 61 72 65 64 42 79 74 65 3b  ock->sharedByte;
16320 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
16330 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16340 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16350 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
16360 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20   1, 1);.      } 
16370 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73  else {.        s
16380 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  kipShared = 1;. 
16390 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
163a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
163b0 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  OK && pFile->loc
163c0 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c  ktype>=PENDING_L
163d0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OCK ){.      rc 
163e0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
163f0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16400 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
16410 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
16420 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16430 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
16440 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52  >locktype>=RESER
16450 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74  VED_LOCK && cont
16460 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
16470 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
16480 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
16490 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
164a0 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
164b0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   0);.      if( !
164c0 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63  rc ){ .        c
164d0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
164e0 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20   = 0; .      }. 
164f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
16500 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6c  =SQLITE_OK && (l
16510 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
16520 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 63  LOCK || pLock->c
16530 6e 74 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 4c  nt>1)){.      pL
16540 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ock->locktype = 
16550 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
16560 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
16570 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f  =SQLITE_OK && lo
16580 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
16590 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  ){..    /* Decre
165a0 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
165b0 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
165c0 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
165d0 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
165e0 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
165f0 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
16600 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
16610 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
16620 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
16630 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73  ..    */.    uns
16640 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
16650 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
16660 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 4c   SHARED_FIRST+pL
16670 6f 63 6b 2d 3e 73 68 61 72 65 64 42 79 74 65 3b  ock->sharedByte;
16680 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d  .    pLock->cnt-
16690 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  -;.    if( pLock
166a0 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->cnt==0 ){.    
166b0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
166c0 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
166d0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
166e0 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
166f0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
16700 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
16710 20 20 69 66 28 20 21 73 6b 69 70 53 68 61 72 65    if( !skipShare
16720 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  d ){.        rc 
16730 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16740 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16750 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42  ile, sharedLockB
16760 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  yte, 1, 0);.    
16770 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72    }.      if( !r
16780 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  c ){.        pLo
16790 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e  ck->locktype = N
167a0 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  O_LOCK;.        
167b0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
167c0 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
167d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
167e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
167f0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 75  {.      struct u
16800 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65  nixOpenCnt *pOpe
16810 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e  n = pFile->pOpen
16820 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
16830 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b   pOpen->nLock--;
16840 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16850 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  Open->nLock>=0 )
16860 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 65  ;.      if( pOpe
16870 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  n->nLock==0 ){. 
16880 20 20 20 20 20 20 20 72 63 20 3d 20 63 6c 6f 73         rc = clos
16890 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
168a0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
168b0 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c  }.  }.  .  unixL
168c0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
168d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
168e0 20 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   ) pFile->lockty
168f0 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
16900 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16910 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
16920 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20  e & cleanup AFP 
16930 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67  specific locking
16940 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61   context .*/.sta
16950 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65  tic int afpClose
16960 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
16970 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d) {.  int rc = 
16980 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
16990 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
169a0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
169b0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
169c0 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  afpUnlock(id, NO
169d0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78  _LOCK);.    unix
169e0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
169f0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4f 70    if( pFile->pOp
16a00 65 6e 20 26 26 20 70 46 69 6c 65 2d 3e 70 4f 70  en && pFile->pOp
16a10 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  en->nLock ){.   
16a20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
16a30 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
16a40 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
16a50 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
16a60 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20  file just.      
16a70 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
16a80 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
16a90 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
16aa0 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
16ab0 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
16ac0 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e  criptor to pOpen
16ad0 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20  ->aPending.  It 
16ae0 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
16af0 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65  cally closed whe
16b00 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  n.      ** the l
16b10 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
16b20 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
16b30 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64      setPendingFd
16b40 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
16b50 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
16b60 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29  fo(pFile->pLock)
16b70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65  ;.    releaseOpe
16b80 6e 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65  nCnt(pFile->pOpe
16b90 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  n);.    sqlite3_
16ba0 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  free(pFile->lock
16bb0 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ingContext);.   
16bc0 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
16bd0 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69  ile(id);.    uni
16be0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
16bf0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
16c00 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  }..#endif /* def
16c10 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
16c20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
16c30 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
16c40 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  /./*.** The code
16c50 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 41 46   above is the AF
16c60 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  P lock implement
16c70 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65  ation.  The code
16c80 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20   is specific.** 
16c90 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f  to MacOSX and do
16ca0 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f  es not work on o
16cb0 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f  ther unix platfo
16cc0 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61  rms.  No alterna
16cd0 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  tive.** is avail
16ce0 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f  able.  If you do
16cf0 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20  n't compile for 
16d00 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20  a mac, then the 
16d10 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46  "unix-afp".** VF
16d20 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  S is not availab
16d30 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
16d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
16d50 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b   of the AFP lock
16d60 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
16d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d80 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
16d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16dd0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
16de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e20 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
16e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e40 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f  *** Begin NFS Lo
16e50 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
16e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e70 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66  ******/..#if def
16e80 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
16e90 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
16ea0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
16eb0 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  *. ** Lower the 
16ec0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
16ed0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16ee0 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79   pFile to lockty
16ef0 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 20 2a  pe.  locktype. *
16f00 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
16f10 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
16f20 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a  ED_LOCK.. **. **
16f30 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
16f40 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
16f50 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
16f60 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
16f70 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75  low. ** the requ
16f80 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
16f90 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
16fa0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a  e is a no-op.. *
16fb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73  /.static int nfs
16fc0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
16fd0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
16fe0 6b 74 79 70 65 29 7b 0a 20 20 72 65 74 75 72 6e  ktype){.  return
16ff0 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64   _posixUnlock(id
17000 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 31 29 3b 0a  , locktype, 1);.
17010 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  }..#endif /* def
17020 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
17030 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
17040 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
17050 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  /./*.** The code
17060 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46   above is the NF
17070 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  S lock implement
17080 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65  ation.  The code
17090 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20   is specific.** 
170a0 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f  to MacOSX and do
170b0 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f  es not work on o
170c0 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f  ther unix platfo
170d0 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61  rms.  No alterna
170e0 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  tive.** is avail
170f0 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a  able.  .**.*****
17100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17110 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20   End of the NFS 
17120 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
17130 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
17140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
17150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
171a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
171f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e  ************ Non
17200 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33  -locking sqlite3
17210 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a  _file methods **
17220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
17240 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69 73  * The next divis
17250 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70  ion contains imp
17260 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72  lementations for
17270 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20   all methods of 
17280 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  the .** sqlite3_
17290 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65  file object othe
172a0 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69  r than the locki
172b0 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65  ng methods.  The
172c0 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68   locking.** meth
172d0 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65 64  ods were defined
172e0 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62   in divisions ab
172f0 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67  ove (one locking
17300 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64   method per.** d
17310 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65  ivision).  Those
17320 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61 72   methods that ar
17330 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  e common to all 
17340 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a  locking modes.**
17350 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67 65   are gather toge
17360 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64  ther into this d
17370 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a  ivision..*/../*.
17380 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
17390 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73 20  ffset passed as 
173a0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
173b0 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63  ent, then read c
173c0 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74  nt .** bytes int
173d0 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74  o pBuf. Return t
173e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
173f0 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
17400 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20  ..**.** NB:  If 
17410 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50  you define USE_P
17420 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41  READ or USE_PREA
17430 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  D64, then it mig
17440 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65  ht also.** be ne
17450 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e  cessary to defin
17460 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20  e _XOPEN_SOURCE 
17470 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69 73  to be 500.  This
17480 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20   varies from.** 
17490 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e  one system to an
174a0 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51  other.  Since SQ
174b0 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65  Lite does not de
174c0 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a  fine USE_PREAD.*
174d0 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62  * any any form b
174e0 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69  y default, we wi
174f0 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  ll not attempt t
17500 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
17510 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74  SOURCE..** See t
17520 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64  ickets #2741 and
17530 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f   #2681..**.** To
17540 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20   avoid stomping 
17550 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20  the errno value 
17560 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61 64  on a failed read
17570 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
17580 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
17590 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
175a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
175b0 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46  eekAndRead(unixF
175c0 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
175d0 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76  _int64 offset, v
175e0 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
175f0 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
17600 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53  #if (!defined(US
17610 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66  E_PREAD) && !def
17620 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
17630 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  )).  i64 newOffs
17640 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  et;.#endif.  TIM
17650 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65  ER_START;.#if de
17660 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
17670 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28 69  .  got = pread(i
17680 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
17690 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69 6d 75   offset);.  Simu
176a0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
176b0 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64   = -1 );.#elif d
176c0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
176d0 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 72 65 61  64).  got = prea
176e0 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  d64(id->h, pBuf,
176f0 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
17700 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
17710 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
17720 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20  lse.  newOffset 
17730 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f  = lseek(id->h, o
17740 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29  ffset, SEEK_SET)
17750 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
17760 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d  ror( newOffset--
17770 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66   );.  if( newOff
17780 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20  set!=offset ){. 
17790 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74     if( newOffset
177a0 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20   == -1 ){.      
177b0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
177c0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
177d0 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  no;.    }else{. 
177e0 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
177f0 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
17800 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20  = 0;....    }.  
17810 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
17820 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69 64  .  got = read(id
17830 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b  ->h, pBuf, cnt);
17840 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
17850 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30  END;.  if( got<0
17860 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
17870 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
17880 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a  no = errno;.  }.
17890 20 20 4f 53 54 52 41 43 45 35 28 22 52 45 41 44    OSTRACE5("READ
178a0 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c      %-3d %5d %7l
178b0 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e  ld %llu\n", id->
178c0 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20  h, got, offset, 
178d0 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a  TIMER_ELAPSED);.
178e0 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a    return got;.}.
178f0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
17900 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
17910 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
17920 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
17930 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
17940 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
17950 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
17960 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
17970 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
17980 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
17990 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74  nixRead(.  sqlit
179a0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20  e3_file *id, .  
179b0 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69  void *pBuf, .  i
179c0 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65  nt amt,.  sqlite
179d0 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29  3_int64 offset.)
179e0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
179f0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
17a00 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b  *)id;.  int got;
17a10 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
17a20 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
17a30 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
17a40 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
17a50 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  , master-journal
17a60 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69   or temp.  ** fi
17a70 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69  le), the bytes i
17a80 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  n the locking ra
17a90 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  nge should never
17aa0 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
17ab0 74 65 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ten. */.  assert
17ac0 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  ( pFile->pUnused
17ad0 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  ==0.       || of
17ae0 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59  fset>=PENDING_BY
17af0 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c  TE+512.       ||
17b00 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e   offset+amt<=PEN
17b10 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a  DING_BYTE .  );.
17b20 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64  .  got = seekAnd
17b30 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73  Read(pFile, offs
17b40 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  et, pBuf, amt);.
17b50 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29    if( got==amt )
17b60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17b70 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
17b80 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
17b90 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
17ba0 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64  t by seekAndRead
17bb0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
17bc0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
17bd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
17be0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
17bf0 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79  = 0; /* not a sy
17c00 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
17c10 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
17c20 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
17c30 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
17c40 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
17c50 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
17c60 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f  [got], 0, amt-go
17c70 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
17c80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
17c90 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f  T_READ;.  }.}../
17ca0 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
17cb0 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f   offset in id->o
17cc0 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20  ffset then read 
17cd0 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70  cnt bytes into p
17ce0 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  Buf..** Return t
17cf0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
17d00 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
17d10 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66  .  Update the of
17d20 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  fset..**.** To a
17d30 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
17d40 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
17d50 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20   a failed write 
17d60 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
17d70 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
17d80 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
17d90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
17da0 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46  ekAndWrite(unixF
17db0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66  ile *id, i64 off
17dc0 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  set, const void 
17dd0 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
17de0 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20  .  int got;.#if 
17df0 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  (!defined(USE_PR
17e00 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64  EAD) && !defined
17e10 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20  (USE_PREAD64)). 
17e20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
17e30 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53  #endif.  TIMER_S
17e40 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65  TART;.#if define
17e50 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 67  d(USE_PREAD).  g
17e60 6f 74 20 3d 20 70 77 72 69 74 65 28 69 64 2d 3e  ot = pwrite(id->
17e70 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
17e80 66 73 65 74 29 3b 0a 23 65 6c 69 66 20 64 65 66  fset);.#elif def
17e90 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
17ea0 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65  ).  got = pwrite
17eb0 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  64(id->h, pBuf, 
17ec0 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65  cnt, offset);.#e
17ed0 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20  lse.  newOffset 
17ee0 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f  = lseek(id->h, o
17ef0 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29  ffset, SEEK_SET)
17f00 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65  ;.  if( newOffse
17f10 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20  t!=offset ){.   
17f20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d   if( newOffset =
17f30 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28  = -1 ){.      ((
17f40 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
17f50 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
17f60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17f70 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
17f80 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
17f90 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20  0;....    }.    
17fa0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
17fb0 20 67 6f 74 20 3d 20 77 72 69 74 65 28 69 64 2d   got = write(id-
17fc0 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a  >h, pBuf, cnt);.
17fd0 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45  #endif.  TIMER_E
17fe0 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20  ND;.  if( got<0 
17ff0 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c  ){.    ((unixFil
18000 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
18010 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a  o = errno;.  }..
18020 20 20 4f 53 54 52 41 43 45 35 28 22 57 52 49 54    OSTRACE5("WRIT
18030 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c  E   %-3d %5d %7l
18040 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e  ld %llu\n", id->
18050 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20  h, got, offset, 
18060 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a  TIMER_ELAPSED);.
18070 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a    return got;.}.
18080 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
18090 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
180a0 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
180b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
180c0 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
180d0 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
180e0 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
180f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
18100 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71   unixWrite(.  sq
18110 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
18120 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
18130 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
18140 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
18150 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e   offset .){.  un
18160 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
18170 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
18180 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a   int wrote = 0;.
18190 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
181a0 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
181b0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
181c0 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
181d0 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
181e0 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
181f0 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
18200 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
18210 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
18220 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
18230 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
18240 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  itten. */.  asse
18250 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  rt( pFile->pUnus
18260 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
18270 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
18280 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
18290 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
182a0 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
182b0 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
182c0 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  G.  /* If we are
182d0 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20   doing a normal 
182e0 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62  write to a datab
182f0 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70  ase file (as opp
18300 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69  osed to.  ** doi
18310 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
18320 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77   rollback or a w
18330 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c  rite to some fil
18340 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20  e other than a. 
18350 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62   ** normal datab
18360 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72  ase file) then r
18370 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
18380 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
18390 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65  .  ** has change
183a0 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73  d.  If the trans
183b0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
183c0 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f  s modified, reco
183d0 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63  rd that.  ** fac
183e0 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  t too..  */.  if
183f0 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
18400 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46  lWrite ){.    pF
18410 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  ile->dbUpdate = 
18420 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  1;  /* The datab
18430 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  ase has been mod
18440 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  ified */.    if(
18450 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f   offset<=24 && o
18460 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b  ffset+amt>=27 ){
18470 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
18480 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74       char oldCnt
18490 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75  r[4];.      Simu
184a0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
184b0 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  n(1);.      rc =
184c0 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69   seekAndRead(pFi
184d0 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c  le, 24, oldCntr,
184e0 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c   4);.      Simul
184f0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
18500 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  (0);.      if( r
18510 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f  c!=4 || memcmp(o
18520 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a  ldCntr, &((char*
18530 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74  )pBuf)[24-offset
18540 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ], 4)!=0 ){.    
18550 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
18560 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f  CntrChng = 1;  /
18570 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
18580 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68  n counter has ch
18590 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d  anged */.      }
185a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
185b0 66 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e  f..  while( amt>
185c0 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20 73 65  0 && (wrote = se
185d0 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65  ekAndWrite(pFile
185e0 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
185f0 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61  amt))>0 ){.    a
18600 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20  mt -= wrote;.   
18610 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65   offset += wrote
18620 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28  ;.    pBuf = &((
18630 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74  char*)pBuf)[wrot
18640 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61  e];.  }.  Simula
18650 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74  teIOError(( wrot
18660 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29  e=(-1), amt=1 ))
18670 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  ;.  SimulateDisk
18680 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74  fullError(( wrot
18690 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  e=0, amt=1 ));. 
186a0 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20   if( amt>0 ){.  
186b0 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 29 7b    if( wrote<0 ){
186c0 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  .      /* lastEr
186d0 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
186e0 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  ndWrite */.     
186f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
18700 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
18710 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
18720 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
18730 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74  0; /* not a syst
18740 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
18750 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18760 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
18770 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18780 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  OK;.}..#ifdef SQ
18790 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
187a0 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
187b0 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e   of fullsyncs an
187c0 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20  d normal syncs. 
187d0 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
187e0 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79   test.** that sy
187f0 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63  ncs and fullsync
18800 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20  s are occurring 
18810 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
18820 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
18830 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
18840 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
18850 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
18860 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
18870 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73 74   We do not trust
18880 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f 76   systems to prov
18890 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66 64  ide a working fd
188a0 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65  atasync().  Some
188b0 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64   do..** Others d
188c0 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61 66  o no.  To be saf
188d0 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63 6b  e, we will stick
188e0 20 77 69 74 68 20 74 68 65 20 28 73 6c 6f 77 65   with the (slowe
188f0 72 29 20 66 73 79 6e 63 28 29 2e 0a 2a 2a 20 49  r) fsync()..** I
18900 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20  f you know that 
18910 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73  your system does
18920 20 73 75 70 70 6f 72 74 20 66 64 61 74 61 73 79   support fdatasy
18930 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a  nc() correctly,.
18940 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63  ** then simply c
18950 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64  ompile with -Dfd
18960 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e  atasync=fdatasyn
18970 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  c.*/.#if !define
18980 64 28 66 64 61 74 61 73 79 6e 63 29 20 26 26 20  d(fdatasync) && 
18990 21 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78  !defined(__linux
189a0 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20 66 64 61  __).# define fda
189b0 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e  tasync fsync.#en
189c0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  dif../*.** Defin
189d0 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
189e0 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e   to 0 or 1 depen
189f0 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
18a00 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f  or not.** the F_
18a10 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20  FULLFSYNC macro 
18a20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46  is defined.  F_F
18a30 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72  ULLFSYNC is curr
18a40 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76  ently.** only av
18a50 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f  ailable on Mac O
18a60 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63  S X.  But that c
18a70 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a  ould change..*/.
18a80 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59  #ifdef F_FULLFSY
18a90 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  NC.# define HAVE
18aa0 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c  _FULLFSYNC 1.#el
18ab0 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  se.# define HAVE
18ac0 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e  _FULLFSYNC 0.#en
18ad0 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
18ae0 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63  fsync() system c
18af0 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  all does not wor
18b00 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20  k as advertised 
18b10 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20  on many.** unix 
18b20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f  systems.  The fo
18b30 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72  llowing procedur
18b40 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  e is an attempt 
18b50 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f  to make.** it wo
18b60 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a  rk better..**.**
18b70 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   The SQLITE_NO_S
18b80 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c  YNC macro disabl
18b90 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e  es all fsync()s.
18ba0 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c    This is useful
18bb0 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20  .** for testing 
18bc0 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
18bd0 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  run through the 
18be0 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b  test suite quick
18bf0 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73  ly..** You are s
18c00 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20  trongly advised 
18c10 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20  *not* to deploy 
18c20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
18c30 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  YNC.** enabled, 
18c40 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77  however, since w
18c50 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
18c60 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f  NC enabled, an O
18c70 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f  S crash.** or po
18c80 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c  wer failure will
18c90 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20   likely corrupt 
18ca0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18cb0 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  e..**.** SQLite 
18cc0 73 65 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c  sets the dataOnl
18cd0 79 20 66 6c 61 67 20 69 66 20 74 68 65 20 73 69  y flag if the si
18ce0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ze of the file i
18cf0 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  s unchanged..** 
18d00 54 68 65 20 69 64 65 61 20 62 65 68 69 6e 64 20  The idea behind 
18d10 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74  dataOnly is that
18d20 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20   it should only 
18d30 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 63  write the file c
18d40 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73  ontent.** to dis
18d50 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65  k, not the inode
18d60 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64  .  We only set d
18d70 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66  ataOnly if the f
18d80 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20  ile size is .** 
18d90 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20  unchanged since 
18da0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73  the file size is
18db0 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f   part of the ino
18dc0 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a  de.  However, .*
18dd0 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73  * Ted Ts'o tells
18de0 20 75 73 20 74 68 61 74 20 66 64 61 74 61 73 79   us that fdatasy
18df0 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77  nc() will also w
18e00 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69  rite the inode i
18e10 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69  f the.** file si
18e20 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20  ze has changed. 
18e30 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64   The only real d
18e40 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
18e50 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a  n fdatasync().**
18e60 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65   and fsync(), Te
18e70 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74  d tells us, is t
18e80 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  hat fdatasync() 
18e90 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74  will not flush t
18ea0 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74  he.** inode if t
18eb0 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65  he mtime or owne
18ec0 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65  r or other inode
18ed0 20 61 74 74 72 69 62 75 74 65 73 20 68 61 76 65   attributes have
18ee0 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20   changed..** We 
18ef0 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20  only care about 
18f00 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e  the file size, n
18f10 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c  ot the other fil
18f20 65 20 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f  e attributes, so
18f30 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20 53 51  .** as far as SQ
18f40 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65  Lite is concerne
18f50 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28  d, an fdatasync(
18f60 29 20 69 73 20 61 6c 77 61 79 73 20 61 64 65 71  ) is always adeq
18f70 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20  uate..** So, we 
18f80 61 6c 77 61 79 73 20 75 73 65 20 66 64 61 74 61  always use fdata
18f90 73 79 6e 63 28 29 20 69 66 20 69 74 20 69 73 20  sync() if it is 
18fa0 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72  available, regar
18fb0 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20  dless of.** the 
18fc0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
18fd0 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73  aOnly flag..*/.s
18fe0 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66  tatic int full_f
18ff0 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74  sync(int fd, int
19000 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64   fullSync, int d
19010 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  ataOnly){.  int 
19020 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  rc;..  /* The fo
19030 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65  llowing "ifdef/e
19040 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b  lif/else/" block
19050 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 73 74   has the same st
19060 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20  ructure as.  ** 
19070 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49  the one below. I
19080 74 20 69 73 20 72 65 70 6c 69 63 61 74 65 64 20  t is replicated 
19090 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61  here solely to a
190a0 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20  void cluttering 
190b0 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61  .  ** up the rea
190c0 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68 65 20  l code with the 
190d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
190e0 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a  () macros..  */.
190f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
19100 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50  _SYNC.  UNUSED_P
19110 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
19120 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19130 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e  (fullSync);.  UN
19140 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
19150 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20  ataOnly);.#elif 
19160 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
19170 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
19180 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
19190 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
191a0 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b  METER(fullSync);
191b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
191c0 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
191d0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f  endif..  /* Reco
191e0 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rd the number of
191f0 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20 64   times that we d
19200 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63  o a normal fsync
19210 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c  () and .  ** FUL
19220 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20  LSYNC.  This is 
19230 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74  used during test
19240 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68  ing to verify th
19250 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  at this procedur
19260 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c  e.  ** gets call
19270 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  ed with the corr
19280 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20  ect arguments.. 
19290 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
192a0 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c  E_TEST.  if( ful
192b0 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f  lSync ) sqlite3_
192c0 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
192d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  ;.  sqlite3_sync
192e0 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
192f0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d  ..  /* If we com
19300 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53  piled with the S
19310 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c  QLITE_NO_SYNC fl
19320 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67  ag, then syncing
19330 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70   is a.  ** no-op
19340 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
19350 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63  ITE_NO_SYNC.  rc
19360 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65   = SQLITE_OK;.#e
19370 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
19380 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  NC.  if( fullSyn
19390 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 63  c ){.    rc = fc
193a0 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53  ntl(fd, F_FULLFS
193b0 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  YNC, 0);.  }else
193c0 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
193d0 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55  }.  /* If the FU
193e0 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20  LLFSYNC failed, 
193f0 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74  fall back to att
19400 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63  empting an fsync
19410 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75  ()..  ** It shou
19420 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c  ldn't be possibl
19430 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20  e for fullfsync 
19440 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c  to fail on the l
19450 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  ocal .  ** file 
19460 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c  system (on OSX),
19470 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69   so failure indi
19480 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46  cates that FULLF
19490 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20  SYNC.  ** isn't 
194a0 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68  supported for th
194b0 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  is file system. 
194c0 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66  So, attempt an f
194d0 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28  sync .  ** and (
194e0 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20  for now) ignore 
194f0 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
19500 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63  a superfluous fc
19510 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a  ntl call.  .  **
19520 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20   It'd be better 
19530 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73  to detect fullfs
19540 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65  ync support once
19550 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a   and avoid .  **
19560 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20   the fcntl call 
19570 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20  every time sync 
19580 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a  is called..  */.
19590 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20    if( rc ) rc = 
195a0 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69  fsync(fd);..#eli
195b0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
195c0 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73  E__).  /* fdatas
195d0 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f  ync() on HFS+ do
195e0 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20  esn't yet flush 
195f0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66  the file size if
19600 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72   it changed corr
19610 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75  ectly.  ** so cu
19620 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75  rrently we defau
19630 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  lt to the macro 
19640 74 68 61 74 20 72 65 64 65 66 69 6e 65 73 20 66  that redefines f
19650 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e  datasync to fsyn
19660 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73  c.  */.  rc = fs
19670 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a  ync(fd);.#else .
19680 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63    rc = fdatasync
19690 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57  (fd);.#if OS_VXW
196a0 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d  ORKS.  if( rc==-
196b0 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54  1 && errno==ENOT
196c0 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  SUP ){.    rc = 
196d0 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23  fsync(fd);.  }.#
196e0 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
196f0 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  RKS */.#endif /*
19700 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f   ifdef SQLITE_NO
19710 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f  _SYNC elif HAVE_
19720 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20  FULLFSYNC */..  
19730 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  if( OS_VXWORKS &
19740 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20  & rc!= -1 ){.   
19750 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72   rc = 0;.  }.  r
19760 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19770 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** Make sure all
19780 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72   writes to a par
19790 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65  ticular file are
197a0 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
197b0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  sk..**.** If dat
197c0 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f  aOnly==0 then bo
197d0 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65  th the file itse
197e0 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64  lf and its metad
197f0 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a  ata (file.** siz
19800 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20  e, access time, 
19810 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e  etc) are synced.
19820 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30    If dataOnly!=0
19830 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a   then only the.*
19840 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73  * file data is s
19850 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64  ynced..**.** Und
19860 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61  er Unix, also ma
19870 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
19880 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
19890 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a   for the file.**
198a0 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
198b0 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74  d by fsync-ing t
198c0 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
198d0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66  t contains the f
198e0 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f  ile..** If we do
198f0 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64   not do this and
19900 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20   we encounter a 
19910 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
19920 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
19930 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
19940 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
19950 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72  exist after we r
19960 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74  eboot.  The next
19970 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63  .** SQLite to ac
19980 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69  cess the file wi
19990 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74  ll not know that
199a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69   the journal exi
199b0 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  sts (because.** 
199c0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
199d0 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
199e0 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72  nal was never cr
199f0 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74  eated) and the t
19a00 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69  ransaction.** wi
19a10 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b  ll not roll back
19a20 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64   - possibly lead
19a30 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20  ing to database 
19a40 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
19a50 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79  tatic int unixSy
19a60 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nc(sqlite3_file 
19a70 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  *id, int flags){
19a80 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
19a90 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
19aa0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
19ab0 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20   int isDataOnly 
19ac0 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  = (flags&SQLITE_
19ad0 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a  SYNC_DATAONLY);.
19ae0 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63    int isFullsync
19af0 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d   = (flags&0x0F)=
19b00 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
19b10 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  L;..  /* Check t
19b20 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  hat one of SQLIT
19b30 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  E_SYNC_NORMAL or
19b40 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64   FULL was passed
19b50 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c   */.  assert((fl
19b60 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
19b70 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20  E_SYNC_NORMAL.  
19b80 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78      || (flags&0x
19b90 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
19ba0 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a  _FULL.  );..  /*
19bb0 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75   Unix cannot, bu
19bc0 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d  t some systems m
19bd0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
19be0 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e  _FULL from here.
19bf0 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20   This.  ** line 
19c00 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  is to test that 
19c10 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f  doing so does no
19c20 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  t cause any prob
19c30 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  lems..  */.  Sim
19c40 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
19c50 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
19c60 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73  E_FULL );..  ass
19c70 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
19c80 4f 53 54 52 41 43 45 32 28 22 53 59 4e 43 20 20  OSTRACE2("SYNC  
19c90 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
19ca0 2d 3e 68 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c  ->h);.  rc = ful
19cb0 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68  l_fsync(pFile->h
19cc0 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73  , isFullsync, is
19cd0 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d  DataOnly);.  Sim
19ce0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
19cf0 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29  =1 );.  if( rc )
19d00 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
19d10 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
19d20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19d30 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3b 0a 20  E_IOERR_FSYNC;. 
19d40 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
19d50 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  dirfd>=0 ){.    
19d60 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 4f 53 54  int err;.    OST
19d70 52 41 43 45 34 28 22 44 49 52 53 59 4e 43 20 25  RACE4("DIRSYNC %
19d80 2d 33 64 20 28 68 61 76 65 5f 66 75 6c 6c 66 73  -3d (have_fullfs
19d90 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d  ync=%d fullsync=
19da0 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64  %d)\n", pFile->d
19db0 69 72 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  irfd,.          
19dc0 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43    HAVE_FULLFSYNC
19dd0 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 3b 0a 23  , isFullsync);.#
19de0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
19df0 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20  SABLE_DIRSYNC.  
19e00 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 6f    /* The directo
19e10 72 79 20 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20  ry sync is only 
19e20 61 74 74 65 6d 70 74 65 64 20 69 66 20 66 75 6c  attempted if ful
19e30 6c 5f 66 73 79 6e 63 20 69 73 0a 20 20 20 20 2a  l_fsync is.    *
19e40 2a 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20  * turned off or 
19e50 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66  unavailable.  If
19e60 20 61 20 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63   a full_fsync oc
19e70 63 75 72 72 65 64 20 61 62 6f 76 65 2c 0a 20 20  curred above,.  
19e80 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 69    ** then the di
19e90 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20  rectory sync is 
19ea0 73 75 70 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20  superfluous..   
19eb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 48 41   */.    if( (!HA
19ec0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20  VE_FULLFSYNC || 
19ed0 21 69 73 46 75 6c 6c 73 79 6e 63 29 20 26 26 20  !isFullsync) && 
19ee0 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65  full_fsync(pFile
19ef0 2d 3e 64 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a  ->dirfd,0,0) ){.
19f00 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20         /*.      
19f10 20 2a 2a 20 57 65 20 68 61 76 65 20 72 65 63 65   ** We have rece
19f20 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 72 65  ived multiple re
19f30 70 6f 72 74 73 20 6f 66 20 66 73 79 6e 63 28 29  ports of fsync()
19f40 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20   returning.     
19f50 20 20 2a 2a 20 65 72 72 6f 72 73 20 77 68 65 6e    ** errors when
19f60 20 61 70 70 6c 69 65 64 20 74 6f 20 64 69 72 65   applied to dire
19f70 63 74 6f 72 69 65 73 20 6f 6e 20 63 65 72 74 61  ctories on certa
19f80 69 6e 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  in file systems.
19f90 0a 20 20 20 20 20 20 20 2a 2a 20 41 20 66 61 69  .       ** A fai
19fa0 6c 65 64 20 64 69 72 65 63 74 6f 72 79 20 73 79  led directory sy
19fb0 6e 63 20 69 73 20 6e 6f 74 20 61 20 62 69 67 20  nc is not a big 
19fc0 64 65 61 6c 2e 20 20 53 6f 20 69 74 20 73 65 65  deal.  So it see
19fd0 6d 73 0a 20 20 20 20 20 20 20 2a 2a 20 62 65 74  ms.       ** bet
19fe0 74 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68  ter to ignore th
19ff0 65 20 65 72 72 6f 72 2e 20 20 54 69 63 6b 65 74  e error.  Ticket
1a000 20 23 31 36 35 37 0a 20 20 20 20 20 20 20 2a 2f   #1657.       */
1a010 0a 20 20 20 20 20 20 20 2f 2a 20 70 46 69 6c 65  .       /* pFile
1a020 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1a030 72 6e 6f 3b 20 2a 2f 0a 20 20 20 20 20 20 20 2f  rno; */.       /
1a040 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
1a050 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a  IOERR; */.    }.
1a060 23 65 6e 64 69 66 0a 20 20 20 20 65 72 72 20 3d  #endif.    err =
1a070 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69   close(pFile->di
1a080 72 66 64 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6e 65  rfd); /* Only ne
1a090 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c  ed to sync once,
1a0a0 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 2a 2f   so close the */
1a0b0 0a 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20  .    if( err==0 
1a0c0 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
1a0d0 2f 2a 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  /* directory whe
1a0e0 6e 20 77 65 20 61 72 65 20 64 6f 6e 65 20 2a 2f  n we are done */
1a0f0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 69  .      pFile->di
1a100 72 66 64 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  rfd = -1;.    }e
1a110 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
1a120 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1a130 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
1a140 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
1a150 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 7d 0a 20 20  _CLOSE;.    }.  
1a160 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a170 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
1a180 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f   an open file to
1a190 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a   a specified siz
1a1a0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
1a1b0 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c  unixTruncate(sql
1a1c0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1a1d0 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74  64 nByte){.  int
1a1e0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69   rc;.  assert( i
1a1f0 64 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  d );.  SimulateI
1a200 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
1a210 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1a220 43 41 54 45 20 29 3b 0a 20 20 72 63 20 3d 20 66  CATE );.  rc = f
1a230 74 72 75 6e 63 61 74 65 28 28 28 75 6e 69 78 46  truncate(((unixF
1a240 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28 6f 66  ile*)id)->h, (of
1a250 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66  f_t)nByte);.  if
1a260 28 20 72 63 20 29 7b 0a 20 20 20 20 28 28 75 6e  ( rc ){.    ((un
1a270 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
1a280 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1a290 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a2a0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1a2b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64  ;.  }else{.#ifnd
1a2c0 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a  ef NDEBUG.    /*
1a2d0 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
1a2e0 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20   a normal write 
1a2f0 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69  to a database fi
1a300 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74  le (as opposed t
1a310 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61  o.    ** doing a
1a320 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1a330 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65  lback or a write
1a340 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74   to some file ot
1a350 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a  her than a.    *
1a360 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73  * normal databas
1a370 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74  e file) and we t
1a380 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
1a390 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c   to zero length,
1a3a0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66  .    ** that eff
1a3b0 65 63 74 69 76 65 6c 79 20 75 70 64 61 74 65 73  ectively updates
1a3c0 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
1a3d0 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74  ter.  This might
1a3e0 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77   happen.    ** w
1a3f0 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20  hen restoring a 
1a400 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74  database using t
1a410 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 66 72  he backup API fr
1a420 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  om a zero-length
1a430 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a  .    ** source..
1a440 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1a450 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1a460 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26  inNormalWrite &&
1a470 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
1a480 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1a490 64 29 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  d)->transCntrChn
1a4a0 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  g = 1;.    }.#en
1a4b0 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  dif..    return 
1a4c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
1a4d0 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
1a4e0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
1a4f0 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
1a500 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  bytes.*/.static 
1a510 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  int unixFileSize
1a520 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1a530 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  d, i64 *pSize){.
1a540 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
1a550 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61  ct stat buf;.  a
1a560 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72  ssert( id );.  r
1a570 63 20 3d 20 66 73 74 61 74 28 28 28 75 6e 69 78  c = fstat(((unix
1a580 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62  File*)id)->h, &b
1a590 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  uf);.  SimulateI
1a5a0 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a  OError( rc=1 );.
1a5b0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
1a5c0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1a5d0 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
1a5e0 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
1a5f0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
1a600 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69  STAT;.  }.  *pSi
1a610 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65  ze = buf.st_size
1a620 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65  ;..  /* When ope
1a630 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65  ning a zero-size
1a640 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66   database, the f
1a650 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 20 70 72  indLockInfo() pr
1a660 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69  ocedure.  ** wri
1a670 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74  tes a single byt
1a680 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65  e into that file
1a690 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72   in order to wor
1a6a0 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20  k around a bug. 
1a6b0 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20   ** in the OS-X 
1a6c0 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
1a6d0 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61  .  In order to a
1a6e0 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69  void problems wi
1a6f0 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61  th upper.  ** la
1a700 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  yers, we need to
1a710 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c   report this fil
1a720 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65  e size as zero e
1a730 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
1a740 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20  .  ** really 1. 
1a750 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a    Ticket #3260..
1a760 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a    */.  if( *pSiz
1a770 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20  e==1 ) *pSize = 
1a780 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  0;...  return SQ
1a790 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
1a7a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1a7b0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1a7c0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1a7d0 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20  )./*.** Handler 
1a7e0 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  for proxy-lockin
1a7f0 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76  g file-control v
1a800 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62  erbs.  Defined b
1a810 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70  elow in the.** p
1a820 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20  roxying locking 
1a830 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  division..*/.sta
1a840 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c  tic int proxyFil
1a850 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1a860 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
1a870 29 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  );.#endif.../*.*
1a880 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e  * Information an
1a890 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20  d control of an 
1a8a0 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65  open file handle
1a8b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a8c0 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  unixFileControl(
1a8d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1a8e0 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
1a8f0 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28  pArg){.  switch(
1a900 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
1a910 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
1a920 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
1a930 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28  *(int*)pArg = ((
1a940 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
1a950 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 72  ocktype;.      r
1a960 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a970 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1a980 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e  SQLITE_LAST_ERRN
1a990 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  O: {.      *(int
1a9a0 2a 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46  *)pArg = ((unixF
1a9b0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
1a9c0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rno;.      retur
1a9d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1a9e0 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
1a9f0 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  G.    /* The pag
1aa00 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65  er calls this me
1aa10 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74  thod to signal t
1aa20 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a  hat it has done.
1aa30 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
1aa40 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64  k and that the d
1aa50 61 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65  atabase is there
1aa60 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61  fore unchanged a
1aa70 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e  nd.    ** it hen
1aa80 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  ce it is OK for 
1aa90 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1aaa0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74  change counter t
1aab0 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68  o be.    ** unch
1aac0 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  anged..    */.  
1aad0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1aae0 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1aaf0 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78  : {.      ((unix
1ab00 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64  File*)id)->dbUpd
1ab10 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ate = 0;.      r
1ab20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ab30 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
1ab40 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1ab50 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1ab60 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1ab70 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  __).    case SQL
1ab80 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
1ab90 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  YFILE:.    case 
1aba0 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
1abb0 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20  ROXYFILE: {.    
1abc0 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69    return proxyFi
1abd0 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c  leControl(id,op,
1abe0 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pArg);.    }.#en
1abf0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
1ac00 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1ac10 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
1ac20 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a  APPLE__) */.  }.
1ac30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ac40 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
1ac50 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
1ac60 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r size in bytes 
1ac70 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
1ac80 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66  g block device f
1ac90 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66  or.** the specif
1aca0 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69  ied file. This i
1acb0 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
1acc0 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d  512 bytes, but m
1acd0 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20  ay be.** larger 
1ace0 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73  for some devices
1acf0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ..**.** SQLite c
1ad00 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73  ode assumes this
1ad10 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
1ad20 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61   fail. It also a
1ad30 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69  ssumes that.** i
1ad40 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20  f two files are 
1ad50 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73  created in the s
1ad60 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ame file-system 
1ad70 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a  directory (i.e..
1ad80 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e  ** a database an
1ad90 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  d its journal fi
1ada0 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63  le) that the sec
1adb0 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
1adc0 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72   the.** same for
1add0 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   both..*/.static
1ade0 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53   int unixSectorS
1adf0 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1ae00 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e   *NotUsed){.  UN
1ae10 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
1ae20 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
1ae30 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  n SQLITE_DEFAULT
1ae40 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a  _SECTOR_SIZE;.}.
1ae50 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1ae60 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  e device charact
1ae70 65 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65  eristics for the
1ae80 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61   file. This is a
1ae90 6c 77 61 79 73 20 30 20 66 6f 72 20 75 6e 69 78  lways 0 for unix
1aea0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1aeb0 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
1aec0 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
1aed0 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29  3_file *NotUsed)
1aee0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1aef0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
1af00 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1af10 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
1af20 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1af30 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
1af40 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
1af50 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1af60 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
1af70 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
1af80 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1af90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1afa0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1afb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1afc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1afd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1afe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1aff0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  ../*.** This div
1b000 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64  ision contains d
1b010 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
1b020 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1b030 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a   objects that.**
1b040 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f   implement vario
1b050 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  us file locking 
1b060 73 74 72 61 74 65 67 69 65 73 2e 20 20 49 74 20  strategies.  It 
1b070 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65  also contains de
1b080 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20  finitions.** of 
1b090 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
1b0a0 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75  ns.  A finder-fu
1b0b0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
1b0c0 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70  o locate the app
1b0d0 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69  ropriate.** sqli
1b0e0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
1b0f0 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72 74  bject for a part
1b100 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  icular database 
1b110 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44  file.  The pAppD
1b120 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  ata.** field of 
1b130 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20  the sqlite3_vfs 
1b140 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20  VFS objects are 
1b150 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62  initialized to b
1b160 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  e pointers to.**
1b170 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e   the correct fin
1b180 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72  der-function for
1b190 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a   that VFS..**.**
1b1a0 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e   Most finder fun
1b1b0 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20  ctions return a 
1b1c0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78  pointer to a fix
1b1d0 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ed sqlite3_io_me
1b1e0 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e  thods.** object.
1b1f0 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72    The only inter
1b200 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75  esting finder-fu
1b210 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f  nction is autolo
1b220 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63  ckIoFinder, whic
1b230 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68  h.** looks at th
1b240 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70  e filesystem typ
1b250 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67  e and tries to g
1b260 75 65 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f  uess the best lo
1b270 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67  cking.** strateg
1b280 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a  y from that..**.
1b290 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75  ** For finder-fu
1b2a0 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a  ntion F, two obj
1b2b0 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64  ects are created
1b2c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54  :.**.**    (1) T
1b2d0 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66  he real finder-f
1b2e0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46  unction named "F
1b2f0 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20  Impt()"..**.**  
1b300 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74    (2) A constant
1b310 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
1b320 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
1b330 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a  just "F"..**.**.
1b340 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** A pointer to 
1b350 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73  the F pointer is
1b360 20 75 73 65 64 20 61 73 20 74 68 65 20 70 41 70   used as the pAp
1b370 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20  pData value for 
1b380 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20  VFS.** objects. 
1b390 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74   We have to do t
1b3a0 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c  his instead of l
1b3b0 65 74 74 69 6e 67 20 70 41 70 70 44 61 74 61 20  etting pAppData 
1b3c0 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c  point.** directl
1b3d0 79 20 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d  y at the finder-
1b3e0 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43  function since C
1b3f0 39 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74  90 rules prevent
1b400 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d   a void*.** from
1b410 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20   be cast into a 
1b420 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
1b430 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ..**.**.** Each 
1b440 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
1b450 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73   macro generates
1b460 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a   two objects:.**
1b470 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74  .**   *  A const
1b480 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  ant sqlite3_io_m
1b490 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61  ethods object ca
1b4a0 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68  ll METHOD that h
1b4b0 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20  as locking.**   
1b4c0 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45     methods CLOSE
1b4d0 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20  , LOCK, UNLOCK, 
1b4e0 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  CKRESLOCK..**.**
1b4f0 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74     *  An I/O met
1b500 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
1b510 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45  ion called FINDE
1b520 52 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61  R that returns a
1b530 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20   pointer.**     
1b540 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f   to the METHOD o
1b550 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72 65  bject in the pre
1b560 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f  vious bullet..*/
1b570 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f  .#define IOMETHO
1b580 44 53 28 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f  DS(FINDER, METHO
1b590 44 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  D, CLOSE, LOCK, 
1b5a0 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20  UNLOCK, CKLOCK) 
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1b5c0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1b5d0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1b5e0 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20  METHOD = {      
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1b610 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
1b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b630 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20   iVersion */    
1b640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b650 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1b660 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20   CLOSE,         
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b680 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20  xClose */       
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6a0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1b6b0 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20  unixRead,       
1b6c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1b6d0 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20  Read */         
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6f0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
1b700 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20 20  nixWrite,       
1b710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57             /* xW
1b720 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  rite */         
1b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b740 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
1b750 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20  ixTruncate,     
1b760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72            /* xTr
1b770 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20  uncate */       
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b790 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
1b7a0 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20  xSync,          
1b7b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
1b7c0 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  c */            
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7e0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
1b7f0 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20  FileSize,       
1b800 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
1b810 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Size */         
1b820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b830 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c        \.   LOCK,
1b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b850 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
1b860 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b880 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b       \.   UNLOCK
1b890 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b8a0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
1b8b0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8d0 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c      \.   CKLOCK,
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8f0 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
1b900 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20  servedLock */   
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
1b930 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20  Control,        
1b940 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
1b950 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20  rol */          
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b970 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f    \.   unixSecto
1b980 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
1b990 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a     /* xSectorSiz
1b9a0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9c0 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65   \.   unixDevice
1b9d0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1b9e0 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61    /* xDeviceCapa
1b9f0 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20  bilities */     
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba10 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  \.};            
1ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1ba60 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
1ba70 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1ba80 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63   *FINDER##Impl(c
1ba90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e  onst char *z, un
1baa0 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a  ixFile *p){   \.
1bab0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1bac0 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41  ER(z); UNUSED_PA
1bad0 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20  RAMETER(p);     
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1bb00 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b   return &METHOD;
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb40 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20              \.} 
1bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb90 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61             \.sta
1bba0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
1bbb0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
1bbc0 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f  const FINDER)(co
1bbd0 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
1bbe0 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20  le *p)    \.    
1bbf0 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a  = FINDER##Impl;.
1bc00 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20  ./*.** Here are 
1bc10 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74  all of the sqlit
1bc20 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
1bc30 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f  jects for each o
1bc40 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  f the.** locking
1bc50 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75   strategies.  Fu
1bc60 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74  nctions that ret
1bc70 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  urn pointers to 
1bc80 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a  these methods.**
1bc90 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65   are also create
1bca0 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28  d..*/.IOMETHODS(
1bcb0 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72  .  posixIoFinder
1bcc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1bcd0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
1bce0 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49  name */.  posixI
1bcf0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
1bd00 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
1bd10 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
1bd20 20 6e 61 6d 65 20 2a 2f 0a 20 20 75 6e 69 78 43   name */.  unixC
1bd30 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
1bd40 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
1bd50 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
1bd60 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1bd70 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
1bd80 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e  thod */.  unixUn
1bd90 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
1bda0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
1bdb0 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
1bdc0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1bdd0 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
1bde0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
1bdf0 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53  d */.).IOMETHODS
1be00 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64  (.  nolockIoFind
1be10 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er,           /*
1be20 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
1be30 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63   name */.  noloc
1be40 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
1be50 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
1be60 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
1be70 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f  t name */.  nolo
1be80 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
1be90 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
1bea0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
1beb0 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
1bec0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
1bed0 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
1bee0 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
1bef0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
1bf00 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
1bf10 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
1bf20 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ock   /* xCheckR
1bf30 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
1bf40 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
1bf50 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69  S(.  dotlockIoFi
1bf60 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f  nder,          /
1bf70 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
1bf80 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c  n name */.  dotl
1bf90 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
1bfa0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
1bfb0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
1bfc0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74  ct name */.  dot
1bfd0 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
1bfe0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
1bff0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
1c000 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
1c010 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
1c020 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
1c030 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
1c040 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
1c050 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
1c060 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
1c070 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b  dLock  /* xCheck
1c080 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
1c090 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51  hod */.)..#if SQ
1c0a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1c0b0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
1c0c0 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
1c0d0 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e  DS(.  flockIoFin
1c0e0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
1c0f0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
1c100 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f  on name */.  flo
1c110 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
1c120 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
1c130 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
1c140 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c  ect name */.  fl
1c150 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
1c160 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
1c170 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  e method */.  fl
1c180 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
1c190 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
1c1a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
1c1b0 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
1c1c0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
1c1d0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  k method */.  fl
1c1e0 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
1c1f0 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63  Lock    /* xChec
1c200 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
1c210 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
1c220 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
1c230 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65  .IOMETHODS(.  se
1c240 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  mIoFinder,      
1c250 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
1c260 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
1c270 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64  */.  semIoMethod
1c280 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
1c290 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
1c2a0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
1c2b0 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20   */.  semClose, 
1c2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2d0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
1c2e0 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20   */.  semLock,  
1c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c300 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
1c310 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20  */.  semUnlock, 
1c320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c330 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
1c340 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65   */.  semCheckRe
1c350 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20  servedLock      
1c360 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
1c370 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
1c380 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  ).#endif..#if de
1c390 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1c3a0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
1c3b0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
1c3c0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70  IOMETHODS(.  afp
1c3d0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
1c3e0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
1c3f0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
1c400 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73  /.  afpIoMethods
1c410 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1c420 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1c430 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
1c440 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20  */.  afpClose,  
1c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c460 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
1c470 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20  */.  afpLock,   
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c490 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
1c4a0 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20  /.  afpUnlock,  
1c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c4c0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
1c4d0 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73  */.  afpCheckRes
1c4e0 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
1c4f0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
1c500 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
1c510 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1c520 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
1c530 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75   method is a "su
1c540 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  per-method" in t
1c550 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74  he sense that it
1c560 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64  .** opens second
1c570 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ary file descrip
1c580 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e  tors for the con
1c590 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ch and lock file
1c5a0 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73  s and.** it uses
1c5b0 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65   proxy, dot-file
1c5c0 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b  , AFP, and flock
1c5d0 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  () locking metho
1c5e0 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73  ds on those.** s
1c5f0 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20  econdary files. 
1c600 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
1c610 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
1c620 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a  hat implements.*
1c630 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * proxy locking 
1c640 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20  is located much 
1c650 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20  further down in 
1c660 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77  the file.  But w
1c670 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20  e need.** to go 
1c680 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65  ahead and define
1c690 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
1c6a0 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64  methods and find
1c6b0 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  er function.** f
1c6c0 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
1c6d0 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f   here.  So we fo
1c6e0 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68  rward declare th
1c6f0 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a  e I/O methods..*
1c700 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
1c710 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1c720 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1c730 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69  G_STYLE.static i
1c740 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71  nt proxyClose(sq
1c750 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
1c760 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f  atic int proxyLo
1c770 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
1c780 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
1c790 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73  nt proxyUnlock(s
1c7a0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
1c7b0 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
1c7c0 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
1c7d0 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
1c7e0 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45  le*, int*);.IOME
1c7f0 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f  THODS(.  proxyIo
1c800 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
1c810 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
1c820 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
1c830 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20  proxyIoMethods, 
1c840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
1c850 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1c860 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
1c870 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20   proxyClose,    
1c880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
1c890 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
1c8a0 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20   proxyLock,     
1c8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1c8c0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
1c8d0 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20  proxyUnlock,    
1c8e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
1c8f0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
1c900 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
1c910 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43  vedLock    /* xC
1c920 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1c930 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
1c940 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b  dif../* nfs lock
1c950 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64  d on OSX 10.3+ d
1c960 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69  oesn't clear wri
1c970 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20  te locks when a 
1c980 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74  read lock is set
1c990 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
1c9a0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
1c9b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1c9c0 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48  ING_STYLE.IOMETH
1c9d0 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64  ODS(.  nfsIoFind
1c9e0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
1c9f0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
1ca00 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e  tion name */.  n
1ca10 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  fsIoMethods,    
1ca20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
1ca30 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1ca40 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
1ca50 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
1ca60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1ca70 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
1ca80 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20    unixLock,     
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1caa0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
1cab0 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20    nfsUnlock,    
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cad0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
1cae0 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
1caf0 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
1cb00 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
1cb10 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
1cb20 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
1cb30 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1cb40 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
1cb50 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
1cb60 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64  * .** This "find
1cb70 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  er" function att
1cb80 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69  empts to determi
1cb90 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ne the best lock
1cba0 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a  ing strategy .**
1cbb0 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
1cbc0 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68  e file "filePath
1cbd0 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75  ".  It then retu
1cbe0 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  rns the sqlite3_
1cbf0 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
1cc00 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
1cc10 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65  ents that strate
1cc20 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  gy..**.** This i
1cc30 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c  s for MacOSX onl
1cc40 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y..*/.static con
1cc50 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
1cc60 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49  thods *autolockI
1cc70 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
1cc80 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
1cc90 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
1cca0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1ccb0 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
1ccc0 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
1ccd0 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20     /* open file 
1cce0 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64  object for the d
1ccf0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1cd00 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
1cd10 74 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67  t struct Mapping
1cd20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
1cd30 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20  r *zFilesystem; 
1cd40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cd50 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20  Filesystem type 
1cd60 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  name */.    cons
1cd70 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
1cd80 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20  hods *pMethods; 
1cd90 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65    /* Appropriate
1cda0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
1cdb0 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20  */.  } aMap[] = 
1cdc0 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20  {.    { "hfs",  
1cdd0 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64    &posixIoMethod
1cde0 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22  s },.    { "ufs"
1cdf0 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74  ,    &posixIoMet
1ce00 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61  hods },.    { "a
1ce10 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65  fpfs",  &afpIoMe
1ce20 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
1ce30 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d  smbfs",  &afpIoM
1ce40 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
1ce50 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63  "webdav", &noloc
1ce60 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  kIoMethods },.  
1ce70 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a    { 0, 0 }.  };.
1ce80 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1ce90 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
1cea0 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
1ceb0 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
1cec0 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
1ced0 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
1cee0 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
1cef0 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
1cf00 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
1cf10 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
1cf20 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
1cf30 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
1cf40 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
1cf50 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
1cf60 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73 28   }.  if( statfs(
1cf70 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66  filePath, &fsInf
1cf80 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) != -1 ){.    
1cf90 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  if( fsInfo.f_fla
1cfa0 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20  gs & MNT_RDONLY 
1cfb0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1cfc0 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
1cfd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1cfe0 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69  i=0; aMap[i].zFi
1cff0 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a  lesystem; i++){.
1d000 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
1d010 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
1d020 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46  name, aMap[i].zF
1d030 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b  ilesystem)==0 ){
1d040 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1d050 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73  aMap[i].pMethods
1d060 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d070 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c    }..  /* Defaul
1d080 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c  t case. Handles,
1d090 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c   amongst others,
1d0a0 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73   "nfs"..  ** Tes
1d0b0 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  t byte-range loc
1d0c0 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e  k using fcntl().
1d0d0 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63   If the call suc
1d0e0 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73  ceeds, .  ** ass
1d0f0 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ume that the fil
1d100 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
1d110 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f  s POSIX style lo
1d120 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63  cks. .  */.  loc
1d130 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  kInfo.l_len = 1;
1d140 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74  .  lockInfo.l_st
1d150 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49  art = 0;.  lockI
1d160 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  nfo.l_whence = S
1d170 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49  EEK_SET;.  lockI
1d180 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  nfo.l_type = F_R
1d190 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e 74  DLCK;.  if( fcnt
1d1a0 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
1d1b0 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
1d1c0 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73  -1 ) {.    if( s
1d1d0 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
1d1e0 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22  stypename, "nfs"
1d1f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1d200 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f  turn &nfsIoMetho
1d210 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ds;.    } else {
1d220 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70  .      return &p
1d230 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  osixIoMethods;. 
1d240 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1d250 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63    return &dotloc
1d260 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
1d270 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
1d280 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1d290 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75  s .  *(*const au
1d2a0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28  tolockIoFinder)(
1d2b0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
1d2c0 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63  File*) = autoloc
1d2d0 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a  kIoFinderImpl;..
1d2e0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1d2f0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
1d300 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1d310 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
1d320 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  #if OS_VXWORKS &
1d330 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
1d340 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
1d350 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65   .** This "finde
1d360 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  r" function atte
1d370 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
1d380 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  e the best locki
1d390 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20  ng strategy .** 
1d3a0 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
1d3b0 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22   file "filePath"
1d3c0 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72  .  It then retur
1d3d0 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ns the sqlite3_i
1d3e0 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
1d3f0 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
1d400 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67  nts that strateg
1d410 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  y..**.** This is
1d420 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c   for VXWorks onl
1d430 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y..*/.static con
1d440 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
1d450 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49  thods *autolockI
1d460 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
1d470 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
1d480 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
1d490 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d4a0 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
1d4b0 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
1d4c0 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66     /* the open f
1d4d0 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  ile object */.){
1d4e0 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
1d4f0 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
1d500 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
1d510 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
1d520 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
1d530 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
1d540 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
1d550 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
1d560 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
1d570 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
1d580 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
1d590 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
1d5a0 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66   }..  /* Test if
1d5b0 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70   fcntl() is supp
1d5c0 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f  orted and use PO
1d5d0 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e  SIX style locks.
1d5e0 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  .  ** Otherwise 
1d5f0 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
1d600 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
1d610 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20   method..  */.  
1d620 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
1d630 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
1d640 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
1d650 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
1d660 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
1d670 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
1d680 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66  F_RDLCK;.  if( f
1d690 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f  cntl(pNew->h, F_
1d6a0 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f  GETLK, &lockInfo
1d6b0 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65  )!=-1 ) {.    re
1d6c0 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74  turn &posixIoMet
1d6d0 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
1d6e0 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f     return &semIo
1d6f0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73  Methods;.  }.}.s
1d700 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
1d710 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a  te3_io_methods .
1d720 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c    *(*const autol
1d730 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e  ockIoFinder)(con
1d740 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
1d750 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f  e*) = autolockIo
1d760 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e  FinderImpl;..#en
1d770 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
1d780 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  S && SQLITE_ENAB
1d790 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1d7a0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62   */../*.** An ab
1d7b0 73 74 72 61 63 74 20 74 79 70 65 20 66 6f 72 20  stract type for 
1d7c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49  a pointer to a I
1d7d0 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20  O method finder 
1d7e0 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70  function:.*/.typ
1d7f0 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74  edef const sqlit
1d800 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
1d810 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f  *finder_type)(co
1d820 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
1d830 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  le*);.../*******
1d840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d880 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
1d890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d8a0 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  ** sqlite3_vfs m
1d8b0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
1d8c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d8d0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64  ***.**.** This d
1d8e0 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
1d8f0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
1d900 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f  ion of methods o
1d910 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
1d920 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  _vfs object..*/.
1d930 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1d940 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
1d950 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  f the unixFile s
1d960 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
1d970 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73   to by pId..*/.s
1d980 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
1d990 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69  UnixFile(.  sqli
1d9a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
1d9b0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1d9c0 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
1d9d0 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20    int h,        
1d9e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
1d9f0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
1da00 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20  r of file being 
1da10 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
1da20 64 69 72 66 64 2c 20 20 20 20 20 20 20 20 20 20  dirfd,          
1da30 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
1da40 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1da50 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
1da60 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a  le *pId,      /*
1da70 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e   Write to the un
1da80 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
1da90 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
1daa0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1dab0 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
1dac0 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
1dad0 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c  ned */.  int noL
1dae0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1daf0 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67   /* Omit locking
1db00 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   if true */.  in
1db10 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 20  t isDelete      
1db20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
1db30 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65  on close if true
1db40 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73   */.){.  const s
1db50 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1db60 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  s *pLockingStyle
1db70 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
1db80 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  ew = (unixFile *
1db90 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  )pId;.  int rc =
1dba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
1dbb0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c 6f  ssert( pNew->pLo
1dbc0 63 6b 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 61 73  ck==NULL );.  as
1dbd0 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4f 70 65  sert( pNew->pOpe
1dbe0 6e 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a  n==NULL );..  /*
1dbf0 20 50 61 72 61 6d 65 74 65 72 20 69 73 44 65 6c   Parameter isDel
1dc00 65 74 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ete is only used
1dc10 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 45 78 70   on vxworks. Exp
1dc20 72 65 73 73 20 74 68 69 73 20 65 78 70 6c 69 63  ress this explic
1dc30 69 74 6c 79 20 0a 20 20 2a 2a 20 68 65 72 65 20  itly .  ** here 
1dc40 74 6f 20 70 72 65 76 65 6e 74 20 63 6f 6d 70 69  to prevent compi
1dc50 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f  ler warnings abo
1dc60 75 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65  ut unused parame
1dc70 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55  ters..  */.  UNU
1dc80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73  SED_PARAMETER(is
1dc90 44 65 6c 65 74 65 29 3b 0a 0a 20 20 4f 53 54 52  Delete);..  OSTR
1dca0 41 43 45 33 28 22 4f 50 45 4e 20 20 20 20 25 2d  ACE3("OPEN    %-
1dcb0 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69  3d %s\n", h, zFi
1dcc0 6c 65 6e 61 6d 65 29 3b 20 20 20 20 0a 20 20 70  lename);    .  p
1dcd0 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e  New->h = h;.  pN
1dce0 65 77 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66  ew->dirfd = dirf
1dcf0 64 3b 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49  d;.  SET_THREADI
1dd00 44 28 70 4e 65 77 29 3b 0a 20 20 70 4e 65 77 2d  D(pNew);.  pNew-
1dd10 3e 66 69 6c 65 46 6c 61 67 73 20 3d 20 30 3b 0a  >fileFlags = 0;.
1dd20 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1dd30 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78    pNew->pId = vx
1dd40 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28  worksFindFileId(
1dd50 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
1dd60 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29  ( pNew->pId==0 )
1dd70 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31  {.    noLock = 1
1dd80 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
1dd90 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e  E_NOMEM;.  }.#en
1dda0 64 69 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63  dif..  if( noLoc
1ddb0 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e  k ){.    pLockin
1ddc0 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b  gStyle = &nolock
1ddd0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
1dde0 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67  se{.    pLocking
1ddf0 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64  Style = (**(find
1de00 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70  er_type*)pVfs->p
1de10 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61  AppData)(zFilena
1de20 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53  me, pNew);.#if S
1de30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1de40 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f  KING_STYLE.    /
1de50 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d  * Cache zFilenam
1de60 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  e in the locking
1de70 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e   context (AFP an
1de80 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69  d dotlock overri
1de90 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70  de) for.    ** p
1dea0 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74  roxyLock activat
1deb0 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ion is possible 
1dec0 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73  (remote proxy is
1ded0 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d   based on db nam
1dee0 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e  e).    ** zFilen
1def0 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  ame remains vali
1df00 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20  d until file is 
1df10 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f  closed, to suppo
1df20 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  rt */.    pNew->
1df30 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
1df40 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d   (void*)zFilenam
1df50 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  e;.#endif.  }.. 
1df60 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
1df70 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65  le == &posixIoMe
1df80 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65  thods.#if define
1df90 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
1dfa0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1dfb0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
1dfc0 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  || pLockingStyle
1dfd0 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64   == &nfsIoMethod
1dfe0 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20  s.#endif.  ){.  
1dff0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
1e000 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
1e010 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20  dLockInfo(pNew, 
1e020 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70  &pNew->pLock, &p
1e030 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20  New->pOpen);.   
1e040 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e050 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  OK ){.      /* I
1e060 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1e070 65 64 20 69 6e 20 66 69 6e 64 4c 6f 63 6b 49 6e  ed in findLockIn
1e080 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20  fo(), close the 
1e090 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
1e0a0 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61        ** immedia
1e0b0 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c  tely, before rel
1e0c0 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78  easing the mutex
1e0d0 2e 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29  . findLockInfo()
1e0e0 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20   may fail.      
1e0f0 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ** in two scenar
1e100 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ios:.      **.  
1e110 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63      **   (a) A c
1e120 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66  all to fstat() f
1e130 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  ailed..      ** 
1e140 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66    (b) A malloc f
1e150 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ailed..      **.
1e160 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69        ** Scenari
1e170 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f  o (b) may only o
1e180 63 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63  ccur if the proc
1e190 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e  ess is holding n
1e1a0 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  o other.      **
1e1b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1e1c0 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  s open on the sa
1e1d0 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  me file. If ther
1e1e0 65 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c  e were other fil
1e1f0 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
1e200 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66  iptors on this f
1e210 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c  ile, then no mal
1e220 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71  loc would be req
1e230 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
1e240 2a 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29  * findLockInfo()
1e250 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
1e260 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69   case, it is qui
1e270 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65  te safe to close
1e280 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  .      ** handle
1e290 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75   h - as it is gu
1e2a0 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f  aranteed that no
1e2b0 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c   posix locks wil
1e2c0 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20  l be released.  
1e2d0 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20      ** by doing 
1e2e0 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  so..      **.   
1e2f0 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69     ** If scenari
1e300 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65  o (a) caused the
1e310 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e   error then thin
1e320 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61  gs are not so sa
1e330 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  fe. The.      **
1e340 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70   implicit assump
1e350 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61  tion here is tha
1e360 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69  t if fstat() fai
1e370 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69  ls, things are i
1e380 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20  n.      ** such 
1e390 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64  bad shape that d
1e3a0 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f  ropping a lock o
1e3b0 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61  r two doesn't ma
1e3c0 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20  tter much..     
1e3d0 20 2a 2f 0a 20 20 20 20 20 20 63 6c 6f 73 65 28   */.      close(
1e3e0 68 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31  h);.      h = -1
1e3f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  ;.    }.    unix
1e400 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
1e410 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
1e420 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1e430 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
1e440 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20  APPLE__).  else 
1e450 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
1e460 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f  e == &afpIoMetho
1e470 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50  ds ){.    /* AFP
1e480 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
1e490 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
1e4a0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
1e4b0 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
1e4c0 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   the afpLockingC
1e4d0 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20  ontext..    */. 
1e4e0 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e     afpLockingCon
1e4f0 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20  text *pCtx;.    
1e500 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
1e510 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71  text = pCtx = sq
1e520 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
1e530 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20  zeof(*pCtx) );. 
1e540 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29     if( pCtx==0 )
1e550 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1e560 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1e570 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  else{.      /* N
1e580 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69  B: zFilename exi
1e590 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20  sts and remains 
1e5a0 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20  valid until the 
1e5b0 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  file is closed. 
1e5c0 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e       ** accordin
1e5d0 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74  g to requirement
1e5e0 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20   F11141.  So we 
1e5f0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d  do not need to m
1e600 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63  ake a.      ** c
1e610 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e  opy of the filen
1e620 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43  ame. */.      pC
1e630 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69  tx->dbPath = zFi
1e640 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43  lename;.      pC
1e650 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30  tx->reserved = 0
1e660 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64  ;.      srandomd
1e670 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78  ev();.      unix
1e680 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1e690 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63      rc = findLoc
1e6a0 6b 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  kInfo(pNew, &pNe
1e6b0 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d  w->pLock, &pNew-
1e6c0 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69  >pOpen);.      i
1e6d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1e6f0 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c  te3_free(pNew->l
1e700 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
1e710 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29          close(h)
1e720 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31  ;.        h = -1
1e730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e740 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
1e750 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a  ;        .    }.
1e760 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c    }.#endif..  el
1e770 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
1e780 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b  tyle == &dotlock
1e790 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
1e7a0 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b   /* Dotfile lock
1e7b0 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
1e7c0 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
1e7d0 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
1e7e0 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
1e7f0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
1e800 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20  ntext .    */.  
1e810 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
1e820 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  e;.    int nFile
1e830 6e 61 6d 65 3b 0a 20 20 20 20 6e 46 69 6c 65 6e  name;.    nFilen
1e840 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ame = (int)strle
1e850 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36  n(zFilename) + 6
1e860 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20  ;.    zLockFile 
1e870 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
1e880 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61  3_malloc(nFilena
1e890 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f  me);.    if( zLo
1e8a0 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  ckFile==0 ){.   
1e8b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1e8c0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
1e8d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
1e8e0 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d  nprintf(nFilenam
1e8f0 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25  e, zLockFile, "%
1e900 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  s" DOTLOCK_SUFFI
1e910 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  X, zFilename);. 
1e920 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c     }.    pNew->l
1e930 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
1e940 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a  zLockFile;.  }..
1e950 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
1e960 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
1e970 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49  ngStyle == &semI
1e980 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
1e990 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  /* Named semapho
1e9a0 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  re locking uses 
1e9b0 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
1e9c0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a   it needs to be.
1e9d0 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20      ** included 
1e9e0 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e  in the semLockin
1e9f0 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a  gContext.    */.
1ea00 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
1ea10 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
1ea20 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77  indLockInfo(pNew
1ea30 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20  , &pNew->pLock, 
1ea40 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20  &pNew->pOpen);. 
1ea50 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
1ea60 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d  TE_OK) && (pNew-
1ea70 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3d 3d 4e 55  >pOpen->pSem==NU
1ea80 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  LL) ){.      cha
1ea90 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e  r *zSemName = pN
1eaa0 65 77 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e  ew->pOpen->aSemN
1eab0 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ame;.      int n
1eac0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1ead0 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
1eae0 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c  HNAME, zSemName,
1eaf0 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20   "/%s.sem",.    
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb10 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43     pNew->pId->zC
1eb20 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
1eb30 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a       for( n=1; z
1eb40 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20  SemName[n]; n++ 
1eb50 29 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53  ).        if( zS
1eb60 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29  emName[n]=='/' )
1eb70 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27   zSemName[n] = '
1eb80 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  _';.      pNew->
1eb90 70 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d 20 73 65  pOpen->pSem = se
1eba0 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c  m_open(zSemName,
1ebb0 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20   O_CREAT, 0666, 
1ebc0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  1);.      if( pN
1ebd0 65 77 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 20  ew->pOpen->pSem 
1ebe0 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b  == SEM_FAILED ){
1ebf0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1ec00 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1ec10 20 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d      pNew->pOpen-
1ec20 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27  >aSemName[0] = '
1ec30 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  \0';.      }.   
1ec40 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
1ec50 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
1ec60 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c  dif.  .  pNew->l
1ec70 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69  astErrno = 0;.#i
1ec80 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
1ec90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1eca0 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   ){.    if( h>=0
1ecb0 20 29 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20   ) close(h);.   
1ecc0 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 75 6e 6c   h = -1;.    unl
1ecd0 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ink(zFilename);.
1ece0 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d 20 30      isDelete = 0
1ecf0 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 73  ;.  }.  pNew->is
1ed00 44 65 6c 65 74 65 20 3d 20 69 73 44 65 6c 65 74  Delete = isDelet
1ed10 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  e;.#endif.  if( 
1ed20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ed30 0a 20 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d  .    if( dirfd>=
1ed40 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66 64 29  0 ) close(dirfd)
1ed50 3b 20 2f 2a 20 73 69 6c 65 6e 74 20 6c 65 61 6b  ; /* silent leak
1ed60 20 69 66 20 66 61 69 6c 2c 20 61 6c 72 65 61 64   if fail, alread
1ed70 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  y in error */.  
1ed80 20 20 69 66 28 20 68 3e 3d 30 20 29 20 63 6c 6f    if( h>=0 ) clo
1ed90 73 65 28 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  se(h);.  }else{.
1eda0 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f      pNew->pMetho
1edb0 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  d = pLockingStyl
1edc0 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74  e;.    OpenCount
1edd0 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65  er(+1);.  }.  re
1ede0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1edf0 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65  * Open a file de
1ee00 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
1ee10 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
1ee20 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e  ning file zFilen
1ee30 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65  ame..** If succe
1ee40 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73  ssful, *pFd is s
1ee50 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64  et to the opened
1ee60 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1ee70 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
1ee80 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
1ee90 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1eea0 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  s, either SQLITE
1eeb0 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c  _NOMEM.** or SQL
1eec0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20  ITE_CANTOPEN is 
1eed0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46  returned and *pF
1eee0 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75  d is set to an u
1eef0 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75  ndefined.** valu
1ef00 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
1ef10 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1ef20 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  d, the caller is
1ef30 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1ef40 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20   closing.** the 
1ef50 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1ef60 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65  *pFd using close
1ef70 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1ef80 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  t openDirectory(
1ef90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1efa0 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29  ename, int *pFd)
1efb0 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  {.  int ii;.  in
1efc0 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61  t fd = -1;.  cha
1efd0 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50  r zDirname[MAX_P
1efe0 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73  ATHNAME+1];..  s
1eff0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1f000 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44  MAX_PATHNAME, zD
1f010 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46  irname, "%s", zF
1f020 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  ilename);.  for(
1f030 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  ii=(int)strlen(z
1f040 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26  Dirname); ii>1 &
1f050 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d  & zDirname[ii]!=
1f060 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66  '/'; ii--);.  if
1f070 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44  ( ii>0 ){.    zD
1f080 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30  irname[ii] = '\0
1f090 27 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e  ';.    fd = open
1f0a0 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f  (zDirname, O_RDO
1f0b0 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29  NLY|O_BINARY, 0)
1f0c0 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20  ;.    if( fd>=0 
1f0d0 29 7b 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f  ){.#ifdef FD_CLO
1f0e0 45 58 45 43 0a 20 20 20 20 20 20 66 63 6e 74 6c  EXEC.      fcntl
1f0f0 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 66 63  (fd, F_SETFD, fc
1f100 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
1f110 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
1f120 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1f130 4f 53 54 52 41 43 45 33 28 22 4f 50 45 4e 44 49  OSTRACE3("OPENDI
1f140 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64  R %-3d %s\n", fd
1f150 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20 20  , zDirname);.   
1f160 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20   }.  }.  *pFd = 
1f170 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64  fd;.  return (fd
1f180 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 53 51  >=0?SQLITE_OK:SQ
1f190 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 3b 0a  LITE_CANTOPEN);.
1f1a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1f1b0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
1f1c0 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20   name in zBuf.  
1f1d0 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c 6c  zBuf must be all
1f1e0 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ocated.** by the
1f1f0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73   calling process
1f200 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69 67   and must be big
1f210 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
1f220 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73  at least.** pVfs
1f230 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  ->mxPathname byt
1f240 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
1f250 74 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  t getTempname(in
1f260 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
1f270 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  uf){.  static co
1f280 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73  nst char *azDirs
1f290 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20  [] = {.     0,. 
1f2a0 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61      0,.     "/va
1f2b0 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75  r/tmp",.     "/u
1f2c0 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  sr/tmp",.     "/
1f2d0 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a  tmp",.     ".",.
1f2e0 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f    };.  static co
1f2f0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1f300 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20  r zChars[] =.   
1f310 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
1f320 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20  opqrstuvwxyz".  
1f330 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
1f340 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20  NOPQRSTUVWXYZ". 
1f350 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b     "0123456789";
1f360 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
1f370 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74 20 73  i, j;.  struct s
1f380 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74  tat buf;.  const
1f390 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 22 2e   char *zDir = ".
1f3a0 22 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  ";..  /* It's od
1f3b0 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
1f3c0 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
1f3d0 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
1f3e0 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
1f3f0 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
1f400 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
1f410 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
1f420 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
1f430 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
1f440 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53  iling. .  */.  S
1f450 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1f460 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1f470 45 52 52 20 29 3b 0a 0a 20 20 61 7a 44 69 72 73  ERR );..  azDirs
1f480 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  [0] = sqlite3_te
1f490 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20  mp_directory;.  
1f4a0 69 66 20 28 4e 55 4c 4c 20 3d 3d 20 61 7a 44 69  if (NULL == azDi
1f4b0 72 73 5b 31 5d 29 20 7b 0a 20 20 20 20 61 7a 44  rs[1]) {.    azD
1f4c0 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28  irs[1] = getenv(
1f4d0 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 7d 0a 20  "TMPDIR");.  }. 
1f4e0 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73   .  for(i=0; i<s
1f4f0 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
1f500 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b  zeof(azDirs[0]);
1f510 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
1f520 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f  zDirs[i]==0 ) co
1f530 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
1f540 73 74 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20  stat(azDirs[i], 
1f550 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65  &buf) ) continue
1f560 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53 44  ;.    if( !S_ISD
1f570 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20  IR(buf.st_mode) 
1f580 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1f590 69 66 28 20 61 63 63 65 73 73 28 61 7a 44 69 72  if( access(azDir
1f5a0 73 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74  s[i], 07) ) cont
1f5b0 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d  inue;.    zDir =
1f5c0 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20   azDirs[i];.    
1f5d0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
1f5e0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
1f5f0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
1f600 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f   large enough fo
1f610 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
1f620 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e  file .  ** name.
1f630 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72   If it is not, r
1f640 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1f650 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  OR..  */.  if( (
1f660 73 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73  strlen(zDir) + s
1f670 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d  trlen(SQLITE_TEM
1f680 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b  P_FILE_PREFIX) +
1f690 20 31 37 29 20 3e 3d 20 28 73 69 7a 65 5f 74 29   17) >= (size_t)
1f6a0 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75  nBuf ){.    retu
1f6b0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1f6c0 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  .  }..  do{.    
1f6d0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1f6e0 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75 66 2c 20  (nBuf-17, zBuf, 
1f6f0 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50  "%s/"SQLITE_TEMP
1f700 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44  _FILE_PREFIX, zD
1f710 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28 69 6e  ir);.    j = (in
1f720 74 29 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a  t)strlen(zBuf);.
1f730 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
1f740 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66  omness(15, &zBuf
1f750 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [j]);.    for(i=
1f760 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b  0; i<15; i++, j+
1f770 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a  +){.      zBuf[j
1f780 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
1f790 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
1f7a0 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
1f7b0 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
1f7c0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b  .    }.    zBuf[
1f7d0 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65  j] = 0;.  }while
1f7e0 28 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30 29  ( access(zBuf,0)
1f7f0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
1f800 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1f810 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1f820 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1f830 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1f840 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  __)./*.** Routin
1f850 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61  e to transform a
1f860 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61   unixFile into a
1f870 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75   proxy-locking u
1f880 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c  nixFile..** Impl
1f890 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68  ementation in th
1f8a0 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76  e proxy-lock div
1f8b0 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20  ision, but used 
1f8c0 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a  by unixOpen().**
1f8d0 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45   if SQLITE_PREFE
1f8e0 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20  R_PROXY_LOCKING 
1f8f0 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73  is defined..*/.s
1f900 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
1f910 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
1f920 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73  (unixFile*, cons
1f930 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66  t char*);.#endif
1f940 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66  ../*.** Search f
1f950 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c  or an unused fil
1f960 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
1f970 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  t was opened on 
1f980 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
1f990 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
1f9a0 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a  rnal or master-j
1f9b0 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65  ournal file) ide
1f9c0 6e 74 69 66 69 65 64 20 62 79 20 70 61 74 68 6e  ntified by pathn
1f9d0 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74  ame.** zPath wit
1f9e0 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58  h SQLITE_OPEN_XX
1f9f0 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67  X flags matching
1fa00 20 74 68 6f 73 65 20 70 61 73 73 65 64 20 61 73   those passed as
1fa10 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   the second.** a
1fa20 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
1fa30 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
1fa40 53 75 63 68 20 61 20 66 69 6c 65 20 64 65 73 63  Such a file desc
1fa50 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74  riptor may exist
1fa60 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 63   if a database c
1fa70 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c  onnection was cl
1fa80 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20  osed.** but the 
1fa90 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20  associated file 
1faa0 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64  descriptor could
1fab0 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62   not be closed b
1fac0 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f  ecause some.** o
1fad0 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
1fae0 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ptor open on the
1faf0 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f   same file is ho
1fb00 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63  lding a file-loc
1fb10 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63  k..** Refer to c
1fb20 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75  omments in the u
1fb30 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74  nixClose() funct
1fb40 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67  ion and the leng
1fb50 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64  thy comment.** d
1fb60 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78  escribing "Posix
1fb70 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e   Advisory Lockin
1fb80 67 22 20 61 74 20 74 68 65 20 73 74 61 72 74 20  g" at the start 
1fb90 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72  of this file for
1fba0 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74   .** further det
1fbb0 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b  ails. Also, tick
1fbc0 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20  et #4018..**.** 
1fbd0 49 66 20 61 20 73 75 69 74 61 62 6c 65 20 66 69  If a suitable fi
1fbe0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
1fbf0 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20   found, then it 
1fc00 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1fc10 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20  no.** such file 
1fc20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f  descriptor is lo
1fc30 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74  cated, -1 is ret
1fc40 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1fc50 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66   UnixUnusedFd *f
1fc60 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f  indReusableFd(co
1fc70 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
1fc80 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55   int flags){.  U
1fc90 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
1fca0 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  used = 0;..  /* 
1fcb0 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f  Do not search fo
1fcc0 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65  r an unused file
1fcd0 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76   descriptor on v
1fce0 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61  xworks. Not beca
1fcf0 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73  use.  ** vxworks
1fd00 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66   would not benef
1fd10 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e  it from the chan
1fd20 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65  ge (it might, we
1fd30 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20  're not sure),. 
1fd40 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65 20   ** but because 
1fd50 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20 69  no way to test i
1fd60 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  t is currently a
1fd70 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20  vailable. It is 
1fd80 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74  better .  ** not
1fd90 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e   to risk breakin
1fda0 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72  g vxworks suppor
1fdb0 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f  t for the sake o
1fdc0 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72  f such an obscur
1fdd0 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e  e .  ** feature.
1fde0 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57    */.#if !OS_VXW
1fdf0 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74  ORKS.  struct st
1fe00 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
1fe10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1fe20 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29  esults of stat()
1fe30 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41   call */..  /* A
1fe40 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79   stat() call may
1fe50 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75   fail for variou
1fe60 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68  s reasons. If th
1fe70 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69  is happens, it i
1fe80 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65  s.  ** almost ce
1fe90 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70  rtain that an op
1fea0 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65  en() call on the
1feb0 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20   same path will 
1fec0 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20  also fail..  ** 
1fed0 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
1fee0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
1fef0 75 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28  urs in the stat(
1ff00 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20  ) call here, it 
1ff10 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20  is.  ** ignored 
1ff20 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e  and -1 is return
1ff30 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
1ff40 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ill try to open 
1ff50 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20  a new file.  ** 
1ff60 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68  descriptor on th
1ff70 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69  e same path, fai
1ff80 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  l, and return an
1ff90 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65   error to SQLite
1ffa0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  **.  ** Even
1ffb0 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74   if a subsequent
1ffc0 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65   open() call doe
1ffd0 73 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63  s succeed, the c
1ffe0 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20  onsequences of. 
1fff0 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e   ** not searchin
20000 67 20 66 6f 72 20 61 20 72 65 73 75 73 61 62 6c  g for a resusabl
20010 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
20020 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20  r are not dire. 
20030 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 61   */.  if( 0==sta
20040 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29  t(zPath, &sStat)
20050 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 75   ){.    struct u
20060 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65  nixOpenCnt *pOpe
20070 6e 3b 0a 0a 20 20 20 20 75 6e 69 78 45 6e 74 65  n;..    unixEnte
20080 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 70 4f  rMutex();.    pO
20090 70 65 6e 20 3d 20 6f 70 65 6e 4c 69 73 74 3b 0a  pen = openList;.
200a0 20 20 20 20 77 68 69 6c 65 28 20 70 4f 70 65 6e      while( pOpen
200b0 20 26 26 20 28 70 4f 70 65 6e 2d 3e 66 69 6c 65   && (pOpen->file
200c0 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74  Id.dev!=sStat.st
200d0 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20  _dev.           
200e0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 70            || pOp
200f0 65 6e 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d  en->fileId.ino!=
20100 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b  sStat.st_ino) ){
20110 0a 20 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20  .       pOpen = 
20120 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20  pOpen->pNext;.  
20130 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 65    }.    if( pOpe
20140 6e 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55  n ){.      UnixU
20150 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20  nusedFd **pp;.  
20160 20 20 20 20 66 6f 72 28 70 70 3d 26 70 4f 70 65      for(pp=&pOpe
20170 6e 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20  n->pUnused; *pp 
20180 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21  && (*pp)->flags!
20190 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70  =flags; pp=&((*p
201a0 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20  p)->pNext));.   
201b0 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70     pUnused = *pp
201c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e 75  ;.      if( pUnu
201d0 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  sed ){.        *
201e0 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e  pp = pUnused->pN
201f0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
20200 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
20210 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
20220 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53  dif    /* if !OS
20230 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65  _VXWORKS */.  re
20240 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a  turn pUnused;.}.
20250 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
20260 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a  file zPath..** .
20270 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74  ** Previously, t
20280 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79  he SQLite OS lay
20290 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66 75  er used three fu
202a0 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65  nctions in place
202b0 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a   of this.** one:
202c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  .**.**     sqlit
202d0 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
202e0 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e();.**     sqli
202f0 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
20300 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  y();.**     sqli
20310 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
20320 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73  ve();.**.** Thes
20330 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f  e calls correspo
20340 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nd to the follow
20350 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
20360 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a   of flags:.**.**
20370 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28 29       ReadWrite()
20380 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52 49   ->     (READWRI
20390 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20  TE | CREATE).** 
203a0 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20      ReadOnly()  
203b0 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59  ->     (READONLY
203c0 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78  ) .**     OpenEx
203d0 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45  clusive() -> (RE
203e0 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
203f0 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a   | EXCLUSIVE).**
20400 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e  .** The old Open
20410 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63 65  Exclusive() acce
20420 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61  pted a boolean a
20430 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c  rgument - "delFl
20440 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c  ag". If.** true,
20450 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f   the file was co
20460 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20 61  nfigured to be a
20470 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
20480 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a  eted when the.**
20490 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f   file handle clo
204a0 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20  sed. To achieve 
204b0 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74 20  the same effect 
204c0 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a  using this new .
204d0 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64  ** interface, ad
204e0 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c  d the DELETEONCL
204f0 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73  OSE flag to thos
20500 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f 76  e specified abov
20510 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78  e for .** OpenEx
20520 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74  clusive()..*/.st
20530 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65  atic int unixOpe
20540 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
20550 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
20560 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72    /* The VFS for
20570 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20 74   which this is t
20580 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20  he xOpen method 
20590 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
205a0 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
205b0 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66    /* Pathname of
205c0 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e   file to be open
205d0 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
205e0 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  file *pFile,    
205f0 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
20600 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62   descriptor to b
20610 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20  e filled in */. 
20620 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
20630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20640 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20   Input flags to 
20650 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e  control the open
20660 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f  ing */.  int *pO
20670 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  utFlags         
20680 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
20690 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 74  flags returned t
206a0 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f  o SQLite core */
206b0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
206c0 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  p = (unixFile *)
206d0 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20  pFile;.  int fd 
206e0 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
206f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
20700 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72  descriptor retur
20710 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f  ned by open() */
20720 0a 20 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d  .  int dirfd = -
20730 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
20740 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66    /* Directory f
20750 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
20760 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  /.  int openFlag
20770 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
20780 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70     /* Flags to p
20790 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f  ass to open() */
207a0 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
207b0 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
207c0 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
207d0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
207e0 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20  nt noLock;      
207f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20800 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f   True to omit lo
20810 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
20820 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
20830 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
20840 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
20850 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
20860 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69  .  int isExclusi
20870 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  ve  = (flags & S
20880 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
20890 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44  SIVE);.  int isD
208a0 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61  elete     = (fla
208b0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
208c0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b  _DELETEONCLOSE);
208d0 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20  .  int isCreate 
208e0 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
208f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
20900 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  E);.  int isRead
20910 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20  only   = (flags 
20920 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
20930 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69  ADONLY);.  int i
20940 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66  sReadWrite  = (f
20950 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
20960 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23  EN_READWRITE);.#
20970 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
20980 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
20990 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79   int isAutoProxy
209a0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
209b0 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
209c0 58 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  XY);.#endif..  /
209d0 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
209e0 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66  master or main-f
209f0 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69  ile journal, thi
20a00 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
20a10 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65  open.  ** a file
20a20 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74  -descriptor on t
20a30 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f  he directory too
20a40 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  . The first time
20a50 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a   unixSync().  **
20a60 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64   is called the d
20a70 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
20a80 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
20a90 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63   fsync()ed and c
20aa0 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20  lose()d..  */.  
20ab0 69 6e 74 20 69 73 4f 70 65 6e 44 69 72 65 63 74  int isOpenDirect
20ac0 6f 72 79 20 3d 20 28 69 73 43 72 65 61 74 65 20  ory = (isCreate 
20ad0 26 26 20 0a 20 20 20 20 20 20 28 65 54 79 70 65  && .      (eType
20ae0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
20af0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  STER_JOURNAL || 
20b00 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
20b10 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
20b20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  .  );..  /* If a
20b30 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
20b40 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
20b50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
20b60 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
20b70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
20b80 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
20b90 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
20ba0 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
20bb0 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
20bc0 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41   zTmpname[MAX_PA
20bd0 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e  THNAME+1];.  con
20be0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
20bf0 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68   zPath;..  /* Ch
20c00 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  eck the followin
20c10 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  g statements are
20c20 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a   true: .  **.  *
20c30 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20  *   (a) Exactly 
20c40 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57  one of the READW
20c50 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c  RITE and READONL
20c60 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20  Y flags must be 
20c70 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20  set, and .  **  
20c80 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69   (b) if CREATE i
20c90 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44  s set, then READ
20ca0 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  WRITE must also 
20cb0 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a  be set, and.  **
20cc0 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53     (c) if EXCLUS
20cd0 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  IVE is set, then
20ce0 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
20cf0 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20  o be set..  **  
20d00 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e   (d) if DELETEON
20d10 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68  CLOSE is set, th
20d20 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
20d30 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f  lso be set..  */
20d40 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61  .  assert((isRea
20d50 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65  donly==0 || isRe
20d60 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28  adWrite==0) && (
20d70 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69  isReadWrite || i
20d80 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61  sReadonly));.  a
20d90 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d  ssert(isCreate==
20da0 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
20db0 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78  );.  assert(isEx
20dc0 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73  clusive==0 || is
20dd0 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72  Create);.  asser
20de0 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c  t(isDelete==0 ||
20df0 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f   isCreate);..  /
20e00 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d  * The main DB, m
20e10 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 61 6e 64  ain journal, and
20e20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
20e30 61 72 65 20 6e 65 76 65 72 20 61 75 74 6f 6d 61  are never automa
20e40 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 64 65 6c  tically.  ** del
20e50 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68  eted. Nor are th
20e60 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72  ey ever temporar
20e70 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61  y files.  */.  a
20e80 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
20e90 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
20ea0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
20eb0 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61  N_MAIN_DB );.  a
20ec0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
20ed0 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
20ee0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
20ef0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
20f00 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
20f10 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
20f20 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
20f30 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
20f40 55 52 4e 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41  URNAL );..  /* A
20f50 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75  ssert that the u
20f60 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73  pper layer has s
20f70 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66  et one of the "f
20f80 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e  ile-type" flags.
20f90 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54   */.  assert( eT
20fa0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
20fb0 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c  _MAIN_DB      ||
20fc0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
20fd0 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20  PEN_TEMP_DB .   
20fe0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
20ff0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
21000 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
21010 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
21020 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  P_JOURNAL .     
21030 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
21040 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
21050 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53  AL   || eType==S
21060 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
21070 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
21080 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
21090 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
210a0 54 5f 44 42 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d  T_DB.  );..  mem
210b0 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
210c0 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20  (unixFile));..  
210d0 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  if( eType==SQLIT
210e0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
210f0 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64  {.    UnixUnused
21100 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20  Fd *pUnused;.   
21110 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52   pUnused = findR
21120 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c  eusableFd(zName,
21130 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
21140 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20   pUnused ){.    
21150 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e    fd = pUnused->
21160 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  fd;.    }else{. 
21170 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73       pUnused = s
21180 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
21190 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b  zeof(*pUnused));
211a0 0a 20 20 20 20 20 20 69 66 28 20 21 70 55 6e 75  .      if( !pUnu
211b0 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  sed ){.        r
211c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
211d0 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
211e0 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64  }.    p->pUnused
211f0 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 7d 65   = pUnused;.  }e
21200 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29  lse if( !zName )
21210 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
21220 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75  e is NULL, the u
21230 70 70 65 72 20 6c 61 79 65 72 20 69 73 20 72 65  pper layer is re
21240 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20  questing a temp 
21250 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  file. */.    ass
21260 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20  ert(isDelete && 
21270 21 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79  !isOpenDirectory
21280 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 54  );.    rc = getT
21290 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48  empname(MAX_PATH
212a0 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65  NAME+1, zTmpname
212b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
212c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
212d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
212e0 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a   }.    zName = z
212f0 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20  Tmpname;.  }..  
21300 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
21310 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c   value of the fl
21320 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 70 61  ags parameter pa
21330 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75  ssed to POSIX fu
21340 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e  nction.  ** open
21350 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62  (). These must b
21360 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65  e calculated eve
21370 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e  n if open() is n
21380 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20  ot called, as.  
21390 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 73  ** they may be s
213a0 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
213b0 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
213c0 20 61 6e 64 20 75 73 65 64 20 62 79 20 74 68 65   and used by the
213d0 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69   .  ** 'conch fi
213e0 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63  le' locking func
213f0 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20  tions later on. 
21400 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64   */.  if( isRead
21410 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67  only )  openFlag
21420 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  s |= O_RDONLY;. 
21430 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
21440 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20   ) openFlags |= 
21450 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73  O_RDWR;.  if( is
21460 43 72 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e  Create )    open
21470 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54  Flags |= O_CREAT
21480 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73  ;.  if( isExclus
21490 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20  ive ) openFlags 
214a0 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46  |= (O_EXCL|O_NOF
214b0 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c  OLLOW);.  openFl
214c0 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46  ags |= (O_LARGEF
214d0 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a  ILE|O_BINARY);..
214e0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
214f0 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64    mode_t openMod
21500 65 20 3d 20 28 69 73 44 65 6c 65 74 65 3f 30 36  e = (isDelete?06
21510 30 30 3a 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  00:SQLITE_DEFAUL
21520 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
21530 4e 53 29 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70  NS);.    fd = op
21540 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  en(zName, openFl
21550 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a  ags, openMode);.
21560 20 20 20 20 4f 53 54 52 41 43 45 34 28 22 4f 50      OSTRACE4("OP
21570 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25  ENX   %-3d %s 0%
21580 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c  o\n", fd, zName,
21590 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 20   openFlags);.   
215a0 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72   if( fd<0 && err
215b0 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73  no!=EISDIR && is
215c0 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73  ReadWrite && !is
215d0 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
215e0 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20     /* Failed to 
215f0 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f  open the file fo
21600 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
21610 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e  ess. Try read-on
21620 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61  ly. */.      fla
21630 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f  gs &= ~(SQLITE_O
21640 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
21650 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
21660 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  );.      openFla
21670 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f  gs &= ~(O_RDWR|O
21680 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66  _CREAT);.      f
21690 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
216a0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
216b0 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
216c0 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20   O_RDONLY;.     
216d0 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65   fd = open(zName
216e0 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65  , openFlags, ope
216f0 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nMode);.    }.  
21700 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
21710 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
21720 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20  CANTOPEN;.      
21730 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
21740 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ed;.    }.  }.  
21750 61 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b  assert( fd>=0 );
21760 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73  .  if( pOutFlags
21770 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61   ){.    *pOutFla
21780 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a  gs = flags;.  }.
21790 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65  .  if( p->pUnuse
217a0 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75  d ){.    p->pUnu
217b0 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  sed->fd = fd;.  
217c0 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c    p->pUnused->fl
217d0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
217e0 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65  ..  if( isDelete
217f0 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   ){.#if OS_VXWOR
21800 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a  KS.    zPath = z
21810 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Name;.#else.    
21820 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23  unlink(zName);.#
21830 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51  endif.  }.#if SQ
21840 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
21850 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65  ING_STYLE.  else
21860 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61  {.    p->openFla
21870 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
21880 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
21890 28 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  ( isOpenDirector
218a0 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70  y ){.    rc = op
218b0 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74  enDirectory(zPat
218c0 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20  h, &dirfd);.    
218d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
218e0 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74  K ){.      /* It
218f0 20 69 73 20 73 61 66 65 20 74 6f 20 63 6c 6f 73   is safe to clos
21900 65 20 66 64 20 61 74 20 74 68 69 73 20 70 6f 69  e fd at this poi
21910 6e 74 2c 20 62 65 63 61 75 73 65 20 69 74 20 69  nt, because it i
21920 73 20 67 75 61 72 61 6e 74 65 65 64 20 6e 6f 74  s guaranteed not
21930 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  .      ** to be 
21940 6f 70 65 6e 20 6f 6e 20 61 20 64 61 74 61 62 61  open on a databa
21950 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 77  se file. If it w
21960 65 72 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61  ere open on a da
21970 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 20 20 20  tabase file,.   
21980 20 20 20 2a 2a 20 69 74 20 77 6f 75 6c 64 20 6e     ** it would n
21990 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20 63 6c  ot be safe to cl
219a0 6f 73 65 20 61 73 20 74 68 69 73 20 77 6f 75 6c  ose as this woul
219b0 64 20 72 65 6c 65 61 73 65 20 61 6e 79 20 6c 6f  d release any lo
219c0 63 6b 73 20 68 65 6c 64 0a 20 20 20 20 20 20 2a  cks held.      *
219d0 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 62 79  * on the file by
219e0 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 20 20   this process.  
219f0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
21a00 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
21a10 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20  PEN_MAIN_DB );. 
21a20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20       close(fd); 
21a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
21a40 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20  ilently leak if 
21a50 66 61 69 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e  fail, already in
21a60 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
21a70 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
21a80 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  ed;.    }.  }..#
21a90 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43  ifdef FD_CLOEXEC
21aa0 0a 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53  .  fcntl(fd, F_S
21ab0 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20  ETFD, fcntl(fd, 
21ac0 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44  F_GETFD, 0) | FD
21ad0 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69  _CLOEXEC);.#endi
21ae0 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54  f..  noLock = eT
21af0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
21b00 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69  _MAIN_DB;..  .#i
21b10 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
21b20 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  E__) || SQLITE_E
21b30 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
21b40 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74 61  YLE.  struct sta
21b50 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 69 66  tfs fsInfo;.  if
21b60 28 20 66 73 74 61 74 66 73 28 66 64 2c 20 26 66  ( fstatfs(fd, &f
21b70 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a  sInfo) == -1 ){.
21b80 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
21b90 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e  pFile)->lastErrn
21ba0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  o = errno;.    i
21bb0 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  f( dirfd>=0 ) cl
21bc0 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73  ose(dirfd); /* s
21bd0 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20  ilently leak if 
21be0 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a  fail, in error *
21bf0 2f 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b  /.    close(fd);
21c00 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61   /* silently lea
21c10 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72  k if fail, in er
21c20 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
21c30 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
21c40 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20  CCESS;.  }.  if 
21c50 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d  (0 == strncmp("m
21c60 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f  sdos", fsInfo.f_
21c70 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20  fstypename, 5)) 
21c80 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
21c90 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
21ca0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
21cb0 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20  AGS_IS_MSDOS;.  
21cc0 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69 66 20  }.#endif.  .#if 
21cd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
21ce0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20  CKING_STYLE.#if 
21cf0 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
21d00 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73  OXY_LOCKING.  is
21d10 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23  AutoProxy = 1;.#
21d20 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41 75  endif.  if( isAu
21d30 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74  toProxy && (zPat
21d40 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f  h!=NULL) && (!no
21d50 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78  Lock) && pVfs->x
21d60 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  Open ){.    char
21d70 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74   *envforce = get
21d80 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43  env("SQLITE_FORC
21d90 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22  E_PROXY_LOCKING"
21da0 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72  );.    int usePr
21db0 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  oxy = 0;..    /*
21dc0 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
21dd0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d  OXY_LOCKING==1 m
21de0 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79  eans force alway
21df0 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d  s use proxy, 0 m
21e00 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76  eans .    ** nev
21e10 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55  er use proxy, NU
21e20 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f  LL means use pro
21e30 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c  xy for non-local
21e40 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f   files only.  */
21e50 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63  .    if( envforc
21e60 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  e!=NULL ){.     
21e70 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69   useProxy = atoi
21e80 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20  (envforce)>0;.  
21e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
21ea0 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
21eb0 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 73  nfo;.      if( s
21ec0 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73  tatfs(zPath, &fs
21ed0 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
21ee0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65         /* In the
21ef0 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66  ory, the close(f
21f00 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f  d) call is sub-o
21f10 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66  ptimal. If the f
21f20 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20  ile opened.     
21f30 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73     ** with fd is
21f40 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
21f50 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
21f60 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
21f70 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  s open.        *
21f80 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74  * on that file t
21f90 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
21fa0 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f  y holding adviso
21fb0 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a  ry locks on it,.
21fc0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
21fd0 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73  the call to clos
21fe0 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20  e() will cancel 
21ff0 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20  those locks. In 
22000 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20  practice,.      
22010 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d    ** we're assum
22020 69 6e 67 20 74 68 61 74 20 73 74 61 74 66 73 28  ing that statfs(
22030 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76  ) doesn't fail v
22040 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65  ery often. At le
22050 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  ast.        ** n
22060 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66  ot while other f
22070 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
22080 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73 61  opened by the sa
22090 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20  me process on.  
220a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d        ** the sam
220b0 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69  e file are worki
220c0 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ng.  */.        
220d0 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  p->lastErrno = e
220e0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66  rrno;.        if
220f0 28 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20  ( dirfd>=0 ){.  
22100 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 64 69          close(di
22110 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c  rfd); /* silentl
22120 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20  y leak if fail, 
22130 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  in error */.    
22140 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6c      }.        cl
22150 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65  ose(fd); /* sile
22160 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69  ntly leak if fai
22170 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  l, in error */. 
22180 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
22190 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
221a0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  .        goto op
221b0 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
221c0 20 20 20 7d 0a 20 20 20 20 20 20 75 73 65 50 72     }.      usePr
221d0 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66  oxy = !(fsInfo.f
221e0 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c  _flags&MNT_LOCAL
221f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
22200 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20   useProxy ){.   
22210 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e     rc = fillInUn
22220 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c  ixFile(pVfs, fd,
22230 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a   dirfd, pFile, z
22240 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73  Path, noLock, is
22250 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 69  Delete);.      i
22260 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22270 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
22280 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
22290 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c  nixFile((unixFil
222a0 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f  e*)pFile, ":auto
222b0 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  :");.        if(
222c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
222d0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  {.          /* U
222e0 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20  se unixClose to 
222f0 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65 73  clean up the res
22300 6f 75 72 63 65 73 20 61 64 64 65 64 20 69 6e 20  ources added in 
22310 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a  fillInUnixFile .
22320 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
22330 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73   clear all the s
22340 74 72 75 63 74 75 72 65 27 73 20 72 65 66 65 72  tructure's refer
22350 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66 69 63  ences.  Specific
22360 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20  ally, .         
22370 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68   ** pFile->pMeth
22380 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ods will be NULL
22390 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f   so sqlite3OsClo
223a0 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d  se will be a no-
223b0 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  op .          */
223c0 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 43  .          unixC
223d0 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  lose(pFile);.   
223e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
223f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22400 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f    }.      goto o
22410 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  pen_finished;.  
22420 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
22430 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55   .  rc = fillInU
22440 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64  nixFile(pVfs, fd
22450 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c 20  , dirfd, pFile, 
22460 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69  zPath, noLock, i
22470 73 44 65 6c 65 74 65 29 3b 0a 6f 70 65 6e 5f 66  sDelete);.open_f
22480 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72  inished:.  if( r
22490 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
224a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
224b0 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20  (p->pUnused);.  
224c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
224d0 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  .../*.** Delete 
224e0 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74  the file at zPat
224f0 68 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e  h. If the dirSyn
22500 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72  c argument is tr
22510 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74  ue, fsync().** t
22520 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  he directory aft
22530 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
22540 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
22550 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a  int unixDelete(.
22560 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e    sqlite3_vfs *N
22570 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56  otUsed,     /* V
22580 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  FS containing th
22590 69 73 20 61 73 20 74 68 65 20 78 44 65 6c 65 74  is as the xDelet
225a0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  e method */.  co
225b0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
225c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
225d0 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  of file to be de
225e0 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  leted */.  int d
225f0 69 72 53 79 6e 63 20 20 20 20 20 20 20 20 20 20  irSync          
22600 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
22610 20 66 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f   fsync() directo
22620 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e  ry after deletin
22630 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  g file */.){.  i
22640 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22650 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  K;.  UNUSED_PARA
22660 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
22670 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
22680 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
22690 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20  IOERR_DELETE);. 
226a0 20 75 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3b 0a   unlink(zPath);.
226b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
226c0 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20  ISABLE_DIRSYNC. 
226d0 20 69 66 28 20 64 69 72 53 79 6e 63 20 29 7b 0a   if( dirSync ){.
226e0 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20      int fd;.    
226f0 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f  rc = openDirecto
22700 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a  ry(zPath, &fd);.
22710 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22720 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f  TE_OK ){.#if OS_
22730 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66  VXWORKS.      if
22740 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20  ( fsync(fd)==-1 
22750 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66  ).#else.      if
22760 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65  ( fsync(fd) ).#e
22770 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
22780 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22790 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
227a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
227b0 69 66 28 20 63 6c 6f 73 65 28 66 64 29 26 26 21  if( close(fd)&&!
227c0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  rc ){.        rc
227d0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
227e0 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20  DIR_CLOSE;.     
227f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
22800 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
22810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  .}../*.** Test t
22820 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
22830 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  or access permis
22840 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50  sions of file zP
22850 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74  ath. The.** test
22860 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e   performed depen
22870 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
22880 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
22890 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
228a0 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e  S_EXISTS: Return
228b0 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65   1 if the file e
228c0 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c  xists.**     SQL
228d0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
228e0 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69  RITE: Return 1 i
228f0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  f the file is re
22900 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e  ad and writable.
22910 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
22920 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20  CCESS_READONLY: 
22930 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
22940 66 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65  file is readable
22950 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
22960 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  e return 0..*/.s
22970 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63  tatic int unixAc
22980 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
22990 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20  vfs *NotUsed,   
229a0 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61  /* The VFS conta
229b0 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63 65  ining this xAcce
229c0 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  ss method */.  c
229d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
229e0 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f  ,      /* Path o
229f0 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78  f the file to ex
22a00 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66  amine */.  int f
22a10 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
22a20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65     /* What do we
22a30 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61   want to learn a
22a40 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20 66  bout the zPath f
22a50 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ile? */.  int *p
22a60 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20  ResOut          
22a70 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
22a80 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a  t boolean here *
22a90 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65  /.){.  int amode
22aa0 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50   = 0;.  UNUSED_P
22ab0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
22ac0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
22ad0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
22ae0 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
22af0 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66  ; );.  switch( f
22b00 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65  lags ){.    case
22b10 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
22b20 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f  XISTS:.      amo
22b30 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20  de = F_OK;.     
22b40 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
22b50 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
22b60 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20  EADWRITE:.      
22b70 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f  amode = W_OK|R_O
22b80 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
22b90 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22ba0 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20  ACCESS_READ:.   
22bb0 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b     amode = R_OK;
22bc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
22bd0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
22be0 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c    assert(!"Inval
22bf0 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  id flags argumen
22c00 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  t");.  }.  *pRes
22c10 4f 75 74 20 3d 20 28 61 63 63 65 73 73 28 7a 50  Out = (access(zP
22c20 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b  ath, amode)==0);
22c30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22c40 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
22c50 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70  urn a relative p
22c60 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66  athname into a f
22c70 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68  ull pathname. Th
22c80 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a  e relative path.
22c90 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73 20  ** is stored as 
22ca0 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
22cb0 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62   string in the b
22cc0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
22cd0 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a   by.** zPath. .*
22ce0 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73  *.** zOut points
22cf0 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
22d00 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33  at least sqlite3
22d10 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20  _vfs.mxPathname 
22d20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68  bytes .** (in th
22d30 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54  is case, MAX_PAT
22d40 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68  HNAME bytes). Th
22d50 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77  e full-path is w
22d60 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69  ritten to.** thi
22d70 73 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20  s buffer before 
22d80 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
22d90 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c  atic int unixFul
22da0 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c  lPathname(.  sql
22db0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
22dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
22dd0 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a  inter to vfs obj
22de0 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
22df0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
22e00 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62         /* Possib
22e10 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75  ly relative inpu
22e20 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20  t path */.  int 
22e30 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20  nOut,           
22e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
22e50 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66  e of output buff
22e60 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
22e70 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20   char *zOut     
22e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22e90 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20  * Output buffer 
22ea0 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73  */.){..  /* It's
22eb0 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
22ec0 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
22ed0 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
22ee0 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
22ef0 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
22f00 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
22f10 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
22f20 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
22f30 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
22f40 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66   failing. This f
22f50 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61  unction could fa
22f60 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70  il if, for examp
22f70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72  le, the.  ** cur
22f80 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72  rent working dir
22f90 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
22fa0 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20  unlinked..  */. 
22fb0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
22fc0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
22fd0 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65  ERROR );..  asse
22fe0 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  rt( pVfs->mxPath
22ff0 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41  name==MAX_PATHNA
23000 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ME );.  UNUSED_P
23010 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
23020 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20  .  zOut[nOut-1] 
23030 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50  = '\0';.  if( zP
23040 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ath[0]=='/' ){. 
23050 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
23060 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20  ntf(nOut, zOut, 
23070 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  "%s", zPath);.  
23080 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
23090 43 77 64 3b 0a 20 20 20 20 69 66 28 20 67 65 74  Cwd;.    if( get
230a0 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31  cwd(zOut, nOut-1
230b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
230c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
230d0 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OPEN;.    }.    
230e0 6e 43 77 64 20 3d 20 28 69 6e 74 29 73 74 72 6c  nCwd = (int)strl
230f0 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71  en(zOut);.    sq
23100 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
23110 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b  Out-nCwd, &zOut[
23120 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50  nCwd], "/%s", zP
23130 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ath);.  }.  retu
23140 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
23150 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
23160 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
23170 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  SION./*.** Inter
23180 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
23190 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
231a0 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
231b0 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
231c0 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
231d0 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
231e0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
231f0 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  brary..*/.#inclu
23200 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61  de <dlfcn.h>.sta
23210 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c  tic void *unixDl
23220 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
23230 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74   *NotUsed, const
23240 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
23250 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
23260 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
23270 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28    return dlopen(
23280 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f  zFilename, RTLD_
23290 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41  NOW | RTLD_GLOBA
232a0 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  L);.}../*.** SQL
232b0 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66  ite calls this f
232c0 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74  unction immediat
232d0 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ely after a call
232e0 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20   to unixDlSym() 
232f0 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e  or.** unixDlOpen
23300 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e  () fails (return
23310 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  s a null pointer
23320 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74  ). If a more det
23330 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d  ailed error.** m
23340 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61  essage is availa
23350 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74  ble, it is writt
23360 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49  en to zBufOut. I
23370 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61  f no error messa
23380 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ge.** is availab
23390 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c  le, zBufOut is l
233a0 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61  eft unmodified a
233b0 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61  nd SQLite uses a
233c0 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f   default.** erro
233d0 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74  r message..*/.st
233e0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c  atic void unixDl
233f0 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
23400 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
23410 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
23420 4f 75 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  Out){.  char *zE
23430 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  rr;.  UNUSED_PAR
23440 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
23450 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
23460 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c  x();.  zErr = dl
23470 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a  error();.  if( z
23480 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
23490 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
234a0 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c  , zBufOut, "%s",
234b0 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e   zErr);.  }.  un
234c0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
234d0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a  }.static void (*
234e0 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65  unixDlSym(sqlite
234f0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
23500 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63  void *p, const c
23510 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29  har*zSym))(void)
23520 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43  {.  /* .  ** GCC
23530 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d   with -pedantic-
23540 65 72 72 6f 72 73 20 73 61 79 73 20 74 68 61 74  errors says that
23550 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c   C90 does not al
23560 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62  low a void* to b
23570 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f  e.  ** cast into
23580 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
23590 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79  function.  And y
235a0 65 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 64  et the library d
235b0 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20  lsym() routine. 
235c0 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f   ** returns a vo
235d0 69 64 2a 20 77 68 69 63 68 20 69 73 20 72 65 61  id* which is rea
235e0 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
235f0 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f   a function.  So
23600 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20   how do we.  ** 
23610 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68  use dlsym() with
23620 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72   -pedantic-error
23630 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72  s?.  **.  ** Var
23640 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73  iable x below is
23650 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61   defined to be a
23660 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
23670 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20  nction taking.  
23680 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f  ** parameters vo
23690 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68  id* and const ch
236a0 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e  ar* and returnin
236b0 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  g a pointer to a
236c0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20   function..  ** 
236d0 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20  We initialize x 
236e0 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20  by assigning it 
236f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
23700 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f   dlsym() functio
23710 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73  n..  ** (That as
23720 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65  signment require
23730 73 20 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e  s a cast.)  Then
23740 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e   we call the fun
23750 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20  ction that.  ** 
23760 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20  x points to.  . 
23770 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f   **.  ** This wo
23780 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c  rk-around is unl
23790 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f  ikely to work co
237a0 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73  rrectly on any s
237b0 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a  ystem where.  **
237c0 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e   you really cann
237d0 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63 74 69  ot cast a functi
237e0 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20  on pointer into 
237f0 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e  void*.  But then
23800 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74  , on the.  ** ot
23810 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28  her hand, dlsym(
23820 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  ) will not work 
23830 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74 65 6d  on such a system
23840 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68   either, so we h
23850 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61  ave.  ** not rea
23860 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e  lly lost anythin
23870 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28  g..  */.  void (
23880 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  *(*x)(void*,cons
23890 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b  t char*))(void);
238a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
238b0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
238c0 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76  x = (void(*(*)(v
238d0 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
238e0 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a  ))(void))dlsym;.
238f0 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c    return (*x)(p,
23900 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63   zSym);.}.static
23910 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73   void unixDlClos
23920 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  e(sqlite3_vfs *N
23930 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48  otUsed, void *pH
23940 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44  andle){.  UNUSED
23950 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
23960 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70  ed);.  dlclose(p
23970 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65  Handle);.}.#else
23980 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d   /* if SQLITE_OM
23990 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
239a0 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f  N is defined: */
239b0 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
239c0 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69  lOpen  0.  #defi
239d0 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30  ne unixDlError 0
239e0 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
239f0 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69  lSym   0.  #defi
23a00 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30  ne unixDlClose 0
23a10 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
23a20 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20  rite nBuf bytes 
23a30 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74  of random data t
23a40 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62  o the supplied b
23a50 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73  uffer zBuf..*/.s
23a60 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61  tatic int unixRa
23a70 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33  ndomness(sqlite3
23a80 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
23a90 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
23aa0 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Buf){.  UNUSED_P
23ab0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
23ac0 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a  );.  assert((siz
23ad0 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f  e_t)nBuf>=(sizeo
23ae0 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66  f(time_t)+sizeof
23af0 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57  (int)));..  /* W
23b00 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61  e have to initia
23b10 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65  lize zBuf to pre
23b20 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72  vent valgrind fr
23b30 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a  om reporting.  *
23b40 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72  * errors.  The r
23b50 65 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79  eports issued by
23b60 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e   valgrind are in
23b70 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75  correct - we wou
23b80 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74  ld.  ** prefer t
23b90 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65  hat the randomne
23ba0 73 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ss be increased 
23bb0 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66  by making use of
23bc0 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74   the.  ** uninit
23bd0 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e  ialized space in
23be0 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67   zBuf - but valg
23bf0 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64  rind errors tend
23c00 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73   to worry.  ** s
23c10 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68  ome users.  Rath
23c20 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69  er than argue, i
23c30 74 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a  t seems easier j
23c40 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ust to initializ
23c50 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65  e.  ** the whole
23c60 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e   array and silen
23c70 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65  ce valgrind, eve
23c80 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20  n if that means 
23c90 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a  less randomness.
23ca0 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64    ** in the rand
23cb0 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20  om seed..  **.  
23cc0 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c  ** When testing,
23cd0 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42   initializing zB
23ce0 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20  uf[] to zero is 
23cf0 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74  all we do.  That
23d00 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74   means.  ** that
23d10 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
23d20 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e  he same random n
23d30 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20  umber sequence. 
23d40 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a   This makes the.
23d50 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61    ** tests repea
23d60 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65  table..  */.  me
23d70 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42  mset(zBuf, 0, nB
23d80 75 66 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  uf);.#if !define
23d90 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20  d(SQLITE_TEST). 
23da0 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 2c 20   {.    int pid, 
23db0 66 64 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65  fd;.    fd = ope
23dc0 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22  n("/dev/urandom"
23dd0 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20  , O_RDONLY);.   
23de0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
23df0 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20     time_t t;.   
23e00 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20     time(&t);.   
23e10 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20     memcpy(zBuf, 
23e20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a  &t, sizeof(t));.
23e30 20 20 20 20 20 20 70 69 64 20 3d 20 67 65 74 70        pid = getp
23e40 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  id();.      memc
23e50 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28  py(&zBuf[sizeof(
23e60 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f  t)], &pid, sizeo
23e70 66 28 70 69 64 29 29 3b 0a 20 20 20 20 20 20 61  f(pid));.      a
23e80 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 74 29  ssert( sizeof(t)
23e90 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73  +sizeof(pid)<=(s
23ea0 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20  ize_t)nBuf );.  
23eb0 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f      nBuf = sizeo
23ec0 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 70 69  f(t) + sizeof(pi
23ed0 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
23ee0 20 20 20 20 20 6e 42 75 66 20 3d 20 72 65 61 64       nBuf = read
23ef0 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29  (fd, zBuf, nBuf)
23f00 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64  ;.      close(fd
23f10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
23f20 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75  dif.  return nBu
23f30 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  f;.}.../*.** Sle
23f40 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
23f50 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
23f60 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
23f70 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20  e slept..** The 
23f80 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
23f90 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
23fa0 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74  econds we want t
23fb0 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20  o sleep..** The 
23fc0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
23fd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
23fe0 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c  croseconds of sl
23ff0 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  eep actually.** 
24000 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
24010 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70  he underlying op
24020 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20  erating system, 
24030 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a  a number which.*
24040 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74  * might be great
24050 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
24060 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74   to the argument
24070 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a  , but not less.*
24080 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d  * than the argum
24090 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
240a0 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c  nt unixSleep(sql
240b0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
240c0 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f  d, int microseco
240d0 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  nds){.#if OS_VXW
240e0 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69  ORKS.  struct ti
240f0 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70  mespec sp;..  sp
24100 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73  .tv_sec = micros
24110 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30  econds / 1000000
24120 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d  ;.  sp.tv_nsec =
24130 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25   (microseconds %
24140 20 31 30 30 30 30 30 30 29 20 2a 20 31 30 30 30   1000000) * 1000
24150 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73  ;.  nanosleep(&s
24160 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53  p, NULL);.  UNUS
24170 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
24180 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
24190 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65  microseconds;.#e
241a0 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  lif defined(HAVE
241b0 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45  _USLEEP) && HAVE
241c0 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70  _USLEEP.  usleep
241d0 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a  (microseconds);.
241e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
241f0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
24200 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e  eturn microsecon
24210 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  ds;.#else.  int 
24220 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f  seconds = (micro
24230 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f  seconds+999999)/
24240 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70  1000000;.  sleep
24250 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55  (seconds);.  UNU
24260 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
24270 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
24280 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30   seconds*1000000
24290 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
242a0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
242b0 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74  variable, if set
242c0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
242d0 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72  alue, is interpr
242e0 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e  eted as.** the n
242f0 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73  umber of seconds
24300 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20   since 1970 and 
24310 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74  is used to set t
24320 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
24330 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
24340 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65  Time() during te
24350 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66  sting..*/.#ifdef
24360 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
24370 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
24380 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46  _time = 0;  /* F
24390 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20  ake system time 
243a0 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  in seconds since
243b0 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66   1970. */.#endif
243c0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
243d0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
243e0 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
243f0 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
24400 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72  Write the.** cur
24410 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
24420 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
24430 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ay number into *
24440 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74  prNow and.** ret
24450 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
24460 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
24470 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
24480 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
24490 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74   int unixCurrent
244a0 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Time(sqlite3_vfs
244b0 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c   *NotUsed, doubl
244c0 65 20 2a 70 72 4e 6f 77 29 7b 0a 23 69 66 20 64  e *prNow){.#if d
244d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
244e0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
244f0 54 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20  T).  time_t t;. 
24500 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72   time(&t);.  *pr
24510 4e 6f 77 20 3d 20 28 28 28 73 71 6c 69 74 65 33  Now = (((sqlite3
24520 5f 69 6e 74 36 34 29 74 29 2f 38 36 34 30 20 2b  _int64)t)/8640 +
24530 20 32 34 34 30 35 38 37 35 29 2f 31 30 3b 0a 23   24405875)/10;.#
24540 65 6c 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  elif defined(NO_
24550 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74  GETTOD).  time_t
24560 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a   t;.  time(&t);.
24570 20 20 2a 70 72 4e 6f 77 20 3d 20 74 2f 38 36 34    *prNow = t/864
24580 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35  00.0 + 2440587.5
24590 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52  ;.#elif OS_VXWOR
245a0 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  KS.  struct time
245b0 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f  spec sNow;.  clo
245c0 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b  ck_gettime(CLOCK
245d0 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77  _REALTIME, &sNow
245e0 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34  );.  *prNow = 24
245f0 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74  40587.5 + sNow.t
24600 76 5f 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20  v_sec/86400.0 + 
24610 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 38 36 34  sNow.tv_nsec/864
24620 30 30 30 30 30 30 30 30 30 30 30 2e 30 3b 0a 23  00000000000.0;.#
24630 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74 69  else.  struct ti
24640 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 67 65  meval sNow;.  ge
24650 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77  ttimeofday(&sNow
24660 2c 20 30 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d  , 0);.  *prNow =
24670 20 32 34 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f   2440587.5 + sNo
24680 77 2e 74 76 5f 73 65 63 2f 38 36 34 30 30 2e 30  w.tv_sec/86400.0
24690 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f   + sNow.tv_usec/
246a0 38 36 34 30 30 30 30 30 30 30 30 2e 30 3b 0a 23  86400000000.0;.#
246b0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
246c0 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
246d0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
246e0 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e  time ){.    *prN
246f0 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 75 72  ow = sqlite3_cur
24700 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e  rent_time/86400.
24710 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20  0 + 2440587.5;. 
24720 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53   }.#endif.  UNUS
24730 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
24740 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
24750 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61  0;.}../*.** We a
24760 64 64 65 64 20 74 68 65 20 78 47 65 74 4c 61 73  dded the xGetLas
24770 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20  tError() method 
24780 77 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74 69  with the intenti
24790 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a  on of providing.
247a0 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65  ** better low-le
247b0 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67  vel error messag
247c0 65 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e  es when operatin
247d0 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d  g-system problem
247e0 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72  s come up.** dur
247f0 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61  ing SQLite opera
24800 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66 61  tion.  But so fa
24810 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20  r, none of that 
24820 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65  has been impleme
24830 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63  nted.** in the c
24840 6f 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72 6f  ore.  So this ro
24850 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
24860 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c  alled.  For now,
24870 20 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a   it is merely.**
24880 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e   a place-holder.
24890 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
248a0 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  nixGetLastError(
248b0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
248c0 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
248d0 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65  d2, char *NotUse
248e0 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d3){.  UNUSED_PA
248f0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
24900 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
24910 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a  ETER(NotUsed2);.
24920 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
24930 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20  ER(NotUsed3);.  
24940 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
24950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24960 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
24970 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
24980 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
24990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
249a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
249b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
249c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
249d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
249e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
249f0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
24a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a40 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
24a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
24a60 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20  n Proxy Locking 
24a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a90 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63  .**.** Proxy loc
24aa0 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d  king is a "uber-
24ab0 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20  locking-method" 
24ac0 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20  in this sense:  
24ad0 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f  It uses the.** o
24ae0 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  ther locking met
24af0 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72  hods on secondar
24b00 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50  y lock files.  P
24b10 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
24b20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20  a.** meta-layer 
24b30 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20  over top of the 
24b40 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e  primitive lockin
24b50 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62  g implemented ab
24b60 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69  ove.  For.** thi
24b70 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69  s reason, the di
24b80 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c  vision that impl
24b90 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20  ements of proxy 
24ba0 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72  locking is defer
24bb0 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74  red.** until lat
24bc0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68  e in the file (h
24bd0 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f  ere) after all o
24be0 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20  f the other I/O 
24bf0 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20  methods have.** 
24c00 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73  been defined - s
24c10 6f 20 74 68 61 74 20 74 68 65 20 70 72 69 6d 69  o that the primi
24c20 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  tive locking met
24c30 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61 62  hods are availab
24c40 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65  le.** as service
24c50 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74  s to help with t
24c60 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
24c70 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69  n of proxy locki
24c80 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ng..**.****.**.*
24c90 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  * The default lo
24ca0 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e  cking schemes in
24cb0 20 53 51 4c 69 74 65 20 75 73 65 20 62 79 74 65   SQLite use byte
24cc0 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20  -range locks on 
24cd0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
24ce0 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61  file to coordina
24cf0 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72  te safe, concurr
24d00 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d 75  ent access by mu
24d10 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a  ltiple readers.*
24d20 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68  * and writers [h
24d30 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67  ttp://sqlite.org
24d40 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d  /lockingv3.html]
24d50 2e 20 20 54 68 65 20 66 69 76 65 20 66 69 6c 65  .  The five file
24d60 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74   locking.** stat
24d70 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45  es (UNLOCKED, PE
24d80 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52  NDING, SHARED, R
24d90 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49  ESERVED, EXCLUSI
24da0 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  VE) are implemen
24db0 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20  ted.** as POSIX 
24dc0 72 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63  read & write loc
24dd0 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20 73 65  ks over fixed se
24de0 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28  t of locations (
24df0 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f  via fsctl),.** o
24e00 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e  n AFP and SMB on
24e10 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62 79 74  ly exclusive byt
24e20 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72  e-range locks ar
24e30 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20  e available via 
24e40 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49  fsctl.** with _I
24e50 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
24e60 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
24e70 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74  kPB2) to track t
24e80 68 65 20 73 61 6d 65 20 35 20 73 74 61 74 65 73  he same 5 states
24e90 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65  ..** To simulate
24ea0 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68   a F_RDLCK on th
24eb0 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20  e shared range, 
24ec0 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c  on AFP a randoml
24ed0 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64  y selected.** ad
24ee0 64 72 65 73 73 20 69 6e 20 74 68 65 20 73 68 61  dress in the sha
24ef0 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b  red range is tak
24f00 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44 20  en for a SHARED 
24f10 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65  lock, the entire
24f20 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65  .** shared range
24f30 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e   is taken for an
24f40 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29   EXCLUSIVE lock)
24f50 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e  :.**.**      PEN
24f60 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20  DING_BYTE       
24f70 20 30 78 34 30 30 30 30 30 30 30 09 09 20 20 20   0x40000000..   
24f80 09 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52 56  ..**      RESERV
24f90 45 44 5f 42 59 54 45 20 20 20 20 20 20 20 30 78  ED_BYTE       0x
24fa0 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20 20  40000001.**     
24fb0 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20 20   SHARED_RANGE   
24fc0 20 20 20 20 20 30 78 34 30 30 30 30 30 30 32 20       0x40000002 
24fd0 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a 2a  -> 0x40000200.**
24fe0 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 77  .** This works w
24ff0 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ell on the local
25000 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62 75   file system, bu
25010 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c 79  t shows a nearly
25020 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77   100x.** slowdow
25030 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f 72  n in read perfor
25040 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65 63  mance on AFP bec
25050 61 75 73 65 20 74 68 65 20 41 46 50 20 63 6c 69  ause the AFP cli
25060 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20  ent disables.** 
25070 74 68 65 20 72 65 61 64 20 63 61 63 68 65 20 77  the read cache w
25080 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  hen byte-range l
25090 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74  ocks are present
250a0 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65 20  .  Enabling the 
250b0 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65 78  read.** cache ex
250c0 70 6f 73 65 73 20 61 20 63 61 63 68 65 20 63 6f  poses a cache co
250d0 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20  herency problem 
250e0 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20  that is present 
250f0 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73  on all OS X.** s
25100 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b  upported network
25110 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20   file systems.  
25120 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74 68  NFS and AFP both
25130 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a 20   observe the.** 
25140 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65  close-to-open se
25150 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73 75  mantics for ensu
25160 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65 72  ring cache coher
25170 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f  ency.** [http://
25180 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e  nfs.sourceforge.
25190 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68  net/#faq_a8], wh
251a0 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66 66  ich does not eff
251b0 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72  ectively.** addr
251c0 65 73 73 20 74 68 65 20 72 65 71 75 69 72 65 6d  ess the requirem
251d0 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72 72  ents for concurr
251e0 65 6e 74 20 64 61 74 61 62 61 73 65 20 61 63 63  ent database acc
251f0 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a  ess by multiple.
25200 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20 77  ** readers and w
25210 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a  riters.** [http:
25220 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d  //www.nabble.com
25230 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63  /SQLite-on-NFS-c
25240 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74  ache-coherency-t
25250 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e  d15655701.html].
25260 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73  .**.** To addres
25270 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  s the performanc
25280 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68 65  e and cache cohe
25290 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70 72  rency issues, pr
252a0 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
252b0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65 20  .** changes the 
252c0 77 61 79 20 64 61 74 61 62 61 73 65 20 61 63 63  way database acc
252d0 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65  ess is controlle
252e0 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61 63  d by limiting ac
252f0 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e  cess to a.** sin
25300 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74 69  gle host at a ti
25310 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69  me and moving fi
25320 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20  le locks off of 
25330 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25340 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20  e.** and onto a 
25350 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74 68  proxy file on th
25360 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  e local file sys
25370 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  tem.  .**.**.** 
25380 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b  Using proxy lock
25390 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
253a0 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41  ------.**.** C A
253b0 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74  PIs.**.**  sqlit
253c0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
253d0 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49  db, dbname, SQLI
253e0 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
253f0 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20  FILE,.**        
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c                 <
25410 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a  proxy_path> | ":
25420 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c  auto:");.**  sql
25430 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
25440 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51  l(db, dbname, SQ
25450 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
25460 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78 79 5f  XYFILE, &<proxy_
25470 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a  path>);.**.**.**
25480 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a   SQL pragmas.**.
25490 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
254a0 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  base.]lock_proxy
254b0 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74  _file=<proxy_pat
254c0 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20  h> | :auto:.**  
254d0 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
254e0 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
254f0 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69  e.**.** Specifyi
25500 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e  ng ":auto:" mean
25510 73 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20  s that if there 
25520 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20  is a conch file 
25530 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a  with a matching.
25540 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74  ** host ID in it
25550 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61 74 68  , the proxy path
25560 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   in the conch fi
25570 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c  le will be used,
25580 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20   otherwise.** a 
25590 70 72 6f 78 79 20 70 61 74 68 20 62 61 73 65 64  proxy path based
255a0 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20 74   on the user's t
255b0 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20  emp dir.** (via 
255c0 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57  confstr(_CS_DARW
255d0 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
255e0 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75  ,...)) will be u
255f0 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61  sed and the.** a
25600 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65  ctual proxy file
25610 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74   name is generat
25620 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65  ed from the name
25630 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65   and path of the
25640 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
25650 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  e.  For example:
25660 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72  .**.**       For
25670 20 64 61 74 61 62 61 73 65 20 70 61 74 68 20 22   database path "
25680 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62  /Users/me/foo.db
25690 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  " .**       The 
256a0 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62  lock path will b
256b0 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69  e "<tmpdir>/sqli
256c0 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f  teplocks/_Users_
256d0 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22  me_foo.db:auto:"
256e0 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c  ).**.** Once a l
256f0 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e  ock proxy is con
25700 66 69 67 75 72 65 64 20 66 6f 72 20 61 20 64 61  figured for a da
25710 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
25720 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a  n, it can not.**
25730 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77   be removed, how
25740 65 76 65 72 20 69 74 20 6d 61 79 20 62 65 20 73  ever it may be s
25750 77 69 74 63 68 65 64 20 74 6f 20 61 20 64 69 66  witched to a dif
25760 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74  ferent proxy pat
25770 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f  h via.** the abo
25780 76 65 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e  ve APIs (assumin
25790 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  g the conch file
257a0 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65   is not being he
257b0 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a  ld by another.**
257c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70   connection or p
257d0 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a  rocess). .**.**.
257e0 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63  ** How proxy loc
257f0 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d  king works.** --
25800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25810 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  -----.**.** Prox
25820 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72  y file locking r
25830 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20  elies primarily 
25840 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f  on two new suppo
25850 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a  rting files: .**
25860 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66  .**   *  conch f
25870 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63  ile to limit acc
25880 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ess to the datab
25890 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69  ase file to a si
258a0 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20  ngle host.**    
258b0 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a    at a time.**.*
258c0 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c  *   *  proxy fil
258d0 65 20 74 6f 20 61 63 74 20 61 73 20 61 20 70 72  e to act as a pr
258e0 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64 76 69  oxy for the advi
258f0 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61  sory locks norma
25900 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65  lly.**      take
25910 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
25920 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63  e.**.** The conc
25930 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20  h file - to use 
25940 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71  a proxy file, sq
25950 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73 74 20  lite must first 
25960 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22  "hold the conch"
25970 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e  .** by taking an
25980 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68   sqlite-style sh
25990 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
259a0 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61   conch file, rea
259b0 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  ding the.** cont
259c0 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69  ents and compari
259d0 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e  ng the host's un
259e0 69 71 75 65 20 68 6f 73 74 20 49 44 20 28 73 65  ique host ID (se
259f0 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63  e below) and loc
25a00 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20  k.** proxy path 
25a10 61 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75  against the valu
25a20 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
25a30 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e   conch.  The con
25a40 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74  ch file is.** st
25a50 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ored in the same
25a60 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68   directory as th
25a70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25a80 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  and the file nam
25a90 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65  e.** is patterne
25aa0 64 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61  d after the data
25ab0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
25ac0 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d  s ".<databasenam
25ad0 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66  e>-conch"..** If
25ae0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
25af0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
25b00 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e 74 73  or it's contents
25b10 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68   do not match th
25b20 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e 64  e.** host ID and
25b30 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c 20  /or proxy path, 
25b40 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73  then the lock is
25b50 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61 6e   escalated to an
25b60 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f   exclusive.** lo
25b70 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63 68  ck and the conch
25b80 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69   file contents i
25b90 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74  s updated with t
25ba0 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 70  he host ID and p
25bb0 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64  roxy.** path and
25bc0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77   the lock is dow
25bd0 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73 68 61  ngraded to a sha
25be0 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20  red lock again. 
25bf0 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a   If the conch.**
25c00 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74   is held by anot
25c10 68 65 72 20 70 72 6f 63 65 73 73 20 28 77 69 74  her process (wit
25c20 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 29  h a shared lock)
25c30 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  , the exclusive 
25c40 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69  lock.** will fai
25c50 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53  l and SQLITE_BUS
25c60 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  Y is returned..*
25c70 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66  *.** The proxy f
25c80 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62  ile - a single-b
25c90 79 74 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  yte file used fo
25ca0 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20 66  r all advisory f
25cb0 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72  ile locks.** nor
25cc0 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74  mally taken on t
25cd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25ce0 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  .   This allows 
25cf0 66 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e 67  for safe sharing
25d00 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
25d10 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c  ase file for mul
25d20 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 6e  tiple readers an
25d30 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68 65  d writers on the
25d40 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74   same.** host (t
25d50 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65 73  he conch ensures
25d60 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20 75   that they all u
25d70 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 61  se the same loca
25d80 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a  l lock file)..**
25d90 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74  .** Requesting t
25da0 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f  he lock proxy do
25db0 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65  es not immediate
25dc0 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63  ly take the conc
25dd0 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79  h, it is.** only
25de0 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20   taken when the 
25df0 66 69 72 73 74 20 72 65 71 75 65 73 74 20 74 6f  first request to
25e00 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66   lock database f
25e10 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a  ile is made.  .*
25e20 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74  * This matches t
25e30 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20  he semantics of 
25e40 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20  the traditional 
25e50 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72  locking behavior
25e60 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69  , where.** openi
25e70 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ng a connection 
25e80 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69  to a database fi
25e90 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65  le does not take
25ea0 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a   a lock on it..*
25eb0 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63  * The shared loc
25ec0 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69  k and an open fi
25ed0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72  le descriptor ar
25ee0 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74  e maintained unt
25ef0 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65  il .** the conne
25f00 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74  ction to the dat
25f10 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e  abase is closed.
25f20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78   .**.** The prox
25f30 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c  y file and the l
25f40 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76  ock file are nev
25f50 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68  er deleted so th
25f60 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20  ey only need.** 
25f70 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 74 68  to be created th
25f80 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65  e first time the
25f90 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a  y are used..**.*
25fa0 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
25fb0 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d  options.** -----
25fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25fd0 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50  .**.**  SQLITE_P
25fe0 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
25ff0 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ING.**.**       
26000 44 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  Database files a
26010 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c  ccessed on non-l
26020 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
26030 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61  s are.**       a
26040 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e  utomatically con
26050 66 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78  figured for prox
26060 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20  y locking, lock 
26070 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20  files are.**    
26080 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74     named automat
26090 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65  ically using the
260a0 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a   same logic as.*
260b0 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c  *       PRAGMA l
260c0 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22  ock_proxy_file="
260d0 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a  :auto:".**    .*
260e0 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f  *  SQLITE_PROXY_
260f0 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  DEBUG.**.**     
26100 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f    Enables the lo
26110 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d  gging of error m
26120 65 73 73 61 67 65 73 20 64 75 72 69 6e 67 20 68  essages during h
26130 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20  ost id file.**  
26140 20 20 20 20 20 72 65 74 72 69 65 76 61 6c 20 61       retrieval a
26150 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a  nd creation.**.*
26160 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a  *  LOCKPROXYDIR.
26170 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72  **.**       Over
26180 72 69 64 65 73 20 74 68 65 20 64 65 66 61 75 6c  rides the defaul
26190 74 20 64 69 72 65 63 74 6f 72 79 20 75 73 65 64  t directory used
261a0 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20   for lock proxy 
261b0 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  files that.**   
261c0 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61 75      are named au
261d0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61 20  tomatically via 
261e0 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65 74  the ":auto:" set
261f0 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49  ting.**.**  SQLI
26200 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
26210 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a  DIR_PERMISSIONS.
26220 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72 6d  **.**       Perm
26230 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20 77  issions to use w
26240 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 64  hen creating a d
26250 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74 6f  irectory for sto
26260 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20  ring the.**     
26270 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c    lock proxy fil
26280 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77 68  es, only used wh
26290 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20  en LOCKPROXYDIR 
262a0 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20  is not set..**  
262b0 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20    .**    .** As 
262c0 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c  mentioned above,
262d0 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77   when compiled w
262e0 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45  ith SQLITE_PREFE
262f0 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c  R_PROXY_LOCKING,
26300 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20  .** setting the 
26310 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
26320 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 43  able SQLITE_FORC
26330 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20  E_PROXY_LOCKING 
26340 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72  to 1 will.** for
26350 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ce proxy locking
26360 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
26370 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20 66  every database f
26380 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20  ile opened, and 
26390 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20  0.** will force 
263a0 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79 20  automatic proxy 
263b0 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64 69  locking to be di
263c0 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64  sabled for all d
263d0 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73  atabase.** files
263e0 20 28 65 78 70 6c 69 63 69 74 79 20 63 61 6c 6c   (explicity call
263f0 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f 53  ing the SQLITE_S
26400 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
26410 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71   pragma or.** sq
26420 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  lite_file_contro
26430 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66 66  l API is not aff
26440 65 63 74 65 64 20 62 79 20 53 51 4c 49 54 45 5f  ected by SQLITE_
26450 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
26460 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ING)..*/../*.** 
26470 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
26480 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
26490 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69  on MacOSX .*/.#i
264a0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
264b0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
264c0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
264d0 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  YLE../*.** The p
264e0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
264f0 78 74 20 68 61 73 20 74 68 65 20 70 61 74 68 20  xt has the path 
26500 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74 75  and file structu
26510 72 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d 6f  res for the remo
26520 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c  te .** and local
26530 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e 20   proxy files in 
26540 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  it.*/.typedef st
26550 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ruct proxyLockin
26560 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f  gContext proxyLo
26570 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74  ckingContext;.st
26580 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ruct proxyLockin
26590 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69  gContext {.  uni
265a0 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
265b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;         /* Ope
265c0 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  n conch file */.
265d0 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c    char *conchFil
265e0 65 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f  ePath;         /
265f0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
26600 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  nch file */.  un
26610 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78  ixFile *lockProx
26620 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  y;         /* Op
26630 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  en proxy lock fi
26640 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f  le */.  char *lo
26650 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20 20  ckProxyPath;    
26660 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
26670 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  the proxy lock f
26680 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64  ile */.  char *d
26690 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
266a0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
266b0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
266c0 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c  /.  int conchHel
266d0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
266e0 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f 6e   /* 1 if the con
266f0 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20 69  ch is held, -1 i
26700 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20  f lockless */.  
26710 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67  void *oldLocking
26720 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20  Context;     /* 
26730 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67  Original locking
26740 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74 6f  context to resto
26750 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20  re on close */. 
26760 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
26770 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d  ods const *pOldM
26780 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72  ethod;     /* Or
26790 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f  iginal I/O metho
267a0 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a  ds for close */.
267b0 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70  };../* .** The p
267c0 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70  roxy lock file p
267d0 61 74 68 20 66 6f 72 20 74 68 65 20 64 61 74 61  ath for the data
267e0 62 61 73 65 20 61 74 20 64 62 50 61 74 68 20 69  base at dbPath i
267f0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c  s written into l
26800 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20  Path, .** which 
26810 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76 61  must point to va
26820 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d 65  lid, writable me
26830 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75 67  mory large enoug
26840 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c  h for a maxLen l
26850 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61  ength.** file pa
26860 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  th. .*/.static i
26870 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50  nt proxyGetLockP
26880 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ath(const char *
26890 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c 50  dbPath, char *lP
268a0 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c  ath, size_t maxL
268b0 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  en){.  int len;.
268c0 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69    int dbLen;.  i
268d0 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f  nt i;..#ifdef LO
268e0 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e  CKPROXYDIR.  len
268f0 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68   = strlcpy(lPath
26900 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20  , LOCKPROXYDIR, 
26910 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23  maxLen);.#else.#
26920 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57 49   ifdef _CS_DARWI
26930 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a  N_USER_TEMP_DIR.
26940 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f 6e    {.    if( !con
26950 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
26960 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c  USER_TEMP_DIR, l
26970 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b  Path, maxLen) ){
26980 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 34 28  .      OSTRACE4(
26990 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66 61  "GETLOCKPATH  fa
269a0 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25 64  iled %s errno=%d
269b0 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   pid=%d\n",.    
269c0 20 20 20 20 20 20 20 20 20 20 20 6c 50 61 74 68             lPath
269d0 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69 64 28  , errno, getpid(
269e0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
269f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
26a00 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  CK;.    }.    le
26a10 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74  n = strlcat(lPat
26a20 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73  h, "sqliteplocks
26a30 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a  ", maxLen);    .
26a40 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e    }.# else.  len
26a50 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68   = strlcpy(lPath
26a60 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65  , "/tmp/", maxLe
26a70 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  n);.# endif.#end
26a80 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b  if..  if( lPath[
26a90 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20  len-1]!='/' ){. 
26aa0 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74     len = strlcat
26ab0 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78  (lPath, "/", max
26ac0 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  Len);.  }.  .  /
26ad0 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20  * transform the 
26ae0 64 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69  db path to a uni
26af0 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a  que cache name *
26b00 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74  /.  dbLen = (int
26b10 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b  )strlen(dbPath);
26b20 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64  .  for( i=0; i<d
26b30 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37  bLen && (i+len+7
26b40 29 3c 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a  )<maxLen; i++){.
26b50 20 20 20 20 63 68 61 72 20 63 20 3d 20 64 62 50      char c = dbP
26b60 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74  ath[i];.    lPat
26b70 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27  h[i+len] = (c=='
26b80 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20  /')?'_':c;.  }. 
26b90 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c   lPath[i+len]='\
26ba0 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50  0';.  strlcat(lP
26bb0 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d  ath, ":auto:", m
26bc0 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43  axLen);.  OSTRAC
26bd0 45 33 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20  E3("GETLOCKPATH 
26be0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
26bf0 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c  =%s pid=%d\n", l
26c00 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 3b  Path, getpid());
26c10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
26c20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20  _OK;.}../* . ** 
26c30 43 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b  Creates the lock
26c40 20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69   file and any mi
26c50 73 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65  ssing directorie
26c60 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a  s in lockPath. *
26c70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
26c80 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68  xyCreateLockPath
26c90 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63  (const char *loc
26ca0 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c  kPath){.  int i,
26cb0 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66   len;.  char buf
26cc0 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
26cd0 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20  int start = 0;. 
26ce0 20 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50   .  assert(lockP
26cf0 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a  ath!=NULL);.  /*
26d00 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61   try to create a
26d10 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  ll the intermedi
26d20 61 74 65 20 64 69 72 65 63 74 6f 72 69 65 73 20  ate directories 
26d30 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29  */.  len = (int)
26d40 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29  strlen(lockPath)
26d50 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63  ;.  buf[0] = loc
26d60 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28  kPath[0];.  for(
26d70 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b   i=1; i<len; i++
26d80 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
26d90 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26  Path[i] == '/' &
26da0 26 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30  & (i - start > 0
26db0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e  ) ){.      /* on
26dc0 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66  ly mkdir if leaf
26dd0 20 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22   dir != "." or "
26de0 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20  /" or ".." */.  
26df0 20 20 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e      if( i-start>
26e00 32 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31  2 || (i-start==1
26e10 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21   && buf[start] !
26e20 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61  = '.' && buf[sta
26e30 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20  rt] != '/') .   
26e40 20 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72        || (i-star
26e50 74 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72  t==2 && buf[star
26e60 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66  t] != '.' && buf
26e70 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27  [start+1] != '.'
26e80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66  ) ){.        buf
26e90 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20  [i]='\0';.      
26ea0 20 20 69 66 28 20 6d 6b 64 69 72 28 62 75 66 2c    if( mkdir(buf,
26eb0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
26ec0 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
26ed0 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20  IONS) ){.       
26ee0 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f     int err=errno
26ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26f00 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a  err!=EEXIST ) {.
26f10 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52              OSTR
26f20 41 43 45 35 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE5("CREATELOCK
26f30 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65  PATH  FAILED cre
26f40 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20  ating %s, ".    
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f60 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63   "'%s' proxy loc
26f70 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
26f80 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
26f90 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73            buf, s
26fa0 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f  trerror(err), lo
26fb0 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29  ckPath, getpid()
26fc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
26fd0 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20  eturn err;.     
26fe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26ff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
27000 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a  tart=i+1;.    }.
27010 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63      buf[i] = loc
27020 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20  kPath[i];.  }.  
27030 4f 53 54 52 41 43 45 33 28 22 43 52 45 41 54 45  OSTRACE3("CREATE
27040 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20  LOCKPATH  proxy 
27050 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
27060 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68  =%d\n", lockPath
27070 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 72  , getpid());.  r
27080 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
27090 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 56  * Create a new V
270a0 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  FS file descript
270b0 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65  or (stored in me
270c0 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
270d0 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
270e0 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74  lloc) and open t
270f0 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70  he file named "p
27100 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65  ath" in the file
27110 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a   descriptor..**.
27120 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  ** The caller is
27130 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74   responsible not
27140 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e   only for closin
27150 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  g the file descr
27160 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73  iptor.** but als
27170 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  o for freeing th
27180 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  e memory associa
27190 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6c  ted with the fil
271a0 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f  e descriptor..*/
271b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
271c0 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
271d0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
271e0 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a  *path,        /*
271f0 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65   path for the ne
27200 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20  w unixFile */.  
27210 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46    unixFile **ppF
27220 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e  ile,       /* un
27230 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20 61  ixFile created a
27240 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 72  nd returned by r
27250 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  ef */.    int is
27260 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20  lockfile        
27270 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72     /* if non zer
27280 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77  o missing dirs w
27290 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a  ill be created *
272a0 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d  /.) {.  int fd =
272b0 20 2d 31 3b 0a 20 20 69 6e 74 20 64 69 72 66 64   -1;.  int dirfd
272c0 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c   = -1;.  unixFil
272d0 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  e *pNew;.  int r
272e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
272f0 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
27300 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
27310 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  T;.  sqlite3_vfs
27320 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74   dummyVfs;.  int
27330 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55   terrno = 0;.  U
27340 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
27350 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  used = NULL;..  
27360 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79 20  /* 1. first try 
27370 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
27380 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20  he file.  ** 2. 
27390 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61  if that fails, a
273a0 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63  nd this is a loc
273b0 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63  k file (not-conc
273c0 68 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67  h), try creating
273d0 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74  .  ** the parent
273e0 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64   directories and
273f0 20 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e   then try again.
27400 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74  .  ** 3. if that
27410 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f   fails, try to o
27420 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61  pen the file rea
27430 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65  d-only.  ** othe
27440 72 77 69 73 65 20 72 65 74 75 72 6e 20 42 55 53  rwise return BUS
27450 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29  Y (if lock file)
27460 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72   or CANTOPEN for
27470 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a   the conch file.
27480 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d    */.  pUnused =
27490 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28   findReusableFd(
274a0 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29  path, openFlags)
274b0 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64 20  ;.  if( pUnused 
274c0 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75  ){.    fd = pUnu
274d0 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65  sed->fd;.  }else
274e0 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  {.    pUnused = 
274f0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
27500 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29  izeof(*pUnused))
27510 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75 73  ;.    if( !pUnus
27520 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ed ){.      retu
27530 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
27540 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
27550 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20   fd<0 ){.    fd 
27560 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65  = open(path, ope
27570 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44  nFlags, SQLITE_D
27580 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
27590 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65  ISSIONS);.    te
275a0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
275b0 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72    if( fd<0 && er
275c0 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69  rno==ENOENT && i
275d0 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20  slockfile ){.   
275e0 20 20 20 69 66 28 20 70 72 6f 78 79 43 72 65 61     if( proxyCrea
275f0 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29  teLockPath(path)
27600 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   == SQLITE_OK ){
27610 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20 6f 70  .        fd = op
27620 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
27630 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  gs, SQLITE_DEFAU
27640 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
27650 4f 4e 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ONS);.      }.  
27660 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64    }.  }.  if( fd
27670 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c  <0 ){.    openFl
27680 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  ags = O_RDONLY;.
27690 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61      fd = open(pa
276a0 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53  th, openFlags, S
276b0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
276c0 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
276d0 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72  .    terrno = er
276e0 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  rno;.  }.  if( f
276f0 64 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  d<0 ){.    if( i
27700 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20  slockfile ){.   
27710 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27720 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
27730 20 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29   switch (terrno)
27740 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45 41   {.      case EA
27750 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65  CCES:.        re
27760 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
27770 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 49 4f  ;.      case EIO
27780 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  : .        retur
27790 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
277a0 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f  OCK; /* even tho
277b0 75 67 68 20 69 74 20 69 73 20 74 68 65 20 63 6f  ugh it is the co
277c0 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66  nch */.      def
277d0 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65  ault:.        re
277e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
277f0 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OPEN;.    }.  }.
27800 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69    .  pNew = (uni
27810 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f  xFile *)sqlite3_
27820 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
27830 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e 65  New));.  if( pNe
27840 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72  w==NULL ){.    r
27850 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
27860 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63  ;.    goto end_c
27870 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d  reate_proxy;.  }
27880 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20  .  memset(pNew, 
27890 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
278a0 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  le));.  pNew->op
278b0 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  enFlags = openFl
278c0 61 67 73 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e  ags;.  dummyVfs.
278d0 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64  pAppData = (void
278e0 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  *)&autolockIoFin
278f0 64 65 72 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e  der;.  pUnused->
27900 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73  fd = fd;.  pUnus
27910 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e  ed->flags = open
27920 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70  Flags;.  pNew->p
27930 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64  Unused = pUnused
27940 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c  ;.  .  rc = fill
27950 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d  InUnixFile(&dumm
27960 79 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c  yVfs, fd, dirfd,
27970 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
27980 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 2c 20 30  pNew, path, 0, 0
27990 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
279a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
279b0 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20  pFile = pNew;.  
279c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
279d0 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61  OK;.  }.end_crea
279e0 74 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20  te_proxy:    .  
279f0 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69  close(fd); /* si
27a00 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 66 64 20 69  lently leak fd i
27a10 66 20 65 72 72 6f 72 2c 20 77 65 27 72 65 20 61  f error, we're a
27a20 6c 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72 20  lready in error 
27a30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
27a40 65 28 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74  e(pNew);.  sqlit
27a50 65 33 5f 66 72 65 65 28 70 55 6e 75 73 65 64 29  e3_free(pUnused)
27a60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
27a70 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
27a80 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65  TEST./* simulate
27a90 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20   multiple hosts 
27aa0 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71  by creating uniq
27ab0 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70  ue hostid file p
27ac0 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  aths */.int sqli
27ad0 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d  te3_hostid_num =
27ae0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   0;.#endif..#def
27af0 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53 54 49 44  ine PROXY_HOSTID
27b00 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a 20 63 6f  LEN    16  /* co
27b10 6e 63 68 20 66 69 6c 65 20 68 6f 73 74 20 69 64  nch file host id
27b20 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 67   length */../* g
27b30 65 74 20 74 68 65 20 68 6f 73 74 20 49 44 20 76  et the host ID v
27b40 69 61 20 67 65 74 68 6f 73 74 75 75 69 64 28 29  ia gethostuuid()
27b50 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20 70  , pHostID must p
27b60 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f  oint to PROXY_HO
27b70 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65  STIDLEN .** byte
27b80 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d 65  s of writable me
27b90 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
27ba0 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74  int proxyGetHost
27bb0 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ID(unsigned char
27bc0 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a   *pHostID, int *
27bd0 70 45 72 72 6f 72 29 7b 0a 20 20 73 74 72 75 63  pError){.  struc
27be0 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65 6f  t timespec timeo
27bf0 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20  ut = {1, 0}; /* 
27c00 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f  1 sec timeout */
27c10 0a 20 20 0a 20 20 61 73 73 65 72 74 28 50 52 4f  .  .  assert(PRO
27c20 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20  XY_HOSTIDLEN == 
27c30 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29 29 3b  sizeof(uuid_t));
27c40 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f 73 74 49  .  memset(pHostI
27c50 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54  D, 0, PROXY_HOST
27c60 49 44 4c 45 4e 29 3b 0a 20 20 69 66 28 20 67 65  IDLEN);.  if( ge
27c70 74 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49  thostuuid(pHostI
27c80 44 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a  D, &timeout) ){.
27c90 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72      int err = er
27ca0 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 45 72  rno;.    if( pEr
27cb0 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a 70 45  ror ){.      *pE
27cc0 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20  rror = err;.    
27cd0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  }.    return SQL
27ce0 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 23  ITE_IOERR;.  }.#
27cf0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
27d00 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65 20  T.  /* simulate 
27d10 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62  multiple hosts b
27d20 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75  y creating uniqu
27d30 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61  e hostid file pa
27d40 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ths */.  if( sql
27d50 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20  ite3_hostid_num 
27d60 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f 73 74  != 0){.    pHost
27d70 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29 28 70  ID[0] = (char)(p
27d80 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63 68 61  HostID[0] + (cha
27d90 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  r)(sqlite3_hosti
27da0 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29 3b 0a  d_num & 0xFF));.
27db0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
27dc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27dd0 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 63  ;.}../* The conc
27de0 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  h file contains 
27df0 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f 73 74  the header, host
27e00 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c   id and lock fil
27e10 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66 69  e path. */.#defi
27e20 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45  ne PROXY_CONCHVE
27e30 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d 62  RSION 2   /* 1-b
27e40 79 74 65 20 68 65 61 64 65 72 2c 20 31 36 2d 62  yte header, 16-b
27e50 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70 61 74  yte host id, pat
27e60 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f  h */.#define PRO
27e70 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20 20 20  XY_HEADERLEN    
27e80 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c  1   /* conch fil
27e90 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20  e header length 
27ea0 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  */.#define PROXY
27eb0 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20 28 50  _PATHINDEX    (P
27ec0 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50  ROXY_HEADERLEN+P
27ed0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 0a  ROXY_HOSTIDLEN).
27ee0 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d 41  #define PROXY_MA
27ef0 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f 58  XCONCHLEN  (PROX
27f00 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58  Y_HEADERLEN+PROX
27f10 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58 50  Y_HOSTIDLEN+MAXP
27f20 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20  ATHLEN)../* .** 
27f30 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63 6f  Takes an open co
27f40 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69 65 73  nch file, copies
27f50 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 74 6f   the contents to
27f60 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e 64 20   a new path and 
27f70 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20 69  then moves .** i
27f80 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e 65 77  t back.  The new
27f90 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c 65 27  ly created file'
27fa0 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  s file descripto
27fb0 72 20 69 73 20 61 73 73 69 67 6e 65 64 20 74 6f  r is assigned to
27fc0 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66 69   the.** conch fi
27fd0 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  le structure and
27fe0 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72 69   finally the ori
27ff0 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c 65  ginal conch file
28000 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 0a   descriptor is .
28010 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65 74 75  ** closed.  Retu
28020 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75 63 63  rns zero if succ
28030 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69  essful..*/.stati
28040 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65 61 6b  c int proxyBreak
28050 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69  ConchLock(unixFi
28060 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f  le *pFile, uuid_
28070 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20 70  t myHostID){.  p
28080 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
28090 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
280a0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
280b0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
280c0 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78  Context; .  unix
280d0 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
280e0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
280f0 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74 68 5b  e;.  char tPath[
28100 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63  MAXPATHLEN];.  c
28110 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d 41  har buf[PROXY_MA
28120 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63 68  XCONCHLEN];.  ch
28130 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43 74 78  ar *cPath = pCtx
28140 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b  ->conchFilePath;
28150 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64 4c 65  .  size_t readLe
28160 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20  n = 0;.  size_t 
28170 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20 63  pathLen = 0;.  c
28180 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d 20 3d  har errmsg[64] =
28190 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20   "";.  int fd = 
281a0 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2d  -1;.  int rc = -
281b0 31 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65 20  1;..  /* create 
281c0 61 20 6e 65 77 20 70 61 74 68 20 62 79 20 72 65  a new path by re
281d0 70 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c 69  place the traili
281e0 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74 68  ng '-conch' with
281f0 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70   '-break' */.  p
28200 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79  athLen = strlcpy
28210 28 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20 4d  (tPath, cPath, M
28220 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66  AXPATHLEN);.  if
28230 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54  ( pathLen>MAXPAT
28240 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c  HLEN || pathLen<
28250 36 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72 6c  6 || .     (strl
28260 63 70 79 28 26 74 50 61 74 68 5b 70 61 74 68 4c  cpy(&tPath[pathL
28270 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20  en-5], "break", 
28280 36 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20 20  6) != 5) ){.    
28290 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20  sprintf(errmsg, 
282a0 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65 6e  "path error (len
282b0 20 25 64 29 22 2c 20 28 69 6e 74 29 70 61 74 68   %d)", (int)path
282c0 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  Len);.    goto e
282d0 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
282e0 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20  }.  /* read the 
282f0 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f  conch content */
28300 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 70 72 65  .  readLen = pre
28310 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ad(conchFile->h,
28320 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43   buf, PROXY_MAXC
28330 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69  ONCHLEN, 0);.  i
28340 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59  f( readLen<PROXY
28350 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20 20  _PATHINDEX ){.  
28360 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67    sprintf(errmsg
28370 2c 20 22 72 65 61 64 20 65 72 72 6f 72 20 28 6c  , "read error (l
28380 65 6e 20 25 64 29 22 2c 20 28 69 6e 74 29 72 65  en %d)", (int)re
28390 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  adLen);.    goto
283a0 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
283b0 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20 69    }.  /* write i
283c0 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65 6d  t out to the tem
283d0 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69 6c  porary break fil
283e0 65 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70 65 6e  e */.  fd = open
283f0 28 74 50 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c  (tPath, (O_RDWR|
28400 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c  O_CREAT|O_EXCL),
28410 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
28420 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
28430 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  );.  if( fd<0 ){
28440 0a 20 20 20 20 73 70 72 69 6e 74 66 28 65 72 72  .    sprintf(err
28450 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66 61 69  msg, "create fai
28460 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
28470 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
28480 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
28490 20 69 66 28 20 70 77 72 69 74 65 28 66 64 2c 20   if( pwrite(fd, 
284a0 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30 29  buf, readLen, 0)
284b0 20 21 3d 20 72 65 61 64 4c 65 6e 20 29 7b 0a 20   != readLen ){. 
284c0 20 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73     sprintf(errms
284d0 67 2c 20 22 77 72 69 74 65 20 66 61 69 6c 65 64  g, "write failed
284e0 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a   (%d)", errno);.
284f0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
28500 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66  aklock;.  }.  if
28510 28 20 72 65 6e 61 6d 65 28 74 50 61 74 68 2c 20  ( rename(tPath, 
28520 63 50 61 74 68 29 20 29 7b 0a 20 20 20 20 73 70  cPath) ){.    sp
28530 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 72  rintf(errmsg, "r
28540 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64  ename failed (%d
28550 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
28560 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
28570 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ck;.  }.  rc = 0
28580 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  ;.  fprintf(stde
28590 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65  rr, "broke stale
285a0 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20   lock on %s\n", 
285b0 63 50 61 74 68 29 3b 0a 20 20 63 6c 6f 73 65 28  cPath);.  close(
285c0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20  conchFile->h);. 
285d0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20   conchFile->h = 
285e0 66 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d  fd;.  conchFile-
285f0 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52  >openFlags = O_R
28600 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a  DWR | O_CREAT;..
28610 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20  end_breaklock:. 
28620 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
28630 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  f( fd>=0 ){.    
28640 20 20 75 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b    unlink(tPath);
28650 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29  .      close(fd)
28660 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
28670 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69  ntf(stderr, "fai
28680 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74 61  led to break sta
28690 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25  le lock on %s, %
286a0 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72 72  s\n", cPath, err
286b0 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  msg);.  }.  retu
286c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b  rn rc;.}../* Tak
286d0 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  e the requested 
286e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63  lock on the conc
286f0 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61 6b  h file and break
28700 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66   a stale lock if
28710 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64   the .** host id
28720 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61   matches..*/.sta
28730 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e  tic int proxyCon
28740 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20  chLock(unixFile 
28750 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d  *pFile, uuid_t m
28760 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63  yHostID, int loc
28770 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c  kType){.  proxyL
28780 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
28790 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
287a0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
287b0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
287c0 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt; .  unixFile 
287d0 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74  *conchFile = pCt
287e0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  x->conchFile;.  
287f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
28800 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65 73  OK;.  int nTries
28810 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 74   = 0;.  struct t
28820 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64  imespec conchMod
28830 54 69 6d 65 3b 0a 20 20 0a 20 20 64 6f 20 7b 0a  Time;.  .  do {.
28840 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
28850 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
28860 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
28870 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63  *)conchFile, loc
28880 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72 69  kType);.    nTri
28890 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20 72  es ++;.    if( r
288a0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
288b0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
288c0 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28 62  e lock failed (b
288d0 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20 31  usy):.       * 1
288e0 73 74 20 74 72 79 3a 20 67 65 74 20 74 68 65 20  st try: get the 
288f0 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65 20  mod time of the 
28900 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35 73  conch, wait 0.5s
28910 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
28920 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74 72  .       * 2nd tr
28930 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20 6d  y: fail if the m
28940 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64 20  od time changed 
28950 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20 64 69  or host id is di
28960 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a 20  fferent, wait . 
28970 20 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20        *         
28980 20 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79    10 sec and try
28990 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a 20   again.       * 
289a0 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20 74  3rd try: break t
289b0 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20 74  he lock unless t
289c0 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73 20  he mod time has 
289d0 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20 20  changed..       
289e0 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
289f0 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20  stat buf;.      
28a00 69 66 28 20 66 73 74 61 74 28 63 6f 6e 63 68 46  if( fstat(conchF
28a10 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b  ile->h, &buf) ){
28a20 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
28a30 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
28a40 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
28a50 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
28a60 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
28a70 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54     .      if( nT
28a80 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ries==1 ){.     
28a90 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20     conchModTime 
28aa0 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70  = buf.st_mtimesp
28ab0 65 63 3b 0a 20 20 20 20 20 20 20 20 75 73 6c 65  ec;.        usle
28ac0 65 70 28 35 30 30 30 30 30 29 3b 20 2f 2a 20 77  ep(500000); /* w
28ad0 61 69 74 20 30 2e 35 20 73 65 63 20 61 6e 64 20  ait 0.5 sec and 
28ae0 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61  try the lock aga
28af0 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  in*/.        con
28b00 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 7d  tinue;  .      }
28b10 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
28b20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20 20 20 20  nTries>1 );.    
28b30 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69    if( conchModTi
28b40 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75 66  me.tv_sec != buf
28b50 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76  .st_mtimespec.tv
28b60 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20 20  _sec || .       
28b70 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74    conchModTime.t
28b80 76 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74  v_nsec != buf.st
28b90 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73  _mtimespec.tv_ns
28ba0 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ec ){.        re
28bb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
28bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28bd0 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65  .      if( nTrie
28be0 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20 20 20  s==2 ){  .      
28bf0 20 20 63 68 61 72 20 74 42 75 66 5b 50 52 4f 58    char tBuf[PROX
28c00 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  Y_MAXCONCHLEN];.
28c10 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20          int len 
28c20 3d 20 70 72 65 61 64 28 63 6f 6e 63 68 46 69 6c  = pread(conchFil
28c30 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f 58  e->h, tBuf, PROX
28c40 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30  Y_MAXCONCHLEN, 0
28c50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
28c60 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en<0 ){.        
28c70 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
28c80 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
28c90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
28ca0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
28cb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28cc0 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58 59 5f    if( len>PROXY_
28cd0 50 41 54 48 49 4e 44 45 58 20 26 26 20 74 42 75  PATHINDEX && tBu
28ce0 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52 4f 58  f[0]==(char)PROX
28cf0 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 29 7b  Y_CONCHVERSION){
28d00 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f  .          /* do
28d10 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  n't break the lo
28d20 63 6b 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  ck if the host i
28d30 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20  d doesn't match 
28d40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
28d50 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66   0!=memcmp(&tBuf
28d60 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
28d70 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f  ], myHostID, PRO
28d80 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b  XY_HOSTIDLEN) ){
28d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
28da0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
28db0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28dc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28dd0 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62        /* don't b
28de0 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  reak the lock on
28df0 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 61   short read or a
28e00 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63   version mismatc
28e10 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  h */.          r
28e20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
28e30 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
28e40 20 20 20 20 20 75 73 6c 65 65 70 28 31 30 30 30       usleep(1000
28e50 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 31  0000); /* wait 1
28e60 30 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68  0 sec and try th
28e70 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a 2f 0a  e lock again */.
28e80 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
28e90 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
28ea0 20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20   .      assert( 
28eb0 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20 20 20  nTries==3 );.   
28ec0 20 20 20 69 66 28 20 30 3d 3d 70 72 6f 78 79 42     if( 0==proxyB
28ed0 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70 46  reakConchLock(pF
28ee0 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29 20 29  ile, myHostID) )
28ef0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
28f00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
28f10 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
28f20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
28f30 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
28f40 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
28f50 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
28f60 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
28f70 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ile, SHARED_LOCK
28f80 29 3b 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  );          .   
28f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
28fa0 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20  f( !rc ){.      
28fb0 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
28fc0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
28fd0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
28fe0 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63  *)conchFile, loc
28ff0 6b 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20  kType);.        
29000 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
29010 20 20 7d 20 77 68 69 6c 65 28 20 72 63 3d 3d 53    } while( rc==S
29020 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 6e 54  QLITE_BUSY && nT
29030 72 69 65 73 3c 33 20 29 3b 0a 20 20 0a 20 20 72  ries<3 );.  .  r
29040 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
29050 54 61 6b 65 73 20 74 68 65 20 63 6f 6e 63 68 20  Takes the conch 
29060 62 79 20 74 61 6b 69 6e 67 20 61 20 73 68 61 72  by taking a shar
29070 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 64  ed lock and read
29080 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 63 6f   the contents co
29090 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b  nch, if .** lock
290a0 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  Path is non-NULL
290b0 2c 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  , the host ID an
290c0 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  d lock file path
290d0 20 6d 75 73 74 20 6d 61 74 63 68 2e 20 20 41 20   must match.  A 
290e0 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74  NULL .** lockPat
290f0 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  h means that the
29100 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20 74 68 65   lockPath in the
29110 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c   conch file will
29120 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20   be used if the 
29130 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20 6d 61 74  .** host IDs mat
29140 63 68 2c 20 6f 72 20 61 20 6e 65 77 20 6c 6f 63  ch, or a new loc
29150 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 67  k path will be g
29160 65 6e 65 72 61 74 65 64 20 61 75 74 6f 6d 61 74  enerated automat
29170 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20 77  ically .** and w
29180 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63 6f  ritten to the co
29190 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  nch file..*/.sta
291a0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 61 6b  tic int proxyTak
291b0 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20  eConch(unixFile 
291c0 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72 6f 78 79  *pFile){.  proxy
291d0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
291e0 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
291f0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
29200 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
29210 65 78 74 3b 20 0a 20 20 0a 20 20 69 66 28 20 70  ext; .  .  if( p
29220 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 21 3d  Ctx->conchHeld!=
29230 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
29240 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
29250 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  se{.    unixFile
29260 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
29270 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
29280 20 20 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74     uuid_t myHost
29290 49 44 3b 0a 20 20 20 20 69 6e 74 20 70 45 72 72  ID;.    int pErr
292a0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  or = 0;.    char
292b0 20 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 4d   readBuf[PROXY_M
292c0 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20  AXCONCHLEN];.   
292d0 20 63 68 61 72 20 6c 6f 63 6b 50 61 74 68 5b 4d   char lockPath[M
292e0 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20  AXPATHLEN];.    
292f0 63 68 61 72 20 2a 74 65 6d 70 4c 6f 63 6b 50 61  char *tempLockPa
29300 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  th = NULL;.    i
29310 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
29320 4b 3b 0a 20 20 20 20 69 6e 74 20 63 72 65 61 74  K;.    int creat
29330 65 43 6f 6e 63 68 20 3d 20 30 3b 0a 20 20 20 20  eConch = 0;.    
29340 69 6e 74 20 68 6f 73 74 49 64 4d 61 74 63 68 20  int hostIdMatch 
29350 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 61  = 0;.    int rea
29360 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e  dLen = 0;.    in
29370 74 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68  t tryOldLockPath
29380 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6f   = 0;.    int fo
29390 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d  rceNewLockPath =
293a0 20 30 3b 0a 20 20 20 20 0a 20 20 20 20 4f 53 54   0;.    .    OST
293b0 52 41 43 45 34 28 22 54 41 4b 45 43 4f 4e 43 48  RACE4("TAKECONCH
293c0 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
293d0 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %d\n", conchFile
293e0 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
293f0 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f    (pCtx->lockPro
29400 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c  xyPath ? pCtx->l
29410 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22  ockProxyPath : "
29420 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64  :auto:"), getpid
29430 28 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70  ());..    rc = p
29440 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 6d 79  roxyGetHostID(my
29450 48 6f 73 74 49 44 2c 20 26 70 45 72 72 6f 72 29  HostID, &pError)
29460 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78  ;.    if( (rc&0x
29470 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  ff)==SQLITE_IOER
29480 52 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  R ){.      pFile
29490 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 70 45  ->lastErrno = pE
294a0 72 72 6f 72 3b 0a 20 20 20 20 20 20 67 6f 74 6f  rror;.      goto
294b0 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
294c0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70      }.    rc = p
294d0 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46  roxyConchLock(pF
294e0 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53  ile, myHostID, S
294f0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
29500 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29510 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
29520 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
29530 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61      }.    /* rea
29540 64 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 63  d the existing c
29550 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20  onch file */.   
29560 20 72 65 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41   readLen = seekA
29570 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c 65  ndRead((unixFile
29580 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20  *)conchFile, 0, 
29590 72 65 61 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d  readBuf, PROXY_M
295a0 41 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20 20  AXCONCHLEN);.   
295b0 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 30 20 29   if( readLen<0 )
295c0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65  {.      /* I/O e
295d0 72 72 6f 72 3a 20 6c 61 73 74 45 72 72 6e 6f 20  rror: lastErrno 
295e0 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65  set by seekAndRe
295f0 61 64 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c  ad */.      pFil
29600 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63  e->lastErrno = c
29610 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72  onchFile->lastEr
29620 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
29630 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
29640 44 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  D;.      goto en
29650 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
29660 20 7d 65 6c 73 65 20 69 66 28 20 72 65 61 64 4c   }else if( readL
29670 65 6e 3c 3d 28 50 52 4f 58 59 5f 48 45 41 44 45  en<=(PROXY_HEADE
29680 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49  RLEN+PROXY_HOSTI
29690 44 4c 45 4e 29 20 7c 7c 20 0a 20 20 20 20 20 20  DLEN) || .      
296a0 20 20 20 20 20 20 20 72 65 61 64 42 75 66 5b 30         readBuf[0
296b0 5d 21 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43  ]!=(char)PROXY_C
296c0 4f 4e 43 48 56 45 52 53 49 4f 4e 20 29 7b 0a 20  ONCHVERSION ){. 
296d0 20 20 20 20 20 2f 2a 20 61 20 73 68 6f 72 74 20       /* a short 
296e0 72 65 61 64 20 6f 72 20 76 65 72 73 69 6f 6e 20  read or version 
296f0 66 6f 72 6d 61 74 20 6d 69 73 6d 61 74 63 68 20  format mismatch 
29700 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f  means we need to
29710 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 0a 20   create a new . 
29720 20 20 20 20 20 2a 2a 20 63 6f 6e 63 68 20 66 69       ** conch fi
29730 6c 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  le. .      */.  
29740 20 20 20 20 63 72 65 61 74 65 43 6f 6e 63 68 20      createConch 
29750 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  = 1;.    }.    /
29760 2a 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64  * if the host id
29770 20 6d 61 74 63 68 65 73 20 61 6e 64 20 74 68 65   matches and the
29780 20 6c 6f 63 6b 20 70 61 74 68 20 61 6c 72 65 61   lock path alrea
29790 64 79 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  dy exists in the
297a0 20 63 6f 6e 63 68 0a 20 20 20 20 2a 2a 20 77 65   conch.    ** we
297b0 27 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  'll try to use t
297c0 68 65 20 70 61 74 68 20 74 68 65 72 65 2c 20 69  he path there, i
297d0 66 20 77 65 20 63 61 6e 27 74 20 6f 70 65 6e 20  f we can't open 
297e0 74 68 61 74 20 70 61 74 68 2c 20 77 65 27 6c 6c  that path, we'll
297f0 20 0a 20 20 20 20 2a 2a 20 72 65 74 72 79 20 77   .    ** retry w
29800 69 74 68 20 61 20 6e 65 77 20 61 75 74 6f 2d 67  ith a new auto-g
29810 65 6e 65 72 61 74 65 64 20 70 61 74 68 20 0a 20  enerated path . 
29820 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 20 2f     */.    do { /
29830 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65  * in case we nee
29840 64 20 74 6f 20 74 72 79 20 61 67 61 69 6e 20 66  d to try again f
29850 6f 72 20 61 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d  or an :auto: nam
29860 65 64 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  ed lock file */.
29870 0a 20 20 20 20 20 20 69 66 28 20 21 63 72 65 61  .      if( !crea
29880 74 65 43 6f 6e 63 68 20 26 26 20 21 66 6f 72 63  teConch && !forc
29890 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 29 7b 0a  eNewLockPath ){.
298a0 20 20 20 20 20 20 20 20 68 6f 73 74 49 64 4d 61          hostIdMa
298b0 74 63 68 20 3d 20 21 6d 65 6d 63 6d 70 28 26 72  tch = !memcmp(&r
298c0 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 48 45 41  eadBuf[PROXY_HEA
298d0 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49  DERLEN], myHostI
298e0 44 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  D, .            
298f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29900 20 20 20 20 20 20 50 52 4f 58 59 5f 48 4f 53 54        PROXY_HOST
29910 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20  IDLEN);.        
29920 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  /* if the conch 
29930 68 61 73 20 64 61 74 61 20 63 6f 6d 70 61 72 65  has data compare
29940 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f   the contents */
29950 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
29960 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
29970 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  h ){.          /
29980 2a 20 66 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64  * for auto-named
29990 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65   local lock file
299a0 2c 20 6a 75 73 74 20 63 68 65 63 6b 20 74 68 65  , just check the
299b0 20 68 6f 73 74 20 49 44 20 61 6e 64 20 77 65 27   host ID and we'
299c0 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ll.           **
299d0 20 75 73 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c   use the local l
299e0 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 74 68  ock file path th
299f0 61 74 27 73 20 61 6c 72 65 61 64 79 20 69 6e 20  at's already in 
29a00 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20  there.          
29a10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
29a20 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20 29 7b  ( hostIdMatch ){
29a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a  .            siz
29a40 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 28 72  e_t pathLen = (r
29a50 65 61 64 4c 65 6e 20 2d 20 50 52 4f 58 59 5f 50  eadLen - PROXY_P
29a60 41 54 48 49 4e 44 45 58 29 3b 0a 20 20 20 20 20  ATHINDEX);.     
29a70 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
29a80 20 20 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e      if( pathLen>
29a90 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20  =MAXPATHLEN ){. 
29aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74               pat
29ab0 68 4c 65 6e 3d 4d 41 58 50 41 54 48 4c 45 4e 2d  hLen=MAXPATHLEN-
29ac0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
29ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
29ae0 63 70 79 28 6c 6f 63 6b 50 61 74 68 2c 20 26 72  cpy(lockPath, &r
29af0 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41 54  eadBuf[PROXY_PAT
29b00 48 49 4e 44 45 58 5d 2c 20 70 61 74 68 4c 65 6e  HINDEX], pathLen
29b10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  );.            l
29b20 6f 63 6b 50 61 74 68 5b 70 61 74 68 4c 65 6e 5d  ockPath[pathLen]
29b30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
29b40 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d    tempLockPath =
29b50 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20   lockPath;.     
29b60 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63         tryOldLoc
29b70 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20 20  kPath = 1;.     
29b80 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65         /* create
29b90 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c   a copy of the l
29ba0 6f 63 6b 20 70 61 74 68 20 69 66 20 74 68 65 20  ock path if the 
29bb0 63 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 2a  conch is taken *
29bc0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  /.            go
29bd0 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
29be0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
29bf0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
29c00 68 6f 73 74 49 64 4d 61 74 63 68 0a 20 20 20 20  hostIdMatch.    
29c10 20 20 20 20 20 20 20 20 20 20 20 26 26 20 21 73             && !s
29c20 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63  trncmp(pCtx->loc
29c30 6b 50 72 6f 78 79 50 61 74 68 2c 20 26 72 65 61  kProxyPath, &rea
29c40 64 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49  dBuf[PROXY_PATHI
29c50 4e 44 45 58 5d 2c 0a 20 20 20 20 20 20 20 20 20  NDEX],.         
29c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c70 20 20 72 65 61 64 4c 65 6e 2d 50 52 4f 58 59 5f    readLen-PROXY_
29c80 50 41 54 48 49 4e 44 45 58 29 0a 20 20 20 20 20  PATHINDEX).     
29c90 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
29ca0 2f 2a 20 63 6f 6e 63 68 20 68 6f 73 74 20 61 6e  /* conch host an
29cb0 64 20 6c 6f 63 6b 20 70 61 74 68 20 6d 61 74 63  d lock path matc
29cc0 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67  h */.          g
29cd0 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
29ce0 68 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  h; .        }.  
29cf0 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
29d00 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e     /* if the con
29d10 63 68 20 69 73 6e 27 74 20 77 72 69 74 61 62 6c  ch isn't writabl
29d20 65 20 61 6e 64 20 64 6f 65 73 6e 27 74 20 6d 61  e and doesn't ma
29d30 74 63 68 2c 20 77 65 20 63 61 6e 27 74 20 74 61  tch, we can't ta
29d40 6b 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 69  ke it */.      i
29d50 66 28 20 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f  f( (conchFile->o
29d60 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29  penFlags&O_RDWR)
29d70 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20   == 0 ){.       
29d80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
29d90 59 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  Y;.        goto 
29da0 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
29db0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
29dc0 20 20 20 20 2f 2a 20 65 69 74 68 65 72 20 74 68      /* either th
29dd0 65 20 63 6f 6e 63 68 20 64 69 64 6e 27 74 20 6d  e conch didn't m
29de0 61 74 63 68 20 6f 72 20 77 65 20 6e 65 65 64 20  atch or we need 
29df0 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
29e00 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  one */.      if(
29e10 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   !pCtx->lockProx
29e20 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  yPath ){.       
29e30 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74   proxyGetLockPat
29e40 68 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20  h(pCtx->dbPath, 
29e50 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54  lockPath, MAXPAT
29e60 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 74  HLEN);.        t
29e70 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f  empLockPath = lo
29e80 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20  ckPath;.        
29e90 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70 79  /* create a copy
29ea0 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74   of the lock pat
29eb0 68 20 5f 6f 6e 6c 79 5f 20 69 66 20 74 68 65 20  h _only_ if the 
29ec0 63 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 2a  conch is taken *
29ed0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
29ee0 0a 20 20 20 20 20 20 2f 2a 20 75 70 64 61 74 65  .      /* update
29ef0 20 63 6f 6e 63 68 20 77 69 74 68 20 68 6f 73 74   conch with host
29f00 20 61 6e 64 20 70 61 74 68 20 28 74 68 69 73 20   and path (this 
29f10 77 69 6c 6c 20 66 61 69 6c 20 69 66 20 6f 74 68  will fail if oth
29f20 65 72 20 70 72 6f 63 65 73 73 0a 20 20 20 20 20  er process.     
29f30 20 2a 2a 20 68 61 73 20 61 20 73 68 61 72 65 64   ** has a shared
29f40 20 6c 6f 63 6b 20 61 6c 72 65 61 64 79 29 2c 20   lock already), 
29f50 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d  if the host id m
29f60 61 74 63 68 65 73 2c 20 75 73 65 20 74 68 65 20  atches, use the 
29f70 62 69 67 0a 20 20 20 20 20 20 2a 2a 20 73 74 69  big.      ** sti
29f80 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
29f90 20 20 20 66 75 74 69 6d 65 73 28 63 6f 6e 63 68     futimes(conch
29fa0 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a  File->h, NULL);.
29fb0 20 20 20 20 20 20 69 66 28 20 68 6f 73 74 49 64        if( hostId
29fc0 4d 61 74 63 68 20 26 26 20 21 63 72 65 61 74 65  Match && !create
29fd0 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Conch ){.       
29fe0 20 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 2d 3e   if( conchFile->
29ff0 70 4c 6f 63 6b 20 26 26 20 63 6f 6e 63 68 46 69  pLock && conchFi
2a000 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31  le->pLock->cnt>1
2a010 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2a020 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
2a030 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
2a040 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
2a050 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
2a060 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61             ** sa
2a070 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
2a080 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
2a090 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
2a0a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2a0b0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
2a0c0 20 20 7d 20 65 6c 73 65 20 7b 20 20 20 20 20 20    } else {      
2a0d0 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 72      .          r
2a0e0 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f  c = proxyConchLo
2a0f0 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
2a100 49 44 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ID, EXCLUSIVE_LO
2a110 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  CK);.        }. 
2a120 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a130 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
2a140 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
2a150 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
2a160 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58 43  *)conchFile, EXC
2a170 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
2a180 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2a190 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a1a0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 77 72  .        char wr
2a1b0 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
2a1c0 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  MAXCONCHLEN];.  
2a1d0 20 20 20 20 20 20 69 6e 74 20 77 72 69 74 65 53        int writeS
2a1e0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ize = 0;.       
2a1f0 20 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 42   .        writeB
2a200 75 66 66 65 72 5b 30 5d 20 3d 20 28 63 68 61 72  uffer[0] = (char
2a210 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53  )PROXY_CONCHVERS
2a220 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ION;.        mem
2a230 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72  cpy(&writeBuffer
2a240 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
2a250 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f  ], myHostID, PRO
2a260 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20  XY_HOSTIDLEN);. 
2a270 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d         if( pCtx-
2a280 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 21 3d  >lockProxyPath!=
2a290 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
2a2a0 20 20 73 74 72 6c 63 70 79 28 26 77 72 69 74 65    strlcpy(&write
2a2b0 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54  Buffer[PROXY_PAT
2a2c0 48 49 4e 44 45 58 5d 2c 20 70 43 74 78 2d 3e 6c  HINDEX], pCtx->l
2a2d0 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 4d 41  ockProxyPath, MA
2a2e0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20  XPATHLEN);.     
2a2f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a300 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72 69      strlcpy(&wri
2a310 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50  teBuffer[PROXY_P
2a320 41 54 48 49 4e 44 45 58 5d 2c 20 74 65 6d 70 4c  ATHINDEX], tempL
2a330 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48  ockPath, MAXPATH
2a340 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LEN);.        }.
2a350 20 20 20 20 20 20 20 20 77 72 69 74 65 53 69 7a          writeSiz
2a360 65 20 3d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e  e = PROXY_PATHIN
2a370 44 45 58 20 2b 20 73 74 72 6c 65 6e 28 26 77 72  DEX + strlen(&wr
2a380 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
2a390 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a 20 20 20  PATHINDEX]);.   
2a3a0 20 20 20 20 20 66 74 72 75 6e 63 61 74 65 28 63       ftruncate(c
2a3b0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 77 72 69  onchFile->h, wri
2a3c0 74 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  teSize);.       
2a3d0 20 72 63 20 3d 20 75 6e 69 78 57 72 69 74 65 28   rc = unixWrite(
2a3e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
2a3f0 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72 69 74 65  conchFile, write
2a400 42 75 66 66 65 72 2c 20 77 72 69 74 65 53 69 7a  Buffer, writeSiz
2a410 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66  e, 0);.        f
2a420 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  sync(conchFile->
2a430 68 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  h);.        /* I
2a440 66 20 77 65 20 63 72 65 61 74 65 64 20 61 20 6e  f we created a n
2a450 65 77 20 63 6f 6e 63 68 20 66 69 6c 65 20 28 6e  ew conch file (n
2a460 6f 74 20 6a 75 73 74 20 75 70 64 61 74 65 64 20  ot just updated 
2a470 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2a480 61 20 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 76  a .         ** v
2a490 61 6c 69 64 20 63 6f 6e 63 68 20 66 69 6c 65 29  alid conch file)
2a4a0 2c 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74  , try to match t
2a4b0 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  he permissions o
2a4c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
2a4d0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2a4e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a4f0 54 45 5f 4f 4b 20 26 26 20 63 72 65 61 74 65 43  TE_OK && createC
2a500 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  onch ){.        
2a510 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
2a520 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  f;.          int
2a530 20 65 72 72 20 3d 20 66 73 74 61 74 28 70 46 69   err = fstat(pFi
2a540 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20  le->h, &buf);.  
2a550 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 3d          if( err=
2a560 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2a570 20 20 6d 6f 64 65 5f 74 20 63 6d 6f 64 65 20 3d    mode_t cmode =
2a580 20 62 75 66 2e 73 74 5f 6d 6f 64 65 26 28 53 5f   buf.st_mode&(S_
2a590 49 52 55 53 52 7c 53 5f 49 57 55 53 52 20 7c 20  IRUSR|S_IWUSR | 
2a5a0 53 5f 49 52 47 52 50 7c 53 5f 49 57 47 52 50 20  S_IRGRP|S_IWGRP 
2a5b0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
2a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5d0 20 20 20 20 20 20 20 20 20 20 53 5f 49 52 4f 54            S_IROT
2a5e0 48 7c 53 5f 49 57 4f 54 48 29 3b 0a 20 20 20 20  H|S_IWOTH);.    
2a5f0 20 20 20 20 20 20 20 20 2f 2a 20 74 72 79 20 74          /* try t
2a600 6f 20 6d 61 74 63 68 20 74 68 65 20 64 61 74 61  o match the data
2a610 62 61 73 65 20 66 69 6c 65 20 52 2f 57 20 70 65  base file R/W pe
2a620 72 6d 69 73 73 69 6f 6e 73 2c 20 69 67 6e 6f 72  rmissions, ignor
2a630 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a 23 69 66  e failure */.#if
2a640 6e 64 65 66 20 53 51 4c 49 54 45 5f 50 52 4f 58  ndef SQLITE_PROX
2a650 59 5f 44 45 42 55 47 0a 20 20 20 20 20 20 20 20  Y_DEBUG.        
2a660 20 20 20 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68      fchmod(conch
2a670 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b  File->h, cmode);
2a680 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
2a690 20 20 20 69 66 28 20 66 63 68 6d 6f 64 28 63 6f     if( fchmod(co
2a6a0 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64  nchFile->h, cmod
2a6b0 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
2a6c0 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20         int code 
2a6d0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
2a6e0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
2a6f0 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25  tderr, "fchmod %
2a700 6f 20 46 41 49 4c 45 44 20 77 69 74 68 20 25 64  o FAILED with %d
2a710 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
2a720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d                cm
2a730 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74 72 65 72  ode, code, strer
2a740 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20 20 20  ror(code));.    
2a750 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
2a760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
2a770 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2a780 66 63 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44  fchmod %o SUCCED
2a790 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20 20  ED\n",cmode);.  
2a7a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a7b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a7c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64           int cod
2a7d0 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  e = errno;.     
2a7e0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
2a7f0 74 64 65 72 72 2c 20 22 53 54 41 54 20 46 41 49  tderr, "STAT FAI
2a800 4c 45 44 5b 25 64 5d 20 77 69 74 68 20 25 64 20  LED[%d] with %d 
2a810 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  %s\n", .        
2a820 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 2c              err,
2a830 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28   code, strerror(
2a840 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20  code));.#endif. 
2a850 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a860 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2a870 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d     conchFile->pM
2a880 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
2a890 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
2a8a0 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  nchFile, SHARED_
2a8b0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20 20  LOCK);.      .  
2a8c0 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a    end_takeconch:
2a8d0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 32 28  .      OSTRACE2(
2a8e0 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f  "TRANSPROXY: CLO
2a8f0 53 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  SE  %d\n", pFile
2a900 2d 3e 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ->h);.      if( 
2a910 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2a920 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67   pFile->openFlag
2a930 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  s ){.        if(
2a940 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a   pFile->h>=0 ){.
2a950 23 69 66 64 65 66 20 53 54 52 49 43 54 5f 43 4c  #ifdef STRICT_CL
2a960 4f 53 45 5f 45 52 52 4f 52 0a 20 20 20 20 20 20  OSE_ERROR.      
2a970 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 46      if( close(pF
2a980 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20 20 20  ile->h) ){.     
2a990 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
2a9a0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
2a9b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2a9c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2a9d0 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 20 20  _CLOSE;.        
2a9e0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
2a9f0 20 20 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d      close(pFile-
2aa00 3e 68 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79  >h); /* silently
2aa10 20 6c 65 61 6b 20 66 64 20 69 66 20 66 61 69 6c   leak fd if fail
2aa20 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   */.#endif.     
2aa30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 69     }.        pFi
2aa40 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20  le->h = -1;.    
2aa50 20 20 20 20 69 6e 74 20 66 64 20 3d 20 6f 70 65      int fd = ope
2aa60 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20  n(pCtx->dbPath, 
2aa70 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  pFile->openFlags
2aa80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2aa90 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
2aaa0 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
2aab0 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20  ISSIONS);.      
2aac0 20 20 4f 53 54 52 41 43 45 32 28 22 54 52 41 4e    OSTRACE2("TRAN
2aad0 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64  SPROXY: OPEN  %d
2aae0 5c 6e 22 2c 20 66 64 29 3b 0a 20 20 20 20 20 20  \n", fd);.      
2aaf0 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20    if( fd>=0 ){. 
2ab00 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
2ab10 68 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 20 20  h = fd;.        
2ab20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2ab30 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f   rc=SQLITE_CANTO
2ab40 50 45 4e 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 42  PEN; /* SQLITE_B
2ab50 55 53 59 3f 20 70 72 6f 78 79 54 61 6b 65 43 6f  USY? proxyTakeCo
2ab60 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20 20 20 20  nch called.     
2ab70 20 20 20 20 20 20 64 75 72 69 6e 67 20 6c 6f 63        during loc
2ab80 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  king */.        
2ab90 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2aba0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2abb0 4b 20 26 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b  K && !pCtx->lock
2abc0 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 20  Proxy ){.       
2abd0 20 63 68 61 72 20 2a 70 61 74 68 20 3d 20 74 65   char *path = te
2abe0 6d 70 4c 6f 63 6b 50 61 74 68 20 3f 20 74 65 6d  mpLockPath ? tem
2abf0 70 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43 74 78  pLockPath : pCtx
2ac00 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b  ->lockProxyPath;
2ac10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72  .        rc = pr
2ac20 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c  oxyCreateUnixFil
2ac30 65 28 70 61 74 68 2c 20 26 70 43 74 78 2d 3e 6c  e(path, &pCtx->l
2ac40 6f 63 6b 50 72 6f 78 79 2c 20 31 29 3b 0a 20 20  ockProxy, 1);.  
2ac50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2ac60 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
2ac70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 74  QLITE_NOMEM && t
2ac80 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 29 7b  ryOldLockPath ){
2ac90 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77 65  .          /* we
2aca0 20 63 6f 75 6c 64 6e 27 74 20 63 72 65 61 74 65   couldn't create
2acb0 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
2acc0 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6f 6c  file with the ol
2acd0 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  d lock file path
2ace0 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  .           ** s
2acf0 6f 20 74 72 79 20 61 67 61 69 6e 20 76 69 61 20  o try again via 
2ad00 61 75 74 6f 2d 6e 61 6d 69 6e 67 20 0a 20 20 20  auto-naming .   
2ad10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2ad20 20 20 20 20 20 66 6f 72 63 65 4e 65 77 4c 6f 63       forceNewLoc
2ad30 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20 20  kPath = 1;.     
2ad40 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50       tryOldLockP
2ad50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ath = 0;.       
2ad60 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20     continue; /* 
2ad70 67 6f 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  go back to the d
2ad80 6f 20 7b 7d 20 77 68 69 6c 65 20 73 74 61 72 74  o {} while start
2ad90 20 70 6f 69 6e 74 2c 20 74 72 79 20 61 67 61 69   point, try agai
2ada0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  n */.        }. 
2adb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2adc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2add0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
2ade0 64 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  d to make a copy
2adf0 20 6f 66 20 70 61 74 68 20 69 66 20 77 65 20 65   of path if we e
2ae00 78 74 72 61 63 74 65 64 20 74 68 65 20 76 61 6c  xtracted the val
2ae10 75 65 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66  ue.         ** f
2ae20 72 6f 6d 20 74 68 65 20 63 6f 6e 63 68 20 66 69  rom the conch fi
2ae30 6c 65 20 6f 72 20 74 68 65 20 70 61 74 68 20 77  le or the path w
2ae40 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20  as allocated on 
2ae50 74 68 65 20 73 74 61 63 6b 0a 20 20 20 20 20 20  the stack.      
2ae60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2ae70 28 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 29  ( tempLockPath )
2ae80 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78  {.          pCtx
2ae90 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
2aea0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
2aeb0 70 28 30 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74  p(0, tempLockPat
2aec0 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  h);.          if
2aed0 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ( !pCtx->lockPro
2aee0 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
2aef0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2af00 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
2af10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2af20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2af30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2af40 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e  {.        pCtx->
2af50 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b 0a 20  conchHeld = 1;. 
2af60 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
2af70 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  if( pCtx->lockPr
2af80 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  oxy->pMethod == 
2af90 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
2afa0 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 4c 6f  .          afpLo
2afb0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 61 66  ckingContext *af
2afc0 70 43 74 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pCtx;.          
2afd0 61 66 70 43 74 78 20 3d 20 28 61 66 70 4c 6f 63  afpCtx = (afpLoc
2afe0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 43  kingContext *)pC
2aff0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c  tx->lockProxy->l
2b000 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
2b010 20 20 20 20 20 20 20 20 20 61 66 70 43 74 78 2d           afpCtx-
2b020 3e 64 62 50 61 74 68 20 3d 20 70 43 74 78 2d 3e  >dbPath = pCtx->
2b030 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
2b040 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2b050 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
2b060 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
2b070 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
2b080 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
2b090 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  File, NO_LOCK);.
2b0a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
2b0b0 54 52 41 43 45 33 28 22 54 41 4b 45 43 4f 4e 43  TRACE3("TAKECONC
2b0c0 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e  H  %d %s\n", con
2b0d0 63 68 46 69 6c 65 2d 3e 68 2c 20 72 63 3d 3d 53  chFile->h, rc==S
2b0e0 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66  QLITE_OK?"ok":"f
2b0f0 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 20 20 72  ailed");.      r
2b100 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 20  eturn rc;.    } 
2b110 77 68 69 6c 65 20 28 31 29 3b 20 2f 2a 20 69 6e  while (1); /* in
2b120 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f   case we need to
2b130 20 72 65 74 72 79 20 74 68 65 20 3a 61 75 74 6f   retry the :auto
2b140 3a 20 6c 6f 63 6b 20 66 69 6c 65 20 2d 20 77 65  : lock file - we
2b150 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 67 65   should never ge
2b160 74 20 68 65 72 65 20 65 78 63 65 70 74 20 76 69  t here except vi
2b170 61 20 74 68 65 20 27 63 6f 6e 74 69 6e 75 65 27  a the 'continue'
2b180 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a   call. */.  }.}.
2b190 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c 65 20  ./*.** If pFile 
2b1a0 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20  holds a lock on 
2b1b0 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 74 68  a conch file, th
2b1c0 65 6e 20 72 65 6c 65 61 73 65 20 74 68 61 74 20  en release that 
2b1d0 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
2b1e0 69 6e 74 20 70 72 6f 78 79 52 65 6c 65 61 73 65  int proxyRelease
2b1f0 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a  Conch(unixFile *
2b200 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63  pFile){.  int rc
2b210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b220 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
2b230 69 6e 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ine return code 
2b240 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  */.  proxyLockin
2b250 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 20  gContext *pCtx; 
2b260 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20   /* The locking 
2b270 63 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20  context for the 
2b280 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20  proxy lock */.  
2b290 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
2b2a0 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ile;        /* N
2b2b0 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68  ame of the conch
2b2c0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43 74 78   file */..  pCtx
2b2d0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
2b2e0 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
2b2f0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
2b300 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  .  conchFile = p
2b310 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
2b320 20 20 4f 53 54 52 41 43 45 34 28 22 52 45 4c 45    OSTRACE4("RELE
2b330 41 53 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72  ASECONCH  %d for
2b340 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63   %s pid=%d\n", c
2b350 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  onchFile->h,.   
2b360 20 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c          (pCtx->l
2b370 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70  ockProxyPath ? p
2b380 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
2b390 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20  th : ":auto:"), 
2b3a0 0a 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70  .           getp
2b3b0 69 64 28 29 29 3b 0a 20 20 69 66 28 20 70 43 74  id());.  if( pCt
2b3c0 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29  x->conchHeld>0 )
2b3d0 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68  {.    rc = conch
2b3e0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2b3f0 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  Unlock((sqlite3_
2b400 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
2b410 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20   NO_LOCK);.  }. 
2b420 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
2b430 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 33   = 0;.  OSTRACE3
2b440 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20  ("RELEASECONCH  
2b450 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46  %d %s\n", conchF
2b460 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
2b470 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f     (rc==SQLITE_O
2b480 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
2b490 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ed"));.  return 
2b4a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  rc;.}../*.** Giv
2b4b0 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  en the name of a
2b4c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2b4d0 63 6f 6d 70 75 74 65 20 74 68 65 20 6e 61 6d 65  compute the name
2b4e0 20 6f 66 20 69 74 73 20 63 6f 6e 63 68 20 66 69   of its conch fi
2b4f0 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65  le..** Store the
2b500 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20   conch filename 
2b510 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
2b520 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
2b530 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b  malloc()..** Mak
2b540 65 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 70 6f  e *pConchPath po
2b550 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6e  int to the new n
2b560 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ame.  Return SQL
2b570 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
2b580 73 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e  s.** or SQLITE_N
2b590 4f 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65 20 74  OMEM if unable t
2b5a0 6f 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e  o obtain memory.
2b5b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
2b5c0 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
2b5d0 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68   for ensuring th
2b5e0 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  at the allocated
2b5f0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65   memory.** space
2b600 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   is eventually f
2b610 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f  reed..**.** *pCo
2b620 6e 63 68 50 61 74 68 20 69 73 20 73 65 74 20 74  nchPath is set t
2b630 6f 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f  o NULL if a memo
2b640 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
2b650 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
2b660 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
2b670 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61  reateConchPathna
2b680 6d 65 28 63 68 61 72 20 2a 64 62 50 61 74 68 2c  me(char *dbPath,
2b690 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61   char **pConchPa
2b6a0 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  th){.  int i;   
2b6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6c0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2b6d0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  nter */.  int le
2b6e0 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
2b6f0 64 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67  dbPath); /* Leng
2b700 74 68 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  th of database f
2b710 69 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61 74 68  ilename - dbPath
2b720 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63   */.  char *conc
2b730 68 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  hPath;          
2b740 20 20 20 20 2f 2a 20 62 75 66 66 65 72 20 69 6e      /* buffer in
2b750 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72   which to constr
2b760 75 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a  uct conch name *
2b770 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
2b780 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 63   space for the c
2b790 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e  onch filename an
2b7a0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
2b7b0 20 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68   name to.  ** th
2b7c0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 72  e name of the or
2b7d0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
2b7e0 66 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43  file. */  .  *pC
2b7f0 6f 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e 63 68  onchPath = conch
2b800 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 73  Path = (char *)s
2b810 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65  qlite3_malloc(le
2b820 6e 20 2b 20 38 29 3b 0a 20 20 69 66 28 20 63 6f  n + 8);.  if( co
2b830 6e 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20  nchPath==0 ){.  
2b840 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b850 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
2b860 63 70 79 28 63 6f 6e 63 68 50 61 74 68 2c 20 64  cpy(conchPath, d
2b870 62 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20  bPath, len+1);. 
2b880 20 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72   .  /* now inser
2b890 74 20 61 20 22 2e 22 20 62 65 66 6f 72 65 20 74  t a "." before t
2b8a0 68 65 20 6c 61 73 74 20 2f 20 63 68 61 72 61 63  he last / charac
2b8b0 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d  ter */.  for( i=
2b8c0 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69  (len-1); i>=0; i
2b8d0 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f  -- ){.    if( co
2b8e0 6e 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20  nchPath[i]=='/' 
2b8f0 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  ){.      i++;.  
2b900 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2b910 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68  .  }.  conchPath
2b920 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65  [i]='.';.  while
2b930 20 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20   ( i<len ){.    
2b940 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64  conchPath[i+1]=d
2b950 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b  bPath[i];.    i+
2b960 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70  +;.  }..  /* app
2b970 65 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63 68 22  end the "-conch"
2b980 20 73 75 66 66 69 78 20 74 6f 20 74 68 65 20 66   suffix to the f
2b990 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  ile */.  memcpy(
2b9a0 26 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c  &conchPath[i+1],
2b9b0 20 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20   "-conch", 7);. 
2b9c0 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 73 74   assert( (int)st
2b9d0 72 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68 29 20  rlen(conchPath) 
2b9e0 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72  == len+7 );..  r
2b9f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ba00 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20  .}.../* Takes a 
2ba10 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64  fully configured
2ba20 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73   proxy locking-s
2ba30 74 79 6c 65 20 75 6e 69 78 20 66 69 6c 65 20 61  tyle unix file a
2ba40 6e 64 20 73 77 69 74 63 68 65 73 0a 2a 2a 20 74  nd switches.** t
2ba50 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  he local lock fi
2ba60 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74  le path .*/.stat
2ba70 69 63 20 69 6e 74 20 73 77 69 74 63 68 4c 6f 63  ic int switchLoc
2ba80 6b 50 72 6f 78 79 50 61 74 68 28 75 6e 69 78 46  kProxyPath(unixF
2ba90 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73  ile *pFile, cons
2baa0 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a  t char *path) {.
2bab0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
2bac0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
2bad0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2bae0 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  xt*)pFile->locki
2baf0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61  ngContext;.  cha
2bb00 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43 74  r *oldPath = pCt
2bb10 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
2bb20 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2bb30 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
2bb40 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
2bb50 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  NO_LOCK ){.    r
2bb60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
2bb70 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e  Y;.  }  ..  /* n
2bb80 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 66 20  othing to do if 
2bb90 74 68 65 20 70 61 74 68 20 69 73 20 4e 55 4c 4c  the path is NULL
2bba0 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74 63  , :auto: or matc
2bbb0 68 65 73 20 74 68 65 20 65 78 69 73 74 69 6e 67  hes the existing
2bbc0 20 70 61 74 68 20 2a 2f 0a 20 20 69 66 28 20 21   path */.  if( !
2bbd0 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d  path || path[0]=
2bbe0 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70  ='\0' || !strcmp
2bbf0 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29  (path, ":auto:")
2bc00 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74 68   ||.    (oldPath
2bc10 20 26 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64   && !strncmp(old
2bc20 50 61 74 68 2c 20 70 61 74 68 2c 20 4d 41 58 50  Path, path, MAXP
2bc30 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20 20  ATHLEN)) ){.    
2bc40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2bc50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
2bc60 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
2bc70 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
2bc80 72 6f 78 79 3b 0a 20 20 20 20 70 43 74 78 2d 3e  roxy;.    pCtx->
2bc90 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a  lockProxy=NULL;.
2bca0 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48      pCtx->conchH
2bcb0 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  eld = 0;.    if(
2bcc0 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c   lockProxy!=NULL
2bcd0 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f 63   ){.      rc=loc
2bce0 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d  kProxy->pMethod-
2bcf0 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
2bd00 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f 78  _file *)lockProx
2bd10 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
2bd20 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2bd30 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2bd40 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20  (lockProxy);.   
2bd50 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
2bd60 72 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20 20  ree(oldPath);.  
2bd70 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
2bd80 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44  yPath = sqlite3D
2bd90 62 53 74 72 44 75 70 28 30 2c 20 70 61 74 68 29  bStrDup(0, path)
2bda0 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72  ;.  }.  .  retur
2bdb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  n rc;.}../*.** p
2bdc0 46 69 6c 65 20 69 73 20 61 20 66 69 6c 65 20 74  File is a file t
2bdd0 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65  hat has been ope
2bde0 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 78  ned by a prior x
2bdf0 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50 61  Open call.  dbPa
2be00 74 68 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e  th.** is a strin
2be10 67 20 62 75 66 66 65 72 20 61 74 20 6c 65 61 73  g buffer at leas
2be20 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20 63  t MAXPATHLEN+1 c
2be30 68 61 72 61 63 74 65 72 73 20 69 6e 20 73 69 7a  haracters in siz
2be40 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
2be50 75 74 69 6e 65 20 66 69 6e 64 20 74 68 65 20 66  utine find the f
2be60 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69 61 74  ilename associat
2be70 65 64 20 77 69 74 68 20 70 46 69 6c 65 20 61 6e  ed with pFile an
2be80 64 20 77 72 69 74 65 73 20 69 74 0a 2a 2a 20 69  d writes it.** i
2be90 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73 74  nt dbPath..*/.st
2bea0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
2beb0 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69  tDbPathForUnixFi
2bec0 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  le(unixFile *pFi
2bed0 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68  le, char *dbPath
2bee0 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ){.#if defined(_
2bef0 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28 20  _APPLE__).  if( 
2bf00 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
2bf10 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20  = &afpIoMethods 
2bf20 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70 20 73 74  ){.    /* afp st
2bf30 79 6c 65 20 6b 65 65 70 73 20 61 20 72 65 66 65  yle keeps a refe
2bf40 72 65 6e 63 65 20 74 6f 20 74 68 65 20 64 62 20  rence to the db 
2bf50 70 61 74 68 20 69 6e 20 74 68 65 20 66 69 6c 65  path in the file
2bf60 50 61 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20  Path field .    
2bf70 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  ** of the struct
2bf80 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2bf90 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 68 61  (int)strlen((cha
2bfa0 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  r*)pFile->lockin
2bfb0 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41  gContext)<=MAXPA
2bfc0 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72  THLEN );.    str
2bfd0 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28 28 61  lcpy(dbPath, ((a
2bfe0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
2bff0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
2c000 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74  gContext)->dbPat
2c010 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
2c020 20 20 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a    } else.#endif.
2c030 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65    if( pFile->pMe
2c040 74 68 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b  thod == &dotlock
2c050 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2c060 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79   /* dot lock sty
2c070 6c 65 20 75 73 65 73 20 74 68 65 20 6c 6f 63 6b  le uses the lock
2c080 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73  ing context to s
2c090 74 6f 72 65 20 74 68 65 20 64 6f 74 20 6c 6f 63  tore the dot loc
2c0a0 6b 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 70 61  k.    ** file pa
2c0b0 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65  th */.    int le
2c0c0 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72  n = strlen((char
2c0d0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
2c0e0 67 43 6f 6e 74 65 78 74 29 20 2d 20 73 74 72 6c  gContext) - strl
2c0f0 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  en(DOTLOCK_SUFFI
2c100 58 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64  X);.    memcpy(d
2c110 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70  bPath, (char *)p
2c120 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
2c130 74 65 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a  text, len + 1);.
2c140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2c150 61 6c 6c 20 6f 74 68 65 72 20 73 74 79 6c 65 73  all other styles
2c160 20 75 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67   use the locking
2c170 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72   context to stor
2c180 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 70 61  e the db file pa
2c190 74 68 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  th */.    assert
2c1a0 28 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29  ( strlen((char*)
2c1b0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
2c1c0 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c  ntext)<=MAXPATHL
2c1d0 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70  EN );.    strlcp
2c1e0 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72 20  y(dbPath, (char 
2c1f0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
2c200 43 6f 6e 74 65 78 74 2c 20 4d 41 58 50 41 54 48  Context, MAXPATH
2c210 4c 45 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LEN);.  }.  retu
2c220 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2c230 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20  ./*.** Takes an 
2c240 61 6c 72 65 61 64 79 20 66 69 6c 6c 65 64 20 69  already filled i
2c250 6e 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20  n unix file and 
2c260 61 6c 74 65 72 73 20 69 74 20 73 6f 20 61 6c 6c  alters it so all
2c270 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a   file locking .*
2c280 2a 20 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72  * will be perfor
2c290 6d 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  med on the local
2c2a0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
2c2b0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
2c2c0 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70   fields.** are p
2c2d0 72 65 73 65 72 76 65 64 20 69 6e 20 74 68 65 20  reserved in the 
2c2e0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
2c2f0 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e  so that they can
2c300 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
2c310 20 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20 73 74   .** the unix st
2c320 72 75 63 74 75 72 65 20 70 72 6f 70 65 72 6c 79  ructure properly
2c330 20 63 6c 65 61 6e 65 64 20 75 70 20 61 74 20 63   cleaned up at c
2c340 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d  lose time:.**  -
2c350 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a  >lockingContext.
2c360 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f  **  ->pMethod.*/
2c370 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2c380 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
2c390 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  le(unixFile *pFi
2c3a0 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
2c3b0 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c  path) {.  proxyL
2c3c0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
2c3d0 43 74 78 3b 0a 20 20 63 68 61 72 20 64 62 50 61  Ctx;.  char dbPa
2c3e0 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d  th[MAXPATHLEN+1]
2c3f0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
2c400 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2c410 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2c420 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20  lockPath=NULL;. 
2c430 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2c440 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46  _OK;.  .  if( pF
2c450 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
2c460 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  O_LOCK ){.    re
2c470 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
2c480 3b 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47 65 74  ;.  }.  proxyGet
2c490 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c  DbPathForUnixFil
2c4a0 65 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68 29  e(pFile, dbPath)
2c4b0 3b 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c  ;.  if( !path ||
2c4c0 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c   path[0]=='\0' |
2c4d0 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20  | !strcmp(path, 
2c4e0 22 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20  ":auto:") ){.   
2c4f0 20 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a   lockPath=NULL;.
2c500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63    }else{.    loc
2c510 6b 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70 61  kPath=(char *)pa
2c520 74 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54  th;.  }.  .  OST
2c530 52 41 43 45 34 28 22 54 52 41 4e 53 50 52 4f 58  RACE4("TRANSPROX
2c540 59 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64  Y  %d for %s pid
2c550 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
2c560 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c 6f  ,.           (lo
2c570 63 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74  ckPath ? lockPat
2c580 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67  h : ":auto:"), g
2c590 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 70 43 74  etpid());..  pCt
2c5a0 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
2c5b0 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78  oc( sizeof(*pCtx
2c5c0 29 20 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d  ) );.  if( pCtx=
2c5d0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2c5e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2c5f0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 74 78   }.  memset(pCtx
2c600 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74  , 0, sizeof(*pCt
2c610 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f  x));..  rc = pro
2c620 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74  xyCreateConchPat
2c630 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20 26 70  hname(dbPath, &p
2c640 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
2c650 74 68 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  th);.  if( rc==S
2c660 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c670 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65  rc = proxyCreate
2c680 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d 3e 63  UnixFile(pCtx->c
2c690 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26 70  onchFilePath, &p
2c6a0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c 20  Ctx->conchFile, 
2c6b0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
2c6c0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
2c6d0 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f 70 65 6e  && ((pFile->open
2c6e0 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d  Flags&O_RDWR) ==
2c6f0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   0) ){.      /* 
2c700 69 66 20 28 61 29 20 74 68 65 20 6f 70 65 6e 20  if (a) the open 
2c710 66 6c 61 67 73 20 61 72 65 20 6e 6f 74 20 4f 5f  flags are not O_
2c720 52 44 57 52 2c 20 28 62 29 20 74 68 65 20 63 6f  RDWR, (b) the co
2c730 6e 63 68 20 69 73 6e 27 74 20 74 68 65 72 65 2c  nch isn't there,
2c740 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 63   and.      ** (c
2c750 29 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  ) the file syste
2c760 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  m is read-only, 
2c770 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c  then enable no-l
2c780 6f 63 6b 69 6e 67 20 61 63 63 65 73 73 2e 0a 20  ocking access.. 
2c790 20 20 20 20 20 2a 2a 20 55 67 68 2c 20 73 69 6e       ** Ugh, sin
2c7a0 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30  ce O_RDONLY==0x0
2c7b0 30 30 30 20 77 65 20 74 65 73 74 20 66 6f 72 20  000 we test for 
2c7c0 21 4f 5f 52 44 57 52 20 73 69 6e 63 65 20 75 6e  !O_RDWR since un
2c7d0 69 78 4f 70 65 6e 20 61 73 73 65 72 74 73 0a 20  ixOpen asserts. 
2c7e0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70 65       ** that ope
2c7f0 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68 61 76 65  nFlags will have
2c800 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f 52   only one of O_R
2c810 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44 57 52 2e  DONLY or O_RDWR.
2c820 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2c830 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
2c840 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
2c850 63 74 20 73 74 61 74 20 63 6f 6e 63 68 49 6e 66  ct stat conchInf
2c860 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 67 6f 4c  o;.      int goL
2c870 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a 20 20  ockless = 0;..  
2c880 20 20 20 20 69 66 28 20 73 74 61 74 28 70 43 74      if( stat(pCt
2c890 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
2c8a0 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20 3d 3d  , &conchInfo) ==
2c8b0 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 20 20   -1 ) {.        
2c8c0 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b  int err = errno;
2c8d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65 72  .        if( (er
2c8e0 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20 28 73  r==ENOENT) && (s
2c8f0 74 61 74 66 73 28 64 62 50 61 74 68 2c 20 26 66  tatfs(dbPath, &f
2c900 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20 29 7b  sInfo) != -1) ){
2c910 0a 20 20 20 20 20 20 20 20 20 20 67 6f 4c 6f 63  .          goLoc
2c920 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e 66 6f 2e  kless = (fsInfo.
2c930 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44 4f 4e  f_flags&MNT_RDON
2c940 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f 4e 4c  LY) == MNT_RDONL
2c950 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
2c960 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67     }.      if( g
2c970 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20 20 20  oLockless ){.   
2c980 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68       pCtx->conch
2c990 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20 72 65  Held = -1; /* re
2c9a0 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f 63 6b  ad only FS/ lock
2c9b0 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  less */.        
2c9c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2c9d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c9e0 7d 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  }  .  if( rc==SQ
2c9f0 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 50  LITE_OK && lockP
2ca00 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74 78 2d  ath ){.    pCtx-
2ca10 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d  >lockProxyPath =
2ca20 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
2ca30 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a 20  (0, lockPath);. 
2ca40 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
2ca50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
2ca60 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 73 71  Ctx->dbPath = sq
2ca70 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
2ca80 20 64 62 50 61 74 68 29 3b 0a 20 20 20 20 69 66   dbPath);.    if
2ca90 28 20 70 43 74 78 2d 3e 64 62 50 61 74 68 3d 3d  ( pCtx->dbPath==
2caa0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63  NULL ){.      rc
2cab0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2cac0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2cad0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2cae0 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d 65 6d  {.    /* all mem
2caf0 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ory is allocated
2cb00 2c 20 70 72 6f 78 79 73 20 61 72 65 20 63 72 65  , proxys are cre
2cb10 61 74 65 64 20 61 6e 64 20 61 73 73 69 67 6e 65  ated and assigne
2cb20 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69 74 63  d, .    ** switc
2cb30 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  h the locking co
2cb40 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f  ntext and pMetho
2cb50 64 20 74 68 65 6e 20 72 65 74 75 72 6e 2e 0a 20  d then return.. 
2cb60 20 20 20 2a 2f 0a 20 20 20 20 70 43 74 78 2d 3e     */.    pCtx->
2cb70 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oldLockingContex
2cb80 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t = pFile->locki
2cb90 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70  ngContext;.    p
2cba0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
2cbb0 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20 20 20  text = pCtx;.   
2cbc0 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f   pCtx->pOldMetho
2cbd0 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  d = pFile->pMeth
2cbe0 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  od;.    pFile->p
2cbf0 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78 79 49  Method = &proxyI
2cc00 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
2cc10 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  e{.    if( pCtx-
2cc20 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20 0a 20  >conchFile ){ . 
2cc30 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68       pCtx->conch
2cc40 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2cc50 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
2cc60 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63  ile *)pCtx->conc
2cc70 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71  hFile);.      sq
2cc80 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
2cc90 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20  >conchFile);.   
2cca0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
2ccb0 72 65 65 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  ree(pCtx->lockPr
2ccc0 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73 71  oxyPath);.    sq
2ccd0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
2cce0 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b  >conchFilePath);
2ccf0 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72   .    sqlite3_fr
2cd00 65 65 28 70 43 74 78 29 3b 0a 20 20 7d 0a 20 20  ee(pCtx);.  }.  
2cd10 4f 53 54 52 41 43 45 33 28 22 54 52 41 4e 53 50  OSTRACE3("TRANSP
2cd20 52 4f 58 59 20 20 25 64 20 25 73 5c 6e 22 2c 20  ROXY  %d %s\n", 
2cd30 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
2cd40 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45       (rc==SQLITE
2cd50 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
2cd60 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
2cd70 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2cd80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 6e  This routine han
2cd90 64 6c 65 73 20 73 71 6c 69 74 65 33 5f 66 69 6c  dles sqlite3_fil
2cda0 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 63 61 6c 6c  e_control() call
2cdb0 73 20 74 68 61 74 20 61 72 65 20 73 70 65 63 69  s that are speci
2cdc0 66 69 63 0a 2a 2a 20 74 6f 20 70 72 6f 78 79 20  fic.** to proxy 
2cdd0 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  locking..*/.stat
2cde0 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65  ic int proxyFile
2cdf0 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
2ce00 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
2ce10 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
2ce20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
2ce30 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47     case SQLITE_G
2ce40 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
2ce50 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69  : {.      unixFi
2ce60 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
2ce70 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20  xFile*)id;.     
2ce80 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74   if( pFile->pMet
2ce90 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d  hod == &proxyIoM
2cea0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
2ceb0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
2cec0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
2ced0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2cee0 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  xt*)pFile->locki
2cef0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  ngContext;.     
2cf00 20 20 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63     proxyTakeConc
2cf10 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  h(pFile);.      
2cf20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b    if( pCtx->lock
2cf30 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
2cf40 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63         *(const c
2cf50 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 70 43  har **)pArg = pC
2cf60 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
2cf70 68 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  h;.        }else
2cf80 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f  {.          *(co
2cf90 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67  nst char **)pArg
2cfa0 20 3d 20 22 3a 61 75 74 6f 3a 20 28 6e 6f 74 20   = ":auto: (not 
2cfb0 68 65 6c 64 29 22 3b 0a 20 20 20 20 20 20 20 20  held)";.        
2cfc0 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  }.      } else {
2cfd0 0a 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74  .        *(const
2cfe0 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20   char **)pArg = 
2cff0 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NULL;.      }.  
2d000 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d010 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
2d020 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f  case SQLITE_SET_
2d030 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
2d040 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
2d050 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
2d060 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 6e  le*)id;.      in
2d070 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2d080 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 50 72  ;.      int isPr
2d090 6f 78 79 53 74 79 6c 65 20 3d 20 28 70 46 69 6c  oxyStyle = (pFil
2d0a0 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70  e->pMethod == &p
2d0b0 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 29 3b 0a  roxyIoMethods);.
2d0c0 20 20 20 20 20 20 69 66 28 20 70 41 72 67 3d 3d        if( pArg==
2d0d0 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e 73 74 20 63  NULL || (const c
2d0e0 68 61 72 20 2a 29 70 41 72 67 3d 3d 30 20 29 7b  har *)pArg==0 ){
2d0f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 50  .        if( isP
2d100 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20  roxyStyle ){.   
2d110 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f         /* turn o
2d120 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ff proxy locking
2d130 20 2d 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64   - not supported
2d140 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
2d150 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   = SQLITE_ERROR 
2d160 2f 2a 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  /*SQLITE_PROTOCO
2d170 4c 3f 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  L? SQLITE_MISUSE
2d180 3f 2a 2f 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ?*/;.        }el
2d190 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2d1a0 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20   turn off proxy 
2d1b0 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c 72 65 61 64  locking - alread
2d1c0 79 20 6f 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f 0a  y off - NOOP */.
2d1d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2d1e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2d1f0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
2d200 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
2d210 68 61 72 20 2a 70 72 6f 78 79 50 61 74 68 20 3d  har *proxyPath =
2d220 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
2d230 41 72 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Arg;.        if(
2d240 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b   isProxyStyle ){
2d250 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 78 79  .          proxy
2d260 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2d270 70 43 74 78 20 3d 20 0a 20 20 20 20 20 20 20 20  pCtx = .        
2d280 20 20 20 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e      (proxyLockin
2d290 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d  gContext*)pFile-
2d2a0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
2d2b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2d2c0 73 74 72 63 6d 70 28 70 41 72 67 2c 20 22 3a 61  strcmp(pArg, ":a
2d2d0 75 74 6f 3a 22 29 20 0a 20 20 20 20 20 20 20 20  uto:") .        
2d2e0 20 20 20 7c 7c 20 28 70 43 74 78 2d 3e 6c 6f 63     || (pCtx->loc
2d2f0 6b 50 72 6f 78 79 50 61 74 68 20 26 26 0a 20 20  kProxyPath &&.  
2d300 20 20 20 20 20 20 20 20 20 20 20 20 20 21 73 74               !st
2d310 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b  rncmp(pCtx->lock
2d320 50 72 6f 78 79 50 61 74 68 2c 20 70 72 6f 78 79  ProxyPath, proxy
2d330 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
2d340 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  )).          ){.
2d350 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2d360 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2d370 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d380 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 77           rc = sw
2d390 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74  itchLockProxyPat
2d3a0 68 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61  h(pFile, proxyPa
2d3b0 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  th);.          }
2d3c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2d3d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72            /* tur
2d3e0 6e 20 6f 6e 20 70 72 6f 78 79 20 66 69 6c 65 20  n on proxy file 
2d3f0 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20  locking */.     
2d400 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54       rc = proxyT
2d410 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
2d420 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74  (pFile, proxyPat
2d430 68 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  h);.        }.  
2d440 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2d450 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2d460 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
2d470 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20    assert( 0 );  
2d480 2f 2a 20 54 68 65 20 63 61 6c 6c 20 61 73 73 75  /* The call assu
2d490 72 65 73 20 74 68 61 74 20 6f 6e 6c 79 20 76 61  res that only va
2d4a0 6c 69 64 20 6f 70 63 6f 64 65 73 20 61 72 65 20  lid opcodes are 
2d4b0 73 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  sent */.    }.  
2d4c0 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44  }.  /*NOTREACHED
2d4d0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  */.  return SQLI
2d4e0 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
2d4f0 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 64  ** Within this d
2d500 69 76 69 73 69 6f 6e 20 28 74 68 65 20 70 72 6f  ivision (the pro
2d510 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 69 6d  xying locking im
2d520 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 20 74 68  plementation) th
2d530 65 20 70 72 6f 63 65 64 75 72 65 73 0a 2a 2a 20  e procedures.** 
2d540 61 62 6f 76 65 20 74 68 69 73 20 70 6f 69 6e 74  above this point
2d550 20 61 72 65 20 61 6c 6c 20 75 74 69 6c 69 74 69   are all utiliti
2d560 65 73 2e 20 20 54 68 65 20 6c 6f 63 6b 2d 72 65  es.  The lock-re
2d570 6c 61 74 65 64 20 6d 65 74 68 6f 64 73 20 6f 66  lated methods of
2d580 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 2d 6c 6f   the.** proxy-lo
2d590 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 69 6f  cking sqlite3_io
2d5a0 5f 6d 65 74 68 6f 64 20 6f 62 6a 65 63 74 20 66  _method object f
2d5b0 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a  ollow..*/.../*.*
2d5c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
2d5d0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
2d5e0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
2d5f0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
2d600 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
2d610 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
2d620 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
2d630 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
2d640 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
2d650 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
2d660 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
2d670 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
2d680 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
2d690 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
2d6a0 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
2d6b0 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
2d6c0 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
2d6d0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
2d6e0 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
2d6f0 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52   int proxyCheckR
2d700 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
2d710 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
2d720 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
2d730 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
2d740 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
2d750 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78  .  int rc = prox
2d760 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
2d770 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2d780 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72  ITE_OK ){.    pr
2d790 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2d7a0 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
2d7b0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2d7c0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
2d7d0 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20  ontext;.    if( 
2d7e0 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e  pCtx->conchHeld>
2d7f0 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  0 ){.      unixF
2d800 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74  ile *proxy = pCt
2d810 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
2d820 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79      return proxy
2d830 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 68 65 63  ->pMethod->xChec
2d840 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 28 73  kReservedLock((s
2d850 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f  qlite3_file*)pro
2d860 78 79 2c 20 70 52 65 73 4f 75 74 29 3b 0a 20 20  xy, pResOut);.  
2d870 20 20 7d 65 6c 73 65 7b 20 2f 2a 20 63 6f 6e 63    }else{ /* conc
2d880 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63  hHeld < 0 is loc
2d890 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 70  kless */.      p
2d8a0 52 65 73 4f 75 74 3d 30 3b 0a 20 20 20 20 7d 0a  ResOut=0;.    }.
2d8b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2d8c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
2d8d0 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
2d8e0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
2d8f0 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
2d900 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
2d910 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
2d920 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
2d930 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
2d940 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
2d950 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
2d960 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
2d970 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
2d980 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
2d990 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
2d9a0 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
2d9b0 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
2d9c0 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
2d9d0 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
2d9e0 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
2d9f0 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
2da00 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
2da10 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
2da20 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
2da30 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
2da40 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
2da50 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
2da60 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
2da70 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
2da80 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
2da90 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
2daa0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
2dab0 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
2dac0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
2dad0 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
2dae0 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
2daf0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
2db00 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
2db10 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
2db20 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
2db30 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
2db40 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
2db50 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
2db60 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
2db70 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
2db80 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
2db90 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
2dba0 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
2dbb0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
2dbc0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
2dbd0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
2dbe0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
2dbf0 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69  t proxyLock(sqli
2dc00 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
2dc10 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
2dc20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
2dc30 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
2dc40 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78  .  int rc = prox
2dc50 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
2dc60 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2dc70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72  ITE_OK ){.    pr
2dc80 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2dc90 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
2dca0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2dcb0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
2dcc0 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20  ontext;.    if( 
2dcd0 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e  pCtx->conchHeld>
2dce0 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  0 ){.      unixF
2dcf0 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74  ile *proxy = pCt
2dd00 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
2dd10 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e      rc = proxy->
2dd20 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
2dd30 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72  sqlite3_file*)pr
2dd40 6f 78 79 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  oxy, locktype);.
2dd50 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
2dd60 6b 74 79 70 65 20 3d 20 70 72 6f 78 79 2d 3e 6c  ktype = proxy->l
2dd70 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c  ocktype;.    }el
2dd80 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e  se{.      /* con
2dd90 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f  chHeld < 0 is lo
2dda0 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a  ckless */.    }.
2ddb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2ddc0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  .}.../*.** Lower
2ddd0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
2dde0 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
2ddf0 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c  iptor pFile to l
2de00 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
2de10 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
2de20 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
2de30 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
2de40 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
2de50 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
2de60 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
2de70 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
2de80 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
2de90 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
2dea0 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
2deb0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
2dec0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2ded0 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  xyUnlock(sqlite3
2dee0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
2def0 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69  ocktype) {.  uni
2df00 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
2df10 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
2df20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61  int rc = proxyTa
2df30 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  keConch(pFile);.
2df40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2df50 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79  _OK ){.    proxy
2df60 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2df70 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
2df80 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
2df90 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
2dfa0 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ext;.    if( pCt
2dfb0 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29  x->conchHeld>0 )
2dfc0 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  {.      unixFile
2dfd0 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e   *proxy = pCtx->
2dfe0 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20  lockProxy;.     
2dff0 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65   rc = proxy->pMe
2e000 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73  thod->xUnlock((s
2e010 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f  qlite3_file*)pro
2e020 78 79 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  xy, locktype);. 
2e030 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
2e040 74 79 70 65 20 3d 20 70 72 6f 78 79 2d 3e 6c 6f  type = proxy->lo
2e050 63 6b 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73  cktype;.    }els
2e060 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63  e{.      /* conc
2e070 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63  hHeld < 0 is loc
2e080 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  kless */.    }. 
2e090 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2e0a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
2e0b0 20 66 69 6c 65 20 74 68 61 74 20 75 73 65 73 20   file that uses 
2e0c0 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a  proxy locks..*/.
2e0d0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2e0e0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
2e0f0 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
2e100 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
2e110 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
2e120 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 70  xFile*)id;.    p
2e130 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2e140 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
2e150 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2e160 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
2e170 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69  Context;.    uni
2e180 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
2e190 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
2e1a0 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  xy;.    unixFile
2e1b0 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
2e1c0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
2e1d0 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
2e1e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 20 20  TE_OK;.    .    
2e1f0 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20 29 7b  if( lockProxy ){
2e200 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  .      rc = lock
2e210 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  Proxy->pMethod->
2e220 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
2e230 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79  _file*)lockProxy
2e240 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
2e250 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2e260 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d  n rc;.      rc =
2e270 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74   lockProxy->pMet
2e280 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
2e290 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50  ite3_file*)lockP
2e2a0 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28  roxy);.      if(
2e2b0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2e2c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2e2d0 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a  ree(lockProxy);.
2e2e0 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b        pCtx->lock
2e2f0 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20 20 7d  Proxy = 0;.    }
2e300 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69  .    if( conchFi
2e310 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
2e320 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
2e330 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2e340 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63  proxyReleaseConc
2e350 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  h(pFile);.      
2e360 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2e370 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2e380 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
2e390 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  le->pMethod->xCl
2e3a0 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
2e3b0 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  e*)conchFile);. 
2e3c0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2e3d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
2e3e0 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f 6e 63  qlite3_free(conc
2e3f0 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  hFile);.    }.  
2e400 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2e410 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
2e420 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
2e430 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63  _free(pCtx->conc
2e440 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 20 20  hFilePath);.    
2e450 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
2e460 78 2d 3e 64 62 50 61 74 68 29 3b 0a 20 20 20 20  x->dbPath);.    
2e470 2f 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 6f  /* restore the o
2e480 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20  riginal locking 
2e490 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74  context and pMet
2e4a0 68 6f 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69  hod then close i
2e4b0 74 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  t */.    pFile->
2e4c0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
2e4d0 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e   pCtx->oldLockin
2e4e0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 46  gContext;.    pF
2e4f0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70  ile->pMethod = p
2e500 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b  Ctx->pOldMethod;
2e510 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2e520 65 28 70 43 74 78 29 3b 0a 20 20 20 20 72 65 74  e(pCtx);.    ret
2e530 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  urn pFile->pMeth
2e540 6f 64 2d 3e 78 43 6c 6f 73 65 28 69 64 29 3b 0a  od->xClose(id);.
2e550 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2e560 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e  ITE_OK;.}....#en
2e570 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
2e580 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2e590 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2e5a0 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
2e5b0 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
2e5c0 69 6e 67 20 73 74 79 6c 65 20 69 73 20 69 6e 74  ing style is int
2e5d0 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 77 69  ended for use wi
2e5e0 74 68 20 41 46 50 20 66 69 6c 65 73 79 73 74 65  th AFP filesyste
2e5f0 6d 73 2e 0a 2a 2a 20 41 6e 64 20 73 69 6e 63 65  ms..** And since
2e600 20 41 46 50 20 69 73 20 6f 6e 6c 79 20 73 75 70   AFP is only sup
2e610 70 6f 72 74 65 64 20 6f 6e 20 4d 61 63 4f 53 58  ported on MacOSX
2e620 2c 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  , the proxy lock
2e630 69 6e 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72  ing is also.** r
2e640 65 73 74 72 69 63 74 65 64 20 74 6f 20 4d 61 63  estricted to Mac
2e650 4f 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a  OSX..** .**.****
2e660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2e670 45 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 78 79  End of the proxy
2e680 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
2e690 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
2e6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
2e6b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e6d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e6e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
2e700 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
2e710 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
2e720 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  em interface..**
2e730 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2e740 20 72 65 67 69 73 74 65 72 73 20 61 6c 6c 20 56   registers all V
2e750 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  FS implementatio
2e760 6e 73 20 66 6f 72 20 75 6e 69 78 2d 6c 69 6b 65  ns for unix-like
2e770 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79   operating.** sy
2e780 73 74 65 6d 73 2e 20 20 54 68 69 73 20 72 6f 75  stems.  This rou
2e790 74 69 6e 65 2c 20 61 6e 64 20 74 68 65 20 73 71  tine, and the sq
2e7a0 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 20 72  lite3_os_end() r
2e7b0 6f 75 74 69 6e 65 20 74 68 61 74 20 66 6f 6c 6c  outine that foll
2e7c0 6f 77 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 62  ows,.** should b
2e7d0 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69  e the only routi
2e7e0 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65  nes in this file
2e7f0 20 74 68 61 74 20 61 72 65 20 76 69 73 69 62 6c   that are visibl
2e800 65 20 66 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20  e from other.** 
2e810 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  files..**.** Thi
2e820 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2e830 6c 65 64 20 6f 6e 63 65 20 64 75 72 69 6e 67 20  led once during 
2e840 53 51 4c 69 74 65 20 69 6e 69 74 69 61 6c 69 7a  SQLite initializ
2e850 61 74 69 6f 6e 20 61 6e 64 20 62 79 20 61 0a 2a  ation and by a.*
2e860 2a 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e  * single thread.
2e870 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c    The memory all
2e880 6f 63 61 74 69 6f 6e 20 61 6e 64 20 6d 75 74 65  ocation and mute
2e890 78 20 73 75 62 73 79 73 74 65 6d 73 20 68 61 76  x subsystems hav
2e8a0 65 20 6e 6f 74 0a 2a 2a 20 6e 65 63 65 73 73 61  e not.** necessa
2e8b0 72 69 6c 79 20 62 65 65 6e 20 69 6e 69 74 69 61  rily been initia
2e8c0 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20  lized when this 
2e8d0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2e8e0 64 2c 20 61 6e 64 20 73 6f 20 74 68 65 79 0a 2a  d, and so they.*
2e8f0 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  * should not be 
2e900 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  used..*/.int sql
2e910 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69  ite3_os_init(voi
2e920 64 29 7b 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  d){ .  /* .  ** 
2e930 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  The following ma
2e940 63 72 6f 20 64 65 66 69 6e 65 73 20 61 6e 20 69  cro defines an i
2e950 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 61  nitializer for a
2e960 6e 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62  n sqlite3_vfs ob
2e970 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e  ject..  ** The n
2e980 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 69  ame of the VFS i
2e990 73 20 4e 41 4d 45 2e 20 20 54 68 65 20 70 41 70  s NAME.  The pAp
2e9a0 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74  pData is a point
2e9b0 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 0a  er to a pointer.
2e9c0 20 20 2a 2a 20 74 6f 20 74 68 65 20 22 66 69 6e    ** to the "fin
2e9d0 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20  der" function.  
2e9e0 28 70 41 70 70 44 61 74 61 20 69 73 20 61 20 70  (pAppData is a p
2e9f0 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 6f 69 6e  ointer to a poin
2ea00 74 65 72 20 62 65 63 61 75 73 65 0a 20 20 2a 2a  ter because.  **
2ea10 20 73 69 6c 6c 79 20 43 39 30 20 72 75 6c 65 73   silly C90 rules
2ea20 20 70 72 6f 68 69 62 69 74 20 61 20 76 6f 69 64   prohibit a void
2ea30 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 61 73  * from being cas
2ea40 74 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  t to a function 
2ea50 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 6e 64  pointer.  ** and
2ea60 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 67   so we have to g
2ea70 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e  o through the in
2ea80 74 65 72 6d 65 64 69 61 74 65 20 70 6f 69 6e 74  termediate point
2ea90 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62  er to avoid prob
2eaa0 6c 65 6d 73 0a 20 20 2a 2a 20 77 68 65 6e 20 63  lems.  ** when c
2eab0 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 2d 70  ompiling with -p
2eac0 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 6f  edantic-errors o
2ead0 6e 20 47 43 43 2e 29 0a 20 20 2a 2a 0a 20 20 2a  n GCC.).  **.  *
2eae0 2a 20 54 68 65 20 46 49 4e 44 45 52 20 70 61 72  * The FINDER par
2eaf0 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 6d  ameter to this m
2eb00 61 63 72 6f 20 69 73 20 74 68 65 20 6e 61 6d 65  acro is the name
2eb10 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20   of the pointer 
2eb20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 64  to the.  ** find
2eb30 65 72 2d 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  er-function.  Th
2eb40 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  e finder-functio
2eb50 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
2eb60 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ter to the.  ** 
2eb70 73 71 6c 69 74 65 5f 69 6f 5f 6d 65 74 68 6f 64  sqlite_io_method
2eb80 73 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  s object that im
2eb90 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 64 65 73  plements the des
2eba0 69 72 65 64 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ired locking.  *
2ebb0 2a 20 62 65 68 61 76 69 6f 72 73 2e 20 20 53 65  * behaviors.  Se
2ebc0 65 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 61  e the division a
2ebd0 62 6f 76 65 20 74 68 61 74 20 63 6f 6e 74 61 69  bove that contai
2ebe0 6e 73 20 74 68 65 20 49 4f 4d 45 54 48 4f 44 53  ns the IOMETHODS
2ebf0 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 66 6f 72 20  .  ** macro for 
2ec00 61 64 64 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  addition informa
2ec10 74 69 6f 6e 20 6f 6e 20 66 69 6e 64 65 72 2d 66  tion on finder-f
2ec20 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20  unctions..  **. 
2ec30 20 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 73   ** Most finders
2ec40 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 61   simply return a
2ec50 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69   pointer to a fi
2ec60 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  xed sqlite3_io_m
2ec70 65 74 68 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a 65  ethods.  ** obje
2ec80 63 74 2e 20 20 42 75 74 20 74 68 65 20 22 61 75  ct.  But the "au
2ec90 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 22 20  tolockIoFinder" 
2eca0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
2ecb0 4f 53 58 20 64 6f 65 73 20 61 20 6c 69 74 74 6c  OSX does a littl
2ecc0 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  e.  ** more than
2ecd0 20 74 68 61 74 3b 20 69 74 20 6c 6f 6f 6b 73 20   that; it looks 
2ece0 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  at the filesyste
2ecf0 6d 20 74 79 70 65 20 74 68 61 74 20 68 6f 73 74  m type that host
2ed00 73 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  s the .  ** data
2ed10 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 72  base file and tr
2ed20 69 65 73 20 74 6f 20 63 68 6f 6f 73 65 20 61 6e  ies to choose an
2ed30 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
2ed40 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a  appropriate for.
2ed50 20 20 2a 2a 20 74 68 61 74 20 66 69 6c 65 73 79    ** that filesy
2ed60 73 74 65 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a  stem time..  */.
2ed70 20 20 23 64 65 66 69 6e 65 20 55 4e 49 58 56 46    #define UNIXVF
2ed80 53 28 56 46 53 4e 41 4d 45 2c 20 46 49 4e 44 45  S(VFSNAME, FINDE
2ed90 52 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  R) {            
2eda0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2edb0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
2edc0 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
2edd0 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ion */          
2ede0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
2edf0 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
2ee00 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c  ,     /* szOsFil
2ee10 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
2ee20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 4d 41          \.    MA
2ee30 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20 20 20  X_PATHNAME,     
2ee40 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d      /* mxPathnam
2ee50 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
2ee60 20 20 20 20 20 20 5c 0a 20 20 20 20 30 2c 20 20        \.    0,  
2ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee80 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 20 20 20    /* pNext */   
2ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eea0 20 20 20 20 5c 0a 20 20 20 20 56 46 53 4e 41 4d      \.    VFSNAM
2eeb0 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
2eec0 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 20 20 20 20 20  /* zName */     
2eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eee0 20 20 5c 0a 20 20 20 20 28 76 6f 69 64 2a 29 26    \.    (void*)&
2eef0 46 49 4e 44 45 52 2c 20 20 20 20 20 20 20 2f 2a  FINDER,       /*
2ef00 20 70 41 70 70 44 61 74 61 20 2a 2f 20 20 20 20   pAppData */    
2ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef20 5c 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20  \.    unixOpen, 
2ef30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ef40 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  Open */         
2ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2ef60 20 20 20 20 75 6e 69 78 44 65 6c 65 74 65 2c 20      unixDelete, 
2ef70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
2ef80 6c 65 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lete */         
2ef90 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2efa0 20 20 75 6e 69 78 41 63 63 65 73 73 2c 20 20 20    unixAccess,   
2efb0 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
2efc0 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ss */           
2efd0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
2efe0 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  unixFullPathname
2eff0 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61  ,     /* xFullPa
2f000 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20  thname */       
2f010 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
2f020 69 78 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20  ixDlOpen,       
2f030 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
2f040 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2f050 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
2f060 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
2f070 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
2f080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f090 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c      \.    unixDl
2f0a0 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
2f0b0 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 20 20 20 20  /* xDlSym */    
2f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0d0 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c    \.    unixDlCl
2f0e0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ose,          /*
2f0f0 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 20 20 20 20   xDlClose */    
2f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f110 5c 0a 20 20 20 20 75 6e 69 78 52 61 6e 64 6f 6d  \.    unixRandom
2f120 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  ness,       /* x
2f130 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 20 20 20  Randomness */   
2f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2f150 20 20 20 20 75 6e 69 78 53 6c 65 65 70 2c 20 20      unixSleep,  
2f160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
2f170 65 65 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  eep */          
2f180 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2f190 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d    unixCurrentTim
2f1a0 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72  e,      /* xCurr
2f1b0 65 6e 74 54 69 6d 65 20 2a 2f 20 20 20 20 20 20  entTime */      
2f1c0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
2f1d0 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72  unixGetLastError
2f1e0 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73        /* xGetLas
2f1f0 74 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20  tError */       
2f200 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 0a 20          \.  }.. 
2f210 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64 65 66   /*.  ** All def
2f220 61 75 6c 74 20 56 46 53 65 73 20 66 6f 72 20 75  ault VFSes for u
2f230 6e 69 78 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  nix are containe
2f240 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d in the followi
2f250 6e 67 20 61 72 72 61 79 2e 0a 20 20 2a 2a 0a 20  ng array..  **. 
2f260 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
2f270 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 70 4e  e sqlite3_vfs.pN
2f280 65 78 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ext field of the
2f290 20 56 46 53 20 6f 62 6a 65 63 74 20 69 73 20 6d   VFS object is m
2f2a0 6f 64 69 66 69 65 64 0a 20 20 2a 2a 20 62 79 20  odified.  ** by 
2f2b0 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
2f2c0 77 68 65 6e 20 74 68 65 20 56 46 53 20 69 73 20  when the VFS is 
2f2d0 72 65 67 69 73 74 65 72 65 64 2e 20 20 53 6f 20  registered.  So 
2f2e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
2f2f0 2a 2a 20 61 72 72 61 79 20 63 61 6e 6e 6f 74 20  ** array cannot 
2f300 62 65 20 63 6f 6e 73 74 2e 0a 20 20 2a 2f 0a 20  be const..  */. 
2f310 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
2f320 76 66 73 20 61 56 66 73 5b 5d 20 3d 20 7b 0a 23  vfs aVfs[] = {.#
2f330 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2f340 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
2f350 26 20 28 4f 53 5f 56 58 57 4f 52 4b 53 20 7c 7c  & (OS_VXWORKS ||
2f360 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2f370 5f 5f 29 29 0a 20 20 20 20 55 4e 49 58 56 46 53  __)).    UNIXVFS
2f380 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20  ("unix",        
2f390 20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64    autolockIoFind
2f3a0 65 72 20 29 2c 0a 23 65 6c 73 65 0a 20 20 20 20  er ),.#else.    
2f3b0 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22 2c 20  UNIXVFS("unix", 
2f3c0 20 20 20 20 20 20 20 20 20 70 6f 73 69 78 49 6f           posixIo
2f3d0 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66  Finder ),.#endif
2f3e0 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
2f3f0 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 20 6e 6f  ix-none",     no
2f400 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a  lockIoFinder ),.
2f410 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
2f420 78 2d 64 6f 74 66 69 6c 65 22 2c 20 20 64 6f 74  x-dotfile",  dot
2f430 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a  lockIoFinder ),.
2f440 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2f450 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
2f460 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49  -namedsem", semI
2f470 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
2f480 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
2f490 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2f4a0 45 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  E.    UNIXVFS("u
2f4b0 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20 20 20 70  nix-posix",    p
2f4c0 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a  osixIoFinder ),.
2f4d0 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a  #if !OS_VXWORKS.
2f4e0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
2f4f0 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f  x-flock",    flo
2f500 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  ckIoFinder ),.#e
2f510 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20  ndif.#endif.#if 
2f520 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2f530 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
2f540 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2f550 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ).    UNIXVFS("u
2f560 6e 69 78 2d 61 66 70 22 2c 20 20 20 20 20 20 61  nix-afp",      a
2f570 66 70 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20  fpIoFinder ),.  
2f580 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
2f590 6e 66 73 22 2c 20 20 20 20 20 20 6e 66 73 49 6f  nfs",      nfsIo
2f5a0 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e  Finder ),.    UN
2f5b0 49 58 56 46 53 28 22 75 6e 69 78 2d 70 72 6f 78  IXVFS("unix-prox
2f5c0 79 22 2c 20 20 20 20 70 72 6f 78 79 49 6f 46 69  y",    proxyIoFi
2f5d0 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20  nder ),.#endif. 
2f5e0 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
2f5f0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
2f600 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2f610 2f 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  /..  /* Register
2f620 20 61 6c 6c 20 56 46 53 65 73 20 64 65 66 69 6e   all VFSes defin
2f630 65 64 20 69 6e 20 74 68 65 20 61 56 66 73 5b 5d  ed in the aVfs[]
2f640 20 61 72 72 61 79 20 2a 2f 0a 20 20 66 6f 72 28   array */.  for(
2f650 69 3d 30 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61  i=0; i<(sizeof(a
2f660 56 66 73 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69  Vfs)/sizeof(sqli
2f670 74 65 33 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b  te3_vfs)); i++){
2f680 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
2f690 5f 72 65 67 69 73 74 65 72 28 26 61 56 66 73 5b  _register(&aVfs[
2f6a0 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20  i], i==0);.  }. 
2f6b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f6c0 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  K; .}../*.** Shu
2f6d0 74 64 6f 77 6e 20 74 68 65 20 6f 70 65 72 61 74  tdown the operat
2f6e0 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
2f6f0 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  face..**.** Some
2f700 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
2f710 6d 73 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ms might need to
2f720 20 64 6f 20 73 6f 6d 65 20 63 6c 65 61 6e 75 70   do some cleanup
2f730 20 69 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   in this routine
2f740 2c 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65 20  ,.** to release 
2f750 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
2f760 63 61 74 65 64 20 6f 62 6a 65 63 74 73 2e 20 20  cated objects.  
2f770 42 75 74 20 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e  But not on unix.
2f780 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f790 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
2f7a0 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  unix..*/.int sql
2f7b0 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64  ite3_os_end(void
2f7c0 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ){ .  return SQL
2f7d0 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e  ITE_OK; .}. .#en
2f7e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
2f7f0 5f 55 4e 49 58 20 2a 2f 0a                       _UNIX */.