/ Hex Artifact Content
Login

Artifact 0969a5921f2ff2a54c53d9b76eba9e4190ae9001:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 6e 64 65 66 20 53 51  no.h>.#ifndef SQ
1140: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 69  LITE_OMIT_WAL.#i
1150: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1160: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  .h>.#endif..#if 
1170: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1180: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e  CKING_STYLE.# in
1190: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
11a0: 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f  .h>.# if OS_VXWO
11b0: 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  RKS.#  include <
11c0: 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20  semaphore.h>.#  
11d0: 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e  include <limits.
11e0: 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63  h>.# else.#  inc
11f0: 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68  lude <sys/file.h
1200: 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79  >.#  include <sy
1210: 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64  s/param.h>.# end
1220: 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  if.#endif /* SQL
1230: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1240: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
1250: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1260: 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45  __) || (SQLITE_E
1270: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1280: 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
1290: 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  KS).# include <s
12a0: 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64  ys/mount.h>.#end
12b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  if../*.** Allowe
12c0: 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78  d values of unix
12d0: 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a  File.fsFlags.*/.
12e0: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46  #define SQLITE_F
12f0: 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20  SFLAGS_IS_MSDOS 
1300: 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49      0x1../*.** I
1310: 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74  f we are to be t
1320: 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c  hread-safe, incl
1330: 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73  ude the pthreads
1340: 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69   header and defi
1350: 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  ne.** the SQLITE
1360: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61  _UNIX_THREADS ma
1370: 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  cro..*/.#if SQLI
1380: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20  TE_THREADSAFE.# 
1390: 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64  include <pthread
13a0: 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  .h>.# define SQL
13b0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
13c0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
13d0: 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   Default permiss
13e0: 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69  ions when creati
13f0: 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f  ng a new file.*/
1400: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1410: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
1420: 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e  MISSIONS.# defin
1430: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
1440: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1450: 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f  S 0644.#endif../
1460: 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  *. ** Default pe
1470: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
1480: 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f  reating auto pro
1490: 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64  xy dir. */.#ifnd
14a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
14b0: 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
14c0: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
14d0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
14e0: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
14f0: 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a  ONS 0755.#endif.
1500: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73  ./*.** Maximum s
1510: 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65  upported path-le
1520: 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ngth..*/.#define
1530: 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31   MAX_PATHNAME 51
1540: 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65  2../*.** Only se
1550: 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  t the lastErrno 
1560: 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  if the error cod
1570: 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f  e is a real erro
1580: 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20  r and not .** a 
1590: 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20  normal expected 
15a0: 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53  return code of S
15b0: 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51  QLITE_BUSY or SQ
15c0: 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69  LITE_OK.*/.#defi
15d0: 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  ne IS_LOCK_ERROR
15e0: 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49  (x)  ((x != SQLI
15f0: 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20  TE_OK) && (x != 
1600: 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f  SQLITE_BUSY))../
1610: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
1620: 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20  nces */.typedef 
1630: 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75  struct unixShm u
1640: 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20  nixShm;         
1650: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1660: 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ion shared memor
1670: 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  y */.typedef str
1680: 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1690: 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20  unixShmNode;    
16a0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
16b0: 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a  ory instance */.
16c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
16d0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69  nixInodeInfo uni
16e0: 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a  xInodeInfo;   /*
16f0: 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79   An i-node */.ty
1700: 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69  pedef struct Uni
1710: 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e  xUnusedFd UnixUn
1720: 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41  usedFd;     /* A
1730: 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
1740: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a  scriptor */../*.
1750: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66  ** Sometimes, af
1760: 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c  ter a file handl
1770: 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53  e is closed by S
1780: 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20  QLite, the file 
1790: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61  descriptor.** ca
17a0: 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69  nnot be closed i
17b0: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74  mmediately. In t
17c0: 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74  hese cases, inst
17d0: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c  ances of the fol
17e0: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
17f0: 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20  ure are used to 
1800: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64  store the file d
1810: 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20  escriptor while 
1820: 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a  waiting for an.*
1830: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
1840: 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72   either close or
1850: 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74   reuse it..*/.st
1860: 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46  ruct UnixUnusedF
1870: 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20  d {.  int fd;   
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
18a0: 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  or to close */. 
18b0: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
18c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
18d0: 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65  ags this file de
18e0: 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65  scriptor was ope
18f0: 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e  ned with */.  Un
1900: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
1910: 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  t;      /* Next 
1920: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1930: 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66  riptor on same f
1940: 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ile */.};../*.**
1950: 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   The unixFile st
1960: 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c  ructure is subcl
1970: 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66  ass of sqlite3_f
1980: 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20  ile specific to 
1990: 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20  the unix.** VFS 
19a0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e  implementations.
19b0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
19c0: 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78  ct unixFile unix
19d0: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69  File;.struct uni
19e0: 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65  xFile {.  sqlite
19f0: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
1a00: 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a  st *pMethod;  /*
1a10: 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   Always the firs
1a20: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e 69  t entry */.  uni
1a30: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
1a40: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
1a50: 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c   /* Info about l
1a60: 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f  ocks on this ino
1a70: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  de */.  int h;  
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1aa0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1ab0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  or */.  int dirf
1ac0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ae0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
1af0: 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  or the directory
1b00: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1b10: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b30: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b40: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b50: 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f  .  int lastErrno
1b60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b70: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
1b80: 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61  ix errno from la
1b90: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
1ba0: 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43    void *lockingC
1bb0: 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20  ontext;         
1bc0: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67        /* Locking
1bd0: 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20   style specific 
1be0: 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55  state */.  UnixU
1bf0: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
1c00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1c10: 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20  * Pre-allocated 
1c20: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a  UnixUnusedFd */.
1c30: 20 20 69 6e 74 20 66 69 6c 65 46 6c 61 67 73 3b    int fileFlags;
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 20 20 20 20 2f 2a 20 4d 69 73 63 65 6c 6c        /* Miscell
1c60: 61 6e 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 20  anous flags */. 
1c70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c80: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1c90: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1ca0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1cb0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1ce0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1cf0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1d00: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d30: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d40: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d50: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d60: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1d70: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d90: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1da0: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1db0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1dc0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1dd0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1de0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1df0: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e20: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e30: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e40: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1e50: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1e80: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1e90: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1ea0: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1eb0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
1ec0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
1ed0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ee0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1ef0: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1f00: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1f10: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1f20: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1f30: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1f40: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1f50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1f60: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1f70: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1f80: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1f90: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1fa0: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1fb0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1fc0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1fd0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1fe0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
1ff0: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
2000: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2010: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2020: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2030: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2040: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2050: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2060: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
2070: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
2080: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
2090: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
20a0: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
20b0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
20c0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
20d0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
20e0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
20f0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2100: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2110: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2120: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2130: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2140: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2150: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
2160: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2170: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2180: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
2190: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
21a0: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
21b0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
21c0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
21d0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
21e0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
21f0: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
2200: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2210: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2220: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
2230: 61 63 72 6f 73 20 64 65 66 69 6e 65 20 62 69 74  acros define bit
2240: 73 20 69 6e 20 75 6e 69 78 46 69 6c 65 2e 66 69  s in unixFile.fi
2250: 6c 65 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69  leFlags.*/.#defi
2260: 6e 65 20 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f  ne SQLITE_WHOLE_
2270: 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 20 20 30 78  FILE_LOCKING  0x
2280: 30 30 30 31 20 20 20 2f 2a 20 55 73 65 20 77 68  0001   /* Use wh
2290: 6f 6c 65 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ole-file locking
22a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
22b0: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
22c0: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
22d0: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
22e0: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
22f0: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69  n.h"../*.** Defi
2300: 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f  ne various macro
2310: 73 20 74 68 61 74 20 61 72 65 20 6d 69 73 73 69  s that are missi
2320: 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73  ng from some sys
2330: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tems..*/.#ifndef
2340: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64   O_LARGEFILE.# d
2350: 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c  efine O_LARGEFIL
2360: 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  E 0.#endif.#ifde
2370: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
2380: 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c  _LFS.# undef O_L
2390: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
23a0: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
23b0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f  #endif.#ifndef O
23c0: 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69  _NOFOLLOW.# defi
23d0: 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a  ne O_NOFOLLOW 0.
23e0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f  #endif.#ifndef O
23f0: 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65  _BINARY.# define
2400: 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64   O_BINARY 0.#end
2410: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a  if../*.** The DJ
2420: 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76  GPP compiler env
2430: 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d  ironment looks m
2440: 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c  ostly like Unix,
2450: 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73   but it.** lacks
2460: 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   the fcntl() sys
2470: 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65  tem call.  So re
2480: 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74  define fcntl() t
2490: 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  o be something.*
24a0: 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20 73 75  * that always su
24b0: 63 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65  cceeds.  This me
24c0: 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67  ans that locking
24d0: 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
24e0: 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20  under.** DJGPP. 
24f0: 20 42 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d   But it is DOS -
2500: 20 77 68 61 74 20 64 69 64 20 79 6f 75 20 65 78   what did you ex
2510: 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20  pect?.*/.#ifdef 
2520: 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65 66 69  __DJGPP__.# defi
2530: 6e 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43 29 20  ne fcntl(A,B,C) 
2540: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
2550: 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63  The threadid mac
2560: 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74  ro resolves to t
2570: 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20  he thread-id or 
2580: 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a  to 0.  Used for.
2590: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  ** testing and d
25a0: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
25b0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
25c0: 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20  EADSAFE.#define 
25d0: 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64  threadid pthread
25e0: 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64  _self().#else.#d
25f0: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30  efine threadid 0
2600: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
2610: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73  Helper functions
2620: 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72   to obtain and r
2630: 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c  elinquish the gl
2640: 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a  obal mutex. The.
2650: 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  ** global mutex 
2660: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65  is used to prote
2670: 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  ct the unixInode
2680: 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f  Info and.** vxwo
2690: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
26a0: 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20 66  s used by this f
26b0: 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63  ile, all of whic
26c0: 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61  h may be .** sha
26d0: 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
26e0: 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
26f0: 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65  unction unixMute
2700: 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
2710: 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
2720: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
2730: 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  x .** is held wh
2740: 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
2750: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
2760: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
2770: 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  of assert() .** 
2780: 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
2790: 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74  .**.**   unixEnt
27a0: 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
27b0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
27c0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20  exHeld() );.**  
27d0: 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28   unixEnterLeave(
27e0: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
27f0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2800: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
2810: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
2820: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
2830: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
2840: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73  IC_MASTER));.}.s
2850: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c  tatic void unixL
2860: 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b  eaveMutex(void){
2870: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2880: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75  _leave(sqlite3Mu
2890: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
28a0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
28b0: 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20  TER));.}.#ifdef 
28c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
28d0: 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65  tic int unixMute
28e0: 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20  xHeld(void) {.  
28f0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
2900: 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65  utex_held(sqlite
2910: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
2920: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
2930: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64  MASTER));.}.#end
2940: 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  if...#ifdef SQLI
2950: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48  TE_DEBUG./*.** H
2960: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
2970: 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20  or printing out 
2980: 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  trace informatio
2990: 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67  n from debugging
29a0: 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68  .** binaries. Th
29b0: 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  is returns the s
29c0: 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61 74  tring represetat
29d0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c  ion of the suppl
29e0: 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c  ied.** integer l
29f0: 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61  ock-type..*/.sta
2a00: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2a10: 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65  azFileLock(int e
2a20: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69  FileLock){.  swi
2a30: 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29  tch( eFileLock )
2a40: 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f  {.    case NO_LO
2a50: 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45  CK: return "NONE
2a60: 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41 52  ";.    case SHAR
2a70: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
2a80: 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63 61  "SHARED";.    ca
2a90: 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  se RESERVED_LOCK
2aa0: 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52 56  : return "RESERV
2ab0: 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50 45  ED";.    case PE
2ac0: 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75  NDING_LOCK: retu
2ad0: 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20  rn "PENDING";.  
2ae0: 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45    case EXCLUSIVE
2af0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45  _LOCK: return "E
2b00: 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20  XCLUSIVE";.  }. 
2b10: 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b   return "ERROR";
2b20: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
2b30: 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  f SQLITE_LOCK_TR
2b40: 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  ACE./*.** Print 
2b50: 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  out information 
2b60: 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e  about all lockin
2b70: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  g operations..**
2b80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2b90: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f   is used for tro
2ba0: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63  ubleshooting loc
2bb0: 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61  ks on multithrea
2bc0: 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73  ded.** platforms
2bd0: 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d  .  Enable by com
2be0: 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20  piling with the 
2bf0: 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  -DSQLITE_LOCK_TR
2c00: 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c  ACE.** command-l
2c10: 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68  ine option on th
2c20: 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69  e compiler.  Thi
2c30: 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c  s code is normal
2c40: 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66  ly.** turned off
2c50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c60: 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64  lockTrace(int fd
2c70: 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74  , int op, struct
2c80: 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68   flock *p){.  ch
2c90: 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54  ar *zOpName, *zT
2ca0: 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20  ype;.  int s;.  
2cb0: 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  int savedErrno;.
2cc0: 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c    if( op==F_GETL
2cd0: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
2ce0: 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "GETLK";.  }e
2cf0: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45  lse if( op==F_SE
2d00: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
2d10: 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20  me = "SETLK";.  
2d20: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 66  }else{.    s = f
2d30: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
2d40: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
2d50: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75  gPrintf("fcntl u
2d60: 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c  nknown %d %d %d\
2d70: 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a  n", fd, op, s);.
2d80: 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20      return s;.  
2d90: 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  }.  if( p->l_typ
2da0: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
2db0: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
2dc0: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
2dd0: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
2de0: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
2df0: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "WRLCK";.  }els
2e00: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
2e10: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
2e20: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
2e30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2e40: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20  sert( 0 );.  }. 
2e50: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68   assert( p->l_wh
2e60: 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29  ence==SEEK_SET )
2e70: 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64  ;.  s = fcntl(fd
2e80: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65  , op, p);.  save
2e90: 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  dErrno = errno;.
2ea0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2eb0: 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25  intf("fcntl %d %
2ec0: 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64  d %s %s %d %d %d
2ed0: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72   %d\n",.     thr
2ee0: 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61  eadid, fd, zOpNa
2ef0: 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  me, zType, (int)
2f00: 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  p->l_start, (int
2f10: 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20  )p->l_len,.     
2f20: 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73  (int)p->l_pid, s
2f30: 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  );.  if( s==(-1)
2f40: 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20   && op==F_SETLK 
2f50: 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  && (p->l_type==F
2f60: 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74  _RDLCK || p->l_t
2f70: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b  ype==F_WRLCK) ){
2f80: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
2f90: 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a  k l2;.    l2 = *
2fa0: 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66 64 2c  p;.    fcntl(fd,
2fb0: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a   F_GETLK, &l2);.
2fc0: 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70      if( l2.l_typ
2fd0: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
2fe0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
2ff0: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  CK";.    }else i
3000: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
3010: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  WRLCK ){.      z
3020: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
3030: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
3040: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  .l_type==F_UNLCK
3050: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
3060: 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "UNLCK";.    }
3070: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
3080: 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20  rt( 0 );.    }. 
3090: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
30a0: 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69  rintf("fcntl-fai
30b0: 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20  lure-reason: %s 
30c0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
30d0: 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29      zType, (int)
30e0: 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  l2.l_start, (int
30f0: 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29  )l2.l_len, (int)
3100: 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20  l2.l_pid);.  }. 
3110: 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72   errno = savedEr
3120: 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b  rno;.  return s;
3130: 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e 74 6c  .}.#define fcntl
3140: 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69   lockTrace.#endi
3150: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  f /* SQLITE_LOCK
3160: 5f 54 52 41 43 45 20 2a 2f 0a 0a 0a 0a 2f 2a 0a  _TRACE */..../*.
3170: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3180: 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61  translates a sta
3190: 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e  ndard POSIX errn
31a0: 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65  o code into some
31b0: 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20  thing.** useful 
31c0: 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f  to the clients o
31d0: 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66 75  f the sqlite3 fu
31e0: 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66  nctions.  Specif
31f0: 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a  ically, it is.**
3200: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61   intended to tra
3210: 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74 79  nslate a variety
3220: 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22 20   of "try again" 
3230: 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49  errors into SQLI
3240: 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61  TE_BUSY.** and a
3250: 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65   variety of "ple
3260: 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69  ase close the fi
3270: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f  le descriptor NO
3280: 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a  W" errors into .
3290: 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  ** SQLITE_IOERR.
32a0: 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75  ** .** Errors du
32b0: 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74  ring initializat
32c0: 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72  ion of locks, or
32d0: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
32e0: 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a  port for locks,.
32f0: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65  ** should handle
3300: 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50   ENOLCK, ENOTSUP
3310: 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70  , EOPNOTSUPP sep
3320: 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  arately..*/.stat
3330: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72  ic int sqliteErr
3340: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
3350: 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c  (int posixError,
3360: 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72   int sqliteIOErr
3370: 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f  ) {.  switch (po
3380: 73 69 78 45 72 72 6f 72 29 20 7b 0a 20 20 63 61  sixError) {.  ca
3390: 73 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72  se 0: .    retur
33a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
33b0: 20 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a   .  case EAGAIN:
33c0: 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55  .  case ETIMEDOU
33d0: 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a  T:.  case EBUSY:
33e0: 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20  .  case EINTR:. 
33f0: 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a   case ENOLCK:  .
3400: 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46      /* random NF
3410: 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75  S retry error, u
3420: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
3430: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
3440: 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70   .     * introsp
3450: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
3460: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
3470: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
3480: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
3490: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a  LITE_BUSY;.    .
34a0: 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a    case EACCES: .
34b0: 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73      /* EACCES is
34c0: 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72   like EAGAIN dur
34d0: 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  ing locking oper
34e0: 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20  ations, but not 
34f0: 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f  any other time*/
3500: 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65  .    if( (sqlite
3510: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
3520: 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a  IOERR_LOCK) || .
3530: 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d  .(sqliteIOErr ==
3540: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
3550: 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69  LOCK) || ..(sqli
3560: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
3570: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20  E_IOERR_RDLOCK) 
3580: 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  ||..(sqliteIOErr
3590: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
35a0: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
35b0: 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  CK) ){.      ret
35c0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
35d0: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c  .    }.    /* el
35e0: 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  se fall through 
35f0: 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a  */.  case EPERM:
3600: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
3610: 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20  ITE_PERM;.    . 
3620: 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20   case EDEADLK:. 
3630: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3640: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a  _IOERR_BLOCKED;.
3650: 20 20 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53      .#if EOPNOTS
3660: 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63  UPP!=ENOTSUP.  c
3670: 61 73 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20  ase EOPNOTSUPP: 
3680: 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e  .    /* somethin
3690: 67 20 77 65 6e 74 20 74 65 72 72 69 62 6c 79 20  g went terribly 
36a0: 61 77 72 79 2c 20 75 6e 6c 65 73 73 20 64 75 72  awry, unless dur
36b0: 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ing file system 
36c0: 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20  support .     * 
36d0: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69  introspection, i
36e0: 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61  n which it actua
36f0: 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69  lly means what i
3700: 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66  t says */.#endif
3710: 0a 23 69 66 64 65 66 20 45 4e 4f 54 53 55 50 0a  .#ifdef ENOTSUP.
3720: 20 20 63 61 73 65 20 45 4e 4f 54 53 55 50 3a 20    case ENOTSUP: 
3730: 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20  .    /* invalid 
3740: 66 64 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  fd, unless durin
3750: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
3760: 70 70 6f 72 74 20 69 6e 74 72 6f 73 70 65 63 74  pport introspect
3770: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a 20  ion, in which . 
3780: 20 20 20 20 2a 20 69 74 20 61 63 74 75 61 6c 6c      * it actuall
3790: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
37a0: 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  says */.#endif. 
37b0: 20 63 61 73 65 20 45 49 4f 3a 0a 20 20 63 61 73   case EIO:.  cas
37c0: 65 20 45 42 41 44 46 3a 0a 20 20 63 61 73 65 20  e EBADF:.  case 
37d0: 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20 45  EINVAL:.  case E
37e0: 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20  NOTCONN:.  case 
37f0: 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73 65 20 45  ENODEV:.  case E
3800: 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f  NXIO:.  case ENO
3810: 45 4e 54 3a 0a 20 20 63 61 73 65 20 45 53 54 41  ENT:.  case ESTA
3820: 4c 45 3a 0a 20 20 63 61 73 65 20 45 4e 4f 53 59  LE:.  case ENOSY
3830: 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20  S:.    /* these 
3840: 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65  should force the
3850: 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65   client to close
3860: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65   the file and re
3870: 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a  connect */.    .
3880: 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20    default: .    
3890: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45  return sqliteIOE
38a0: 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a  rr;.  }.}..../**
38b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
3900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
3910: 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c  Begin Unique Fil
3920: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
3930: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
3940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
3950: 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69  ** On most versi
3960: 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20  ons of unix, we 
3970: 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65  can get a unique
3980: 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62   ID for a file b
3990: 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a  y concatenating.
39a0: 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75  ** the device nu
39b0: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f  mber and the ino
39c0: 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20  de number.  But 
39d0: 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f  this does not wo
39e0: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
39f0: 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20  * On VxWorks, a 
3a00: 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d  unique file id m
3a10: 75 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20  ust be based on 
3a20: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  the canonical fi
3a30: 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  lename..**.** A 
3a40: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
3a50: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
3a60: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3a70: 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73  e can be used as
3a80: 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c   a.** unique fil
3a90: 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e  e ID in VxWorks.
3aa0: 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20    Each instance 
3ab0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
3ac0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
3ad0: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f  copy of the cano
3ae0: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20  nical filename. 
3af0: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
3b00: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
3b10: 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63  .  .** The struc
3b20: 74 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65  ture is reclaime
3b30: 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
3b40: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
3b50: 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20   it drops to.** 
3b60: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  zero..**.** Ther
3b70: 65 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79  e are never very
3b80: 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e   many files open
3b90: 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64   at one time and
3ba0: 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74   lookups are not
3bb0: 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  .** a performanc
3bc0: 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c  e-critical path,
3bd0: 20 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63   so it is suffic
3be0: 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73  ient to put thes
3bf0: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20  e.** structures 
3c00: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
3c10: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f  ..*/.struct vxwo
3c20: 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74  rksFileId {.  st
3c30: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
3c40: 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e  Id *pNext;  /* N
3c50: 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66  ext in a list of
3c60: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69   them all */.  i
3c70: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3c90: 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
3ca0: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65  nces to this one
3cb0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cd0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
3ce0: 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e   the zCanonicalN
3cf0: 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a  ame[] string */.
3d00: 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63    char *zCanonic
3d10: 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  alName;         
3d20: 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  /* Canonical fil
3d30: 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  ename */.};..#if
3d40: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a   OS_VXWORKS./* .
3d50: 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69  ** All unique fi
3d60: 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64  lenames are held
3d70: 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   on a linked lis
3d80: 74 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73  t headed by this
3d90: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f  .** variable:.*/
3da0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
3db0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
3dc0: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
3dd0: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69  0;../*.** Simpli
3de0: 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e  fy a filename in
3df0: 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c  to its canonical
3e00: 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69   form.** by maki
3e10: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
3e20: 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20   changes:.**.** 
3e30: 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20   * removing any 
3e40: 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70  trailing and dup
3e50: 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63  licate /.**  * c
3e60: 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20  onvert /./ into 
3e70: 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  just /.**  * con
3e80: 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72  vert /A/../ wher
3e90: 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c  e A is any simpl
3ea0: 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74  e name into just
3eb0: 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73   /.**.** Changes
3ec0: 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61   are made in-pla
3ed0: 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ce.  Return the 
3ee0: 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e  new name length.
3ef0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
3f00: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
3f10: 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52  in z[0..n-1].  R
3f20: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
3f30: 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72   of.** character
3f40: 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66  s in the simplif
3f50: 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ied name..*/.sta
3f60: 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53  tic int vxworksS
3f70: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72  implifyName(char
3f80: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
3f90: 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65  nt i, j;.  while
3fa0: 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d  ( n>1 && z[n-1]=
3fb0: 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  ='/' ){ n--; }. 
3fc0: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
3fd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
3fe0: 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
3ff0: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f    if( z[i+1]=='/
4000: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
4010: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
4020: 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20  '.' && i+2<n && 
4030: 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+2]=='/' ){. 
4040: 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20         i += 1;. 
4050: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
4060: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4070: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
4080: 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+3<n && z[i+2
4090: 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d  ]=='.' && z[i+3]
40a0: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
40b0: 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a   while( j>0 && z
40c0: 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d  [j-1]!='/' ){ j-
40d0: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -; }.        if(
40e0: 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20   j>0 ){ j--; }. 
40f0: 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20         i += 2;. 
4100: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
4110: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4120: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
4130: 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30  ;.  }.  z[j] = 0
4140: 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a  ;.  return j;.}.
4150: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e  ./*.** Find a un
4160: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
4170: 20 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c   the given absol
4180: 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52  ute pathname.  R
4190: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
41a0: 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b  er to the vxwork
41b0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
41c0: 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73   This pointer is
41d0: 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66   the unique.** f
41e0: 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68  ile ID..**.** Th
41f0: 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20  e nRef field of 
4200: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
4210: 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72  d object is incr
4220: 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a  emented before.*
4230: 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  * the object is 
4240: 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77  returned.  A new
4250: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
4260: 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
4270: 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f  .** and added to
4280: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74   the global list
4290: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
42a0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
42b0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
42c0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
42d0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
42e0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
42f0: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
4300: 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63  ndFileId(const c
4310: 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61  har *zAbsoluteNa
4320: 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78  me){.  struct vx
4330: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
4340: 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65  w;         /* se
4350: 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77  arch key and new
4360: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74   file ID */.  st
4370: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
4380: 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20  Id *pCandidate; 
4390: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
43a0: 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66   over existing f
43b0: 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74  ile IDs */.  int
43c0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41   /* Length of zA
43f0: 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69  bsoluteName stri
4400: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
4410: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30   zAbsoluteName[0
4420: 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20  ]=='/' );.  n = 
4430: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73  (int)strlen(zAbs
4440: 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e  oluteName);.  pN
4450: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
4460: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  loc( sizeof(*pNe
4470: 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20  w) + (n+1) );.  
4480: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
4490: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
44a0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d  zCanonicalName =
44b0: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
44c0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  ;.  memcpy(pNew-
44d0: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
44e0: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20   zAbsoluteName, 
44f0: 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f  n+1);.  n = vxwo
4500: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
4510: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
4520: 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20  Name, n);..  /* 
4530: 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
4540: 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61  isting entry tha
4550: 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63  t matching the c
4560: 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20  anonical name.. 
4570: 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e   ** If found, in
4580: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
4590: 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20  rence count and 
45a0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
45b0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69   to.  ** the exi
45c0: 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20  sting file ID.. 
45d0: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
45e0: 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43  utex();.  for(pC
45f0: 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73  andidate=vxworks
4600: 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69  FileList; pCandi
4610: 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65  date; pCandidate
4620: 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65  =pCandidate->pNe
4630: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61  xt){.    if( pCa
4640: 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d  ndidate->nName==
4650: 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d  n .     && memcm
4660: 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43  p(pCandidate->zC
4670: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e  anonicalName, pN
4680: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
4690: 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b  me, n)==0.    ){
46a0: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .       sqlite3_
46b0: 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  free(pNew);.    
46c0: 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e     pCandidate->n
46d0: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e  Ref++;.       un
46e0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
46f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
4700: 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a  andidate;.    }.
4710: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74    }..  /* No mat
4720: 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57  ch was found.  W
4730: 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65  e will make a ne
4740: 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70  w file ID */.  p
4750: 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  New->nRef = 1;. 
4760: 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e   pNew->nName = n
4770: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
4780: 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  = vxworksFileLis
4790: 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65  t;.  vxworksFile
47a0: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75  List = pNew;.  u
47b0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
47c0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
47d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
47e0: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
47f0: 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f   count on a vxwo
4800: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
4810: 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f  .  Free.** the o
4820: 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72  bject when the r
4830: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
4840: 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a  eaches zero..*/.
4850: 73 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f  static void vxwo
4860: 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
4870: 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46  (struct vxworksF
4880: 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75  ileId *pId){.  u
4890: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
48a0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e  .  assert( pId->
48b0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d  nRef>0 );.  pId-
48c0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
48d0: 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Id->nRef==0 ){. 
48e0: 20 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b     struct vxwork
48f0: 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20  sFileId **pp;.  
4900: 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b    for(pp=&vxwork
4910: 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26  sFileList; *pp &
4920: 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d  & *pp!=pId; pp =
4930: 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29   &((*pp)->pNext)
4940: 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20  ){}.    assert( 
4950: 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20  *pp==pId );.    
4960: 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74  *pp = pId->pNext
4970: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
4980: 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75  ee(pId);.  }.  u
4990: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
49a0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  .}.#endif /* OS_
49b0: 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a  VXWORKS */./****
49c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
49d0: 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  of Unique File I
49e0: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
49f0: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
4a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
4a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
4a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
4ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ac0: 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41  ******** Posix A
4ad0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20  dvisory Locking 
4ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
4b00: 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  ** POSIX advisor
4b10: 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b  y locks are brok
4b20: 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41  en by design.  A
4b30: 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28  NSI STD 1003.1 (
4b40: 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e  1996).** section
4b50: 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34   6.5.2.2 lines 4
4b60: 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73  83 through 490 s
4b70: 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e  pecify that when
4b80: 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65   a process.** se
4b90: 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c  ts or clears a l
4ba0: 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74  ock, that operat
4bb0: 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  ion overrides an
4bc0: 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65  y prior locks se
4bd0: 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65  t.** by the same
4be0: 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f   process.  It do
4bf0: 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c  es not explicitl
4c00: 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68  y say so, but th
4c10: 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68  is implies.** th
4c20: 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20  at it overrides 
4c30: 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65  locks set by the
4c40: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73   same process us
4c50: 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a  ing a different.
4c60: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
4c70: 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68  or.  Consider th
4c80: 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a  is test case:.**
4c90: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
4ca0: 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  1 = open("./file
4cb0: 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  1", O_RDWR|O_CRE
4cc0: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20  AT, 0644);.**   
4cd0: 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70      int fd2 = op
4ce0: 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f  en("./file2", O_
4cf0: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
4d00: 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  44);.**.** Suppo
4d10: 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e  se ./file1 and .
4d20: 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c  /file2 are reall
4d30: 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  y the same file 
4d40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20  (because.** one 
4d50: 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d  is a hard or sym
4d60: 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68  bolic link to th
4d70: 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66  e other) then if
4d80: 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65   you set.** an e
4d90: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
4da0: 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74   fd1, then try t
4db0: 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69  o get an exclusi
4dc0: 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64  ve lock.** on fd
4dd0: 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20  2, it works.  I 
4de0: 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63  would have expec
4df0: 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c  ted the second l
4e00: 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73  ock to.** fail s
4e10: 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61  ince there was a
4e20: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e  lready a lock on
4e30: 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f   the file due to
4e40: 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74   fd1..** But not
4e50: 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68   so.  Since both
4e60: 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d   locks came from
4e70: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
4e80: 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  s, the.** second
4e90: 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66   overrides the f
4ea0: 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  irst, even thoug
4eb0: 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64  h they were on d
4ec0: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
4ed0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
4ee0: 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ned on different
4ef0: 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a   file names..**.
4f00: 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  ** This means th
4f10: 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  at we cannot use
4f20: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20   POSIX locks to 
4f30: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65  synchronize file
4f40: 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67   access.** among
4f50: 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61   competing threa
4f60: 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  ds of the same p
4f70: 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c  rocess.  POSIX l
4f80: 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66  ocks will work f
4f90: 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72  ine.** to synchr
4fa0: 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72  onize access for
4fb0: 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61   threads in sepa
4fc0: 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20  rate processes, 
4fd0: 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61  but not.** threa
4fe0: 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ds within the sa
4ff0: 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  me process..**.*
5000: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
5010: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51   the problem, SQ
5020: 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61  Lite has to mana
5030: 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e  ge file locks in
5040: 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69  ternally.** on i
5050: 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65  ts own.  Wheneve
5060: 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  r a new database
5070: 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68   is opened, we h
5080: 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  ave to find the.
5090: 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64  ** specific inod
50a0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
50b0: 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64  e file (the inod
50c0: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
50d0: 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76  by the.** st_dev
50e0: 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c   and st_ino fiel
50f0: 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73  ds of the stat s
5100: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73  tructure that fs
5110: 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a  tat() fills in).
5120: 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72  ** and check for
5130: 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65   locks already e
5140: 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20  xisting on that 
5150: 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63  inode.  When loc
5160: 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65  ks are.** create
5170: 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65  d or removed, we
5180: 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74   have to look at
5190: 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61   our own interna
51a0: 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a  l record of the.
51b0: 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20  ** locks to see 
51c0: 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  if another threa
51d0: 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  d has previously
51e0: 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   set a lock on t
51f0: 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64  hat same.** inod
5200: 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a  e..**.** (Aside:
5210: 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64   The use of inod
5220: 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69  e numbers as uni
5230: 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74  que IDs does not
5240: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
5250: 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73  ..** For VxWorks
5260: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65  , we have to use
5270: 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65   the alternative
5280: 20 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65   unique ID syste
5290: 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61  m based on.** ca
52a0: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
52b0: 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64   and implemented
52c0: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
52d0: 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a   division.).**.*
52e0: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69  * The sqlite3_fi
52f0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  le structure for
5300: 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e   POSIX is no lon
5310: 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65  ger just an inte
5320: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
5330: 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e  riptor.  It is n
5340: 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74  ow a structure t
5350: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e  hat holds the in
5360: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
5370: 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70  scriptor and a p
5380: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75  ointer to a stru
5390: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
53a0: 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61  ibes the interna
53b0: 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  l.** locks on th
53c0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
53d0: 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73  inode.  There is
53e0: 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   one locking str
53f0: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e  ucture.** per in
5400: 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73  ode, so if the s
5410: 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65  ame inode is ope
5420: 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20  ned twice, both 
5430: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
5440: 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  res.** point to 
5450: 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67  the same locking
5460: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
5470: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
5480: 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65  re keeps.** a re
5490: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73  ference count (s
54a0: 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  o we will know w
54b0: 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74  hen to delete it
54c0: 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a  ) and a "cnt".**
54d0: 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c   field that tell
54e0: 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61  s us its interna
54f0: 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20  l lock status.  
5500: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
5510: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  .** file is unlo
5520: 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d  cked.  cnt==-1 m
5530: 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61  eans the file ha
5540: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
5550: 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65  ock..** cnt>0 me
5560: 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e  ans there are cn
5570: 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f  t shared locks o
5580: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
5590: 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  * Any attempt to
55a0: 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
55b0: 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65  a file first che
55c0: 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a  cks the locking.
55d0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ** structure.  T
55e0: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
55f0: 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69  m call is only i
5600: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20  nvoked to set a 
5610: 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69  .** POSIX lock i
5620: 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c  f the internal l
5630: 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72  ock structure tr
5640: 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65  ansitions betwee
5650: 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e  n.** a locked an
5660: 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74  d an unlocked st
5670: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77  ate..**.** But w
5680: 61 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20  ait:  there are 
5690: 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d  yet more problem
56a0: 73 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76  s with POSIX adv
56b0: 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  isory locks..**.
56c0: 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20  ** If you close 
56d0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
56e0: 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
56f0: 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73   a file that has
5700: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c   locks,.** all l
5710: 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c  ocks on that fil
5720: 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64  e that are owned
5730: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
5740: 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72  process are.** r
5750: 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72  eleased.  To wor
5760: 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  k around this pr
5770: 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78  oblem, each unix
5780: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
5790: 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20  .** maintains a 
57a0: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
57b0: 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c  ber of pending l
57c0: 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64  ocks on tha inod
57d0: 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74  e..** When an at
57e0: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
57f0: 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69   close an unixFi
5800: 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  le, if there are
5810: 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69  .** other unixFi
5820: 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  le open on the s
5830: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
5840: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
5850: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
5860: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
5870: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
5880: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
5890: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
58a0: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e  clear..** The un
58b0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
58c0: 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69  cture keeps a li
58d0: 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72  st of file descr
58e0: 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  iptors that need
58f0: 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64   to.** be closed
5900: 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69   and that list i
5910: 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c  s walked (and cl
5920: 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20  eared) when the 
5930: 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65  last lock.** cle
5940: 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61  ars..**.** Yet a
5950: 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20  nother problem: 
5960: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f   LinuxThreads do
5970: 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77   not play well w
5980: 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e  ith posix locks.
5990: 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65  .**.** Many olde
59a0: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69  r versions of li
59b0: 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75  nux use the Linu
59c0: 78 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79  xThreads library
59d0: 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74   which is.** not
59e0: 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74   posix compliant
59f0: 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68  .  Under LinuxTh
5a00: 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72  reads, a lock cr
5a10: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a  eated by thread.
5a20: 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d  ** A cannot be m
5a30: 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72  odified or overr
5a40: 69 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65  idden by a diffe
5a50: 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a  rent thread B..*
5a60: 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20  * Only thread A 
5a70: 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c  can modify the l
5a80: 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65  ock.  Locking be
5a90: 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63  havior is correc
5aa0: 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c  t.** if the appl
5ab0: 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  iation uses the 
5ac0: 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73  newer Native Pos
5ad0: 69 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72  ix Thread Librar
5ae0: 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c  y (NPTL).** on l
5af0: 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c  inux - with NPTL
5b00: 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20   a lock created 
5b10: 62 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  by thread A can 
5b20: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a  override locks.*
5b30: 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20  * in thread B.  
5b40: 42 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  But there is no 
5b50: 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63  way to know at c
5b60: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63  ompile-time whic
5b70: 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c  h.** threading l
5b80: 69 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20  ibrary is being 
5b90: 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20  used.  So there 
5ba0: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
5bb0: 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d  w at.** compile-
5bc0: 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20  time whether or 
5bd0: 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e  not thread A can
5be0: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20   override locks 
5bf0: 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  on thread B..** 
5c00: 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20  One has to do a 
5c10: 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74  run-time check t
5c20: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62  o discover the b
5c30: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a  ehavior of the.*
5c40: 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  * current proces
5c50: 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
5c60: 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  used to support 
5c70: 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42  LinuxThreads.  B
5c80: 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c  ut support for L
5c90: 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77  inuxThreads.** w
5ca0: 61 73 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e  as dropped begin
5cb0: 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f  ning with versio
5cc0: 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65  n 3.7.0.  SQLite
5cd0: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b   will still work
5ce0: 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68   with.** LinuxTh
5cf0: 72 65 61 64 73 20 70 72 6f 76 69 64 65 64 20 74  reads provided t
5d00: 68 61 74 20 28 31 29 20 74 68 65 72 65 20 69 73  hat (1) there is
5d10: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  e connection .**
5d30: 20 70 65 72 20 64 61 74 61 62 61 73 65 20 66 69   per database fi
5d40: 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  le in the same p
5d50: 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20 64  rocess and (2) d
5d60: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5d70: 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f  ons.** do not mo
5d80: 76 65 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ve across thread
5d90: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  s..*/../*.** An 
5da0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
5db0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
5dc0: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
5dd0: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
5de0: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
5df0: 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ular unixInodeIn
5e00: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
5e10: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
5e20: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e40: 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72  /* Device number
5e50: 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   */.#if OS_VXWOR
5e60: 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  KS.  struct vxwo
5e70: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20  rksFileId *pId; 
5e80: 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20   /* Unique file 
5e90: 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20  ID for vxworks. 
5ea0: 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74  */.#else.  ino_t
5eb0: 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20   ino;           
5ec0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20         /* Inode 
5ed0: 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66  number */.#endif
5ee0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
5ef0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
5f00: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
5f10: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  e is allocated f
5f20: 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20  or each open.** 
5f30: 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c  inode.  Or, on L
5f40: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68 65  inuxThreads, the
5f50: 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  re is one of the
5f60: 73 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  se structures fo
5f70: 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20  r.** each inode 
5f80: 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68 20 74  opened by each t
5f90: 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  hread..**.** A s
5fa0: 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20  ingle inode can 
5fb0: 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69  have multiple fi
5fc0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20  le descriptors, 
5fd0: 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65  so each unixFile
5fe0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f  .** structure co
5ff0: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
6000: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
6010: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61  of this object a
6020: 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63  nd this.** objec
6030: 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20  t keeps a count 
6040: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
6050: 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69   unixFile pointi
6060: 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72  ng to it..*/.str
6070: 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  uct unixInodeInf
6080: 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  o {.  struct uni
6090: 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20  xFileId fileId; 
60a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f        /* The loo
60b0: 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  kup key */.  int
60c0: 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20 20   nShared;       
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
60e0: 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44  Number of SHARED
60f0: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
6100: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 3b 20   int eFileLock; 
6110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6120: 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45   /* One of SHARE
6130: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
6140: 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20  _LOCK etc. */.  
6150: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
6160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6170: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69  /* Number of poi
6180: 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74  nters to this st
6190: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69  ructure */.  uni
61a0: 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
61b0: 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
61c0: 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73  Shared memory as
61d0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
61e0: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  is inode */.  in
61f0: 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  t nLock;        
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6210: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   Number of outst
6220: 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  anding file lock
6230: 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65  s */.  UnixUnuse
6240: 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20  dFd *pUnused;   
6250: 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64         /* Unused
6260: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6270: 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  s to close */.  
6280: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
6290: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
62a0: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75  /* List of all u
62b0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
62c0: 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  ects */.  unixIn
62d0: 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20  odeInfo *pPrev; 
62e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20            /*    
62f0: 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b  .... doubly link
6300: 65 64 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  ed */.#if define
6310: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
6320: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 20  LOCKING_STYLE). 
6330: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
6340: 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20  ong sharedByte; 
6350: 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75   /* for AFP simu
6360: 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63  lated shared loc
6370: 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  k */.#endif.#if 
6380: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d  OS_VXWORKS.  sem
6390: 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20  _t *pSem;       
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
63b0: 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61  Named POSIX sema
63c0: 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20  phore */.  char 
63d0: 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54  aSemName[MAX_PAT
63e0: 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61  HNAME+2];  /* Na
63f0: 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70  me of that semap
6400: 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  hore */.#endif.}
6410: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73  ;../*.** A lists
6420: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64   of all unixInod
6430: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a  eInfo objects..*
6440: 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f  /.static unixIno
6450: 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73  deInfo *inodeLis
6460: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a  t = 0;../*.**.**
6470: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d   This function -
6480: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28   unixLogError_x(
6490: 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20  ), is only ever 
64a0: 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d  called via the m
64b0: 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45  acro.** unixLogE
64c0: 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74  rror()..**.** It
64d0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
64e0: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  r an error occur
64f0: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74  s in an OS funct
6500: 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61  ion and errno ha
6510: 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49  s been.** set. I
6520: 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65  t logs a message
6530: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c   using sqlite3_l
6540: 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20  og() containing 
6550: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
6560: 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e  e of.** errno an
6570: 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20  d, if possible, 
6580: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
6590: 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72  le equivalent fr
65a0: 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72  om strerror() or
65b0: 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29  .** strerror_r()
65c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
65d0: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
65e0: 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73  d to the macro s
65f0: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72  hould be the err
6600: 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  or code that.** 
6610: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
6620: 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e   to SQLite (e.g.
6630: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
6640: 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  LETE, SQLITE_CAN
6650: 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20  TOPEN). .** The 
6660: 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61  two subsequent a
6670: 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  rguments should 
6680: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  be the name of t
6690: 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  he OS function t
66a0: 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65  hat.** failed (e
66b0: 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f  .g. "unlink", "o
66c0: 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20 74 68  pen") and the th
66d0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  e associated fil
66e0: 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a  e-system path,.*
66f0: 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65  * if any..*/.#de
6700: 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f  fine unixLogErro
6710: 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69  r(a,b,c)     uni
6720: 78 4c 6f 67 45 72 72 6f 72 5f 78 28 61 2c 62 2c  xLogError_x(a,b,
6730: 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74  c,__LINE__).stat
6740: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72  ic int unixLogEr
6750: 72 6f 72 5f 78 28 0a 20 20 69 6e 74 20 65 72 72  ror_x(.  int err
6760: 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  code,           
6770: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69           /* SQLi
6780: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
6790: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
67a0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
67b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53     /* Name of OS
67c0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66   function that f
67d0: 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ailed */.  const
67e0: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
67f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
6800: 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74  le path associat
6810: 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f  ed with error */
6820: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20  .  int iLine    
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6840: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e     /* Source lin
6850: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65  e number where e
6860: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
6870: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  .){.  char *zErr
6880: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6890: 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65        /* Message
68a0: 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29   from strerror()
68b0: 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a   or equivalent *
68c0: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
68d0: 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73  is not a threads
68e0: 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54  afe build (SQLIT
68f0: 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29  E_THREADSAFE==0)
6900: 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20  , then use.  ** 
6910: 74 68 65 20 73 74 72 65 72 72 6f 72 28 29 20 66  the strerror() f
6920: 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  unction to obtai
6930: 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64  n the human-read
6940: 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61  able error messa
6950: 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65  ge.  ** equivale
6960: 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68  nt to errno. Oth
6970: 65 72 77 69 73 65 2c 20 75 73 65 20 73 74 72 65  erwise, use stre
6980: 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a  rror_r()..  */ .
6990: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
69a0: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
69b0: 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52  (HAVE_STRERROR_R
69c0: 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38 30  ).  char aErr[80
69d0: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72  ];.  memset(aErr
69e0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72  , 0, sizeof(aErr
69f0: 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72  ));.  zErr = aEr
6a00: 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45  r;..  /* If STRE
6a10: 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73  RROR_R_CHAR_P (s
6a20: 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73  et by autoconf s
6a30: 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45  cripts) or __USE
6a40: 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c  _GNU is defined,
6a50: 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61  .  ** assume tha
6a60: 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f  t the system pro
6a70: 76 69 64 65 73 20 74 68 65 20 74 68 65 20 47 4e  vides the the GN
6a80: 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72  U version of str
6a90: 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74 20 0a  error_r() that .
6aa0: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70    ** returns a p
6ab0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
6ac0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
6ad0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
6ae0: 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20   That pointer . 
6af0: 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   ** may point to
6b00: 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d   aErr[], or it m
6b10: 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ay point to some
6b20: 20 73 74 61 74 69 63 20 73 74 6f 72 61 67 65 20   static storage 
6b30: 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a  somewhere. .  **
6b40: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75   Otherwise, assu
6b50: 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74  me that the syst
6b60: 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  em provides the 
6b70: 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66  POSIX version of
6b80: 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f   .  ** strerror_
6b90: 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79  r(), which alway
6ba0: 73 20 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f  s writes an erro
6bb0: 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61  r message into a
6bc0: 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Err[]..  **.  **
6bd0: 20 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63   If the code inc
6be0: 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73  orrectly assumes
6bf0: 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
6c00: 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68  POSIX version th
6c10: 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c  at is.  ** avail
6c20: 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20  able, the error 
6c30: 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74  message will oft
6c40: 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73  en be an empty s
6c50: 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a  tring. Not a.  *
6c60: 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20  * huge problem. 
6c70: 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63  Incorrectly conc
6c80: 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68 65 20  luding that the 
6c90: 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61  GNU version is a
6ca0: 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63  vailable .  ** c
6cb0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73  ould lead to a s
6cc0: 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a  egfault though..
6cd0: 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
6ce0: 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52  (STRERROR_R_CHAR
6cf0: 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  _P) || defined(_
6d00: 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72  _USE_GNU).  zErr
6d10: 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74   = .# endif.  st
6d20: 72 65 72 72 6f 72 5f 72 28 65 72 72 6e 6f 2c 20  rerror_r(errno, 
6d30: 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72  aErr, sizeof(aEr
6d40: 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51  r)-1);..#elif SQ
6d50: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
6d60: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74    /* This is a t
6d70: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c  hreadsafe build,
6d80: 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28   but strerror_r(
6d90: 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  ) is not availab
6da0: 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20  le. */.  zErr = 
6db0: 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e  "";.#else.  /* N
6dc0: 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62 75  on-threadsafe bu
6dd0: 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f  ild, use strerro
6de0: 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d  r(). */.  zErr =
6df0: 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29   strerror(errno)
6e00: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
6e10: 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c  rt( errcode!=SQL
6e20: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69  ITE_OK );.  sqli
6e30: 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c  te3_log(errcode,
6e40: 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e  .      "os_unix.
6e50: 63 3a 20 25 73 28 29 20 61 74 20 6c 69 6e 65 20  c: %s() at line 
6e60: 25 64 20 2d 20 5c 22 25 73 5c 22 20 65 72 72 6e  %d - \"%s\" errn
6e70: 6f 3d 25 64 20 70 61 74 68 3d 25 73 22 2c 0a 20  o=%d path=%s",. 
6e80: 20 20 20 20 20 7a 46 75 6e 63 2c 20 69 4c 69 6e       zFunc, iLin
6e90: 65 2c 20 7a 45 72 72 2c 20 65 72 72 6e 6f 2c 20  e, zErr, errno, 
6ea0: 28 7a 50 61 74 68 20 3f 20 7a 50 61 74 68 20 3a  (zPath ? zPath :
6eb0: 20 22 6e 2f 61 22 29 0a 20 20 29 3b 0a 0a 20 20   "n/a").  );..  
6ec0: 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a  return errcode;.
6ed0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  }.../*.** Close 
6ee0: 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  all file descrip
6ef0: 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64 20  tors accumuated 
6f00: 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  in the unixInode
6f10: 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69  Info->pUnused li
6f20: 73 74 2e 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  st..** If all su
6f30: 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ch file descript
6f40: 6f 72 73 20 61 72 65 20 63 6c 6f 73 65 64 20 77  ors are closed w
6f50: 69 74 68 6f 75 74 20 65 72 72 6f 72 2c 20 74 68  ithout error, th
6f60: 65 20 6c 69 73 74 20 69 73 0a 2a 2a 20 63 6c 65  e list is.** cle
6f70: 61 72 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  ared and SQLITE_
6f80: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
6f90: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
6fa0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
6fb0: 2c 20 74 68 65 6e 20 73 75 63 63 65 73 73 66 75  , then successfu
6fc0: 6c 6c 79 20 63 6c 6f 73 65 64 20 66 69 6c 65 20  lly closed file 
6fd0: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 65 6e  descriptor.** en
6fe0: 74 72 69 65 73 20 61 72 65 20 72 65 6d 6f 76 65  tries are remove
6ff0: 64 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 2c  d from the list,
7000: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
7010: 52 5f 43 4c 4f 53 45 20 72 65 74 75 72 6e 65 64  R_CLOSE returned
7020: 2e 20 0a 2a 2a 20 6e 6f 74 20 64 65 6c 65 74 65  . .** not delete
7030: 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  d and SQLITE_IOE
7040: 52 52 5f 43 4c 4f 53 45 20 72 65 74 75 72 6e 65  RR_CLOSE returne
7050: 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e  d..*/ .static in
7060: 74 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64  t closePendingFd
7070: 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  s(unixFile *pFil
7080: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
7090: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
70a0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
70b0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
70c0: 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  e;.  UnixUnusedF
70d0: 64 20 2a 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20  d *pError = 0;. 
70e0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
70f0: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
7100: 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
7110: 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64  =pInode->pUnused
7120: 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
7130: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
7140: 65 78 74 3b 0a 20 20 20 20 69 66 28 20 63 6c 6f  ext;.    if( clo
7150: 73 65 28 70 2d 3e 66 64 29 20 29 7b 0a 20 20 20  se(p->fd) ){.   
7160: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
7170: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
7180: 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
7190: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
71a0: 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22  R_CLOSE, "close"
71b0: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
71c0: 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  .      p->pNext 
71d0: 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  = pError;.      
71e0: 70 45 72 72 6f 72 20 3d 20 70 3b 0a 20 20 20 20  pError = p;.    
71f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
7200: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
7210: 20 20 7d 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65    }.  }.  pInode
7220: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 45 72 72  ->pUnused = pErr
7230: 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  or;.  return rc;
7240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
7250: 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  e a unixInodeInf
7260: 6f 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76  o structure prev
7270: 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
7280: 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   by findInodeInf
7290: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  o()..**.** The m
72a0: 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69  utex entered usi
72b0: 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  ng the unixEnter
72c0: 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  Mutex() function
72d0: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
72e0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
72f0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
7300: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
7310: 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75  leaseInodeInfo(u
7320: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
7330: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
7340: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
7350: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
7360: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
7370: 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  d() );.  if( pIn
7380: 6f 64 65 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  ode ){.    pInod
7390: 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  e->nRef--;.    i
73a0: 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d  f( pInode->nRef=
73b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
73c0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  rt( pInode->pShm
73d0: 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Node==0 );.     
73e0: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
73f0: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  (pFile);.      i
7400: 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76  f( pInode->pPrev
7410: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
7420: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  rt( pInode->pPre
7430: 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65  v->pNext==pInode
7440: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   );.        pIno
7450: 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  de->pPrev->pNext
7460: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
7470: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7480: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
7490: 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65  nodeList==pInode
74a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f 64   );.        inod
74b0: 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  eList = pInode->
74c0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
74d0: 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
74e0: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
74f0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
7500: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d  ->pNext->pPrev==
7510: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
7520: 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d    pInode->pNext-
7530: 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d  >pPrev = pInode-
7540: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a  >pPrev;.      }.
7550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
7560: 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  ee(pInode);.    
7570: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
7580: 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  iven a file desc
7590: 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74  riptor, locate t
75a0: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
75b0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
75c0: 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66  describes that f
75d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
75e0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
75f0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  e if necessary. 
7600: 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
7610: 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75 6e  alue might be un
7620: 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61  initialized if a
7630: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
7640: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
7650: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
7660: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
7670: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
7680: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
7690: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
76a0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
76b0: 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70  Return an approp
76c0: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
76d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
76e0: 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20  findInodeInfo(. 
76f0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
7700: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7710: 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74  /* Unix file wit
7720: 68 20 66 69 6c 65 20 64 65 73 63 20 75 73 65 64  h file desc used
7730: 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20   in the key */. 
7740: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
7750: 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20 20  *ppInode        
7760: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e  /* Return the un
7770: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
7780: 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ct here */.){.  
7790: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
77a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
77b0: 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 65  * System call re
77c0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
77d0: 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
77e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
77f0: 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
7800: 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20 2a  ptor for pFile *
7810: 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46  /.  struct unixF
7820: 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20  ileId fileId;   
7830: 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79     /* Lookup key
7840: 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e 6f   for the unixIno
7850: 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75  deInfo */.  stru
7860: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
7870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
7880: 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66  w-level file inf
7890: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e  ormation */.  un
78a0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
78b0: 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ode = 0;     /* 
78c0: 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49 6e  Candidate unixIn
78d0: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a  odeInfo object *
78e0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  /..  assert( uni
78f0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
7900: 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65  .  /* Get low-le
7910: 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  vel information 
7920: 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74  about the file t
7930: 68 61 74 20 77 65 20 63 61 6e 20 75 73 65 64 20  hat we can used 
7940: 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61  to.  ** create a
7950: 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72   unique name for
7960: 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
7970: 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b    fd = pFile->h;
7980: 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28 66 64  .  rc = fstat(fd
7990: 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69  , &statbuf);.  i
79a0: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
79b0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
79c0: 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66   = errno;.#ifdef
79d0: 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69   EOVERFLOW.    i
79e0: 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  f( pFile->lastEr
79f0: 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29  rno==EOVERFLOW )
7a00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
7a10: 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20  OLFS;.#endif.   
7a20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
7a30: 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  OERR;.  }..#ifde
7a40: 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a  f __APPLE__.  /*
7a50: 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d   On OS X on an m
7a60: 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c  sdos filesystem,
7a70: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
7a80: 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20  r is reported.  
7a90: 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66  ** incorrectly f
7aa0: 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c  or zero-size fil
7ab0: 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  es.  See ticket 
7ac0: 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a  #3260.  To work.
7ad0: 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73    ** around this
7ae0: 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e   problem (we con
7af0: 73 69 64 65 72 20 69 74 20 61 20 62 75 67 20 69  sider it a bug i
7b00: 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69  n OS X, not SQLi
7b10: 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61  te).  ** we alwa
7b20: 79 73 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  ys increase the 
7b30: 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62  file size to 1 b
7b40: 79 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67  y writing a sing
7b50: 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69  le byte.  ** pri
7b60: 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20  or to accessing 
7b70: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
7b80: 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20  .  The one byte 
7b90: 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20  written is.  ** 
7ba0: 61 6e 20 41 53 43 49 49 20 27 53 27 20 63 68 61  an ASCII 'S' cha
7bb0: 72 61 63 74 65 72 20 77 68 69 63 68 20 61 6c 73  racter which als
7bc0: 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  o happens to be 
7bd0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20  the first byte. 
7be0: 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65   ** in the heade
7bf0: 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74  r of every SQLit
7c00: 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20  e database.  In 
7c10: 74 68 69 73 20 77 61 79 2c 20 69 66 20 74 68 65  this way, if the
7c20: 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63  re.  ** is a rac
7c30: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68  e condition such
7c40: 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68   that another th
7c50: 72 65 61 64 20 68 61 73 20 61 6c 72 65 61 64 79  read has already
7c60: 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20   populated.  ** 
7c70: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
7c80: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  f the database, 
7c90: 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e  no damage is don
7ca0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74  e..  */.  if( st
7cb0: 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30  atbuf.st_size==0
7cc0: 20 26 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c   && (pFile->fsFl
7cd0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46  ags & SQLITE_FSF
7ce0: 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d  LAGS_IS_MSDOS)!=
7cf0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 72  0 ){.    rc = wr
7d00: 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b  ite(fd, "S", 1);
7d10: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29  .    if( rc!=1 )
7d20: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
7d30: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
7d40: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
7d50: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
7d60: 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 73 74 61   }.    rc = fsta
7d70: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b  t(fd, &statbuf);
7d80: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
7d90: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
7da0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
7db0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
7dc0: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
7dd0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
7de0: 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c   memset(&fileId,
7df0: 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49   0, sizeof(fileI
7e00: 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65  d));.  fileId.de
7e10: 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64  v = statbuf.st_d
7e20: 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  ev;.#if OS_VXWOR
7e30: 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20  KS.  fileId.pId 
7e40: 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65  = pFile->pId;.#e
7e50: 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f  lse.  fileId.ino
7e60: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e   = statbuf.st_in
7e70: 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f  o;.#endif.  pIno
7e80: 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  de = inodeList;.
7e90: 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20    while( pInode 
7ea0: 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49  && memcmp(&fileI
7eb0: 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  d, &pInode->file
7ec0: 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49  Id, sizeof(fileI
7ed0: 64 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  d)) ){.    pInod
7ee0: 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  e = pInode->pNex
7ef0: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  t;.  }.  if( pIn
7f00: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49  ode==0 ){.    pI
7f10: 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  node = sqlite3_m
7f20: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
7f30: 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66  Inode) );.    if
7f40: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
7f50: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7f60: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
7f70: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64      memset(pInod
7f80: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  e, 0, sizeof(*pI
7f90: 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63  node));.    memc
7fa0: 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  py(&pInode->file
7fb0: 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a  Id, &fileId, siz
7fc0: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
7fd0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d    pInode->nRef =
7fe0: 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   1;.    pInode->
7ff0: 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73  pNext = inodeLis
8000: 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70  t;.    pInode->p
8010: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66  Prev = 0;.    if
8020: 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e  ( inodeList ) in
8030: 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  odeList->pPrev =
8040: 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f   pInode;.    ino
8050: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b  deList = pInode;
8060: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
8070: 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  node->nRef++;.  
8080: 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70  }.  *ppInode = p
8090: 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20  Inode;.  return 
80a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
80b0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
80c0: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
80d0: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
80e0: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
80f0: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
8100: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
8110: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
8120: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
8130: 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
8140: 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
8150: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
8160: 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
8170: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
8180: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
8190: 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
81a0: 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
81b0: 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
81c0: 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
81d0: 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
81e0: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63  tic int unixChec
81f0: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
8200: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
8210: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
8220: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8230: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
8240: 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
8250: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
8260: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
8270: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
8280: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
8290: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
82a0: 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73  DLOCK; );..  ass
82b0: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
82c0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
82d0: 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69  ; /* Because pFi
82e0: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
82f0: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
8300: 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ads */..  /* Che
8310: 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
8320: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
8330: 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
8340: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
8350: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
8360: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
8370: 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
8380: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74   1;.  }..  /* Ot
8390: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
83a0: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
83b0: 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f  s holds it..  */
83c0: 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50  .#ifndef __DJGPP
83d0: 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  __.  if( !reserv
83e0: 65 64 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  ed ){.    struct
83f0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
8400: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
8410: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
8420: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
8430: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
8440: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
8450: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
8460: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
8470: 69 66 20 28 2d 31 20 3d 3d 20 66 63 6e 74 6c 28  if (-1 == fcntl(
8480: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c  pFile->h, F_GETL
8490: 4b 2c 20 26 6c 6f 63 6b 29 29 20 7b 0a 20 20 20  K, &lock)) {.   
84a0: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
84b0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
84c0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
84d0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
84e0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
84f0: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
8500: 43 4b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  CK);.      pFile
8510: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
8520: 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65  rrno;.    } else
8530: 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65   if( lock.l_type
8540: 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  !=F_UNLCK ){.   
8550: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
8560: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
8570: 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  f.  .  unixLeave
8580: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
8590: 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
85a0: 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78  K %d %d %d (unix
85b0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
85c0: 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
85d0: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
85e0: 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
85f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
8600: 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
8610: 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
8620: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
8630: 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
8640: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
8650: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
8660: 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
8670: 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
8680: 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
8690: 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
86a0: 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
86b0: 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
86c0: 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
86d0: 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
86e0: 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
86f0: 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
8700: 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
8710: 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
8720: 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
8730: 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
8740: 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
8750: 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
8760: 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
8770: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
8780: 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
8790: 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
87a0: 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
87b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
87c0: 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
87d0: 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
87e0: 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
87f0: 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
8800: 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
8810: 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
8820: 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
8830: 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
8840: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
8850: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
8860: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
8870: 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
8880: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
8890: 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
88a0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
88b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
88c0: 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
88d0: 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
88e0: 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
88f0: 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
8900: 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
8910: 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
8920: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28  ic int unixLock(
8930: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
8940: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
8950: 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  {.  /* The follo
8960: 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74  wing describes t
8970: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
8980: 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73  n of the various
8990: 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20   locks and.  ** 
89a0: 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73  lock transitions
89b0: 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65   in terms of the
89c0: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
89d0: 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75  shared and exclu
89e0: 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70  sive.  ** lock p
89f0: 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65  rimitives (calle
8a00: 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64  d read-locks and
8a10: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c   write-locks bel
8a20: 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a  ow, to avoid.  *
8a30: 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68  * confusion with
8a40: 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d   SQLite lock nam
8a50: 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74  es). The algorit
8a60: 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61  hms are complica
8a70: 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c  ted.  ** slightl
8a80: 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  y in order to be
8a90: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
8aa0: 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   windows systems
8ab0: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a   simultaneously.
8ac0: 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74    ** accessing t
8ad0: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
8ae0: 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74   file, in case t
8af0: 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75  hat is ever requ
8b00: 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ired..  **.  ** 
8b10: 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20  Symbols defined 
8b20: 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66  in os.h indentif
8b30: 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  y the 'pending b
8b40: 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65  yte' and the 're
8b50: 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65  served.  ** byte
8b60: 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62  ', each single b
8b70: 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f  ytes at well kno
8b80: 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20  wn offsets, and 
8b90: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
8ba0: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20  .  ** range', a 
8bb0: 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74  range of 510 byt
8bc0: 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f  es at a well kno
8bd0: 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a  wn offset..  **.
8be0: 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61    ** To obtain a
8bf0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20   SHARED lock, a 
8c00: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  read-lock is obt
8c10: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65  ained on the 'pe
8c20: 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27  nding.  ** byte'
8c30: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75  .  If this is su
8c40: 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64  ccessful, a rand
8c50: 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65  om byte from the
8c60: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
8c70: 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65 61  ** range' is rea
8c80: 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65  d-locked and the
8c90: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65   lock on the 'pe
8ca0: 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65  nding byte' rele
8cb0: 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ased..  **.  ** 
8cc0: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
8cd0: 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  ly obtain a RESE
8ce0: 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20  RVED lock after 
8cf0: 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44 20  it has a SHARED 
8d00: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53  lock..  ** A RES
8d10: 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d  ERVED lock is im
8d20: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61  plemented by gra
8d30: 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  bbing a write-lo
8d40: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27  ck on the.  ** '
8d50: 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e 20  reserved byte'. 
8d60: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f  .  **.  ** A pro
8d70: 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62  cess may only ob
8d80: 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c  tain a PENDING l
8d90: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
8da0: 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a   obtained a.  **
8db0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20   SHARED lock. A 
8dc0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
8dd0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f  implemented by o
8de0: 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65  btaining a write
8df0: 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68  -lock.  ** on th
8e00: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
8e10: 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
8e20: 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45  hat no new SHARE
8e30: 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20  D locks can be. 
8e40: 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75   ** obtained, bu
8e50: 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52 45  t existing SHARE
8e60: 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f  D locks are allo
8e70: 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20  wed to persist. 
8e80: 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64  A process.  ** d
8e90: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
8ea0: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
8eb0: 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61  D lock on the wa
8ec0: 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c  y to a PENDING l
8ed0: 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70  ock..  ** This p
8ee0: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
8ef0: 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d  by the algorithm
8f00: 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63   for rolling bac
8f10: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  k a journal file
8f20: 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72  .  ** after a cr
8f30: 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ash..  **.  ** A
8f40: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
8f50: 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72  , obtained after
8f60: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
8f70: 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a  is held, is.  **
8f80: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
8f90: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
8fa0: 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e  e-lock on the en
8fb0: 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79 74  tire 'shared byt
8fc0: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53  e.  ** range'. S
8fd0: 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c  ince all other l
8fe0: 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20 72  ocks require a r
8ff0: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20  ead-lock on one 
9000: 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a  of the bytes.  *
9010: 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72 61  * within this ra
9020: 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65  nge, this ensure
9030: 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  s that no other 
9040: 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f  locks are held o
9050: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
9060: 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ase. .  **.  ** 
9070: 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e  The reason a sin
9080: 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20  gle byte cannot 
9090: 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  be used instead 
90a0: 6f 66 20 74 68 65 20 27 73 68 61 72 65 64 20 62  of the 'shared b
90b0: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
90c0: 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72  is that some ver
90d0: 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73  sions of windows
90e0: 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
90f0: 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20  read-locks. By. 
9100: 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61   ** locking a ra
9110: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61  ndom byte from a
9120: 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65   range, concurre
9130: 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  nt SHARED locks 
9140: 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65  may exist.  ** e
9150: 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69  ven if the locki
9160: 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75 73 65  ng primitive use
9170: 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 77 72  d is always a wr
9180: 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ite-lock..  */. 
9190: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
91a0: 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
91b0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
91c0: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
91d0: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
91e0: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
91f0: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
9200: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 20 3d 20  lock;.  int s = 
9210: 30 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  0;.  int tErrno 
9220: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
9230: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
9240: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
9250: 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
9260: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
9270: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
9280: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
9290: 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
92a0: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
92b0: 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a  eLock),.      az
92c0: 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d  FileLock(pInode-
92d0: 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e  >eFileLock), pIn
92e0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67  ode->nShared , g
92f0: 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a  etpid()));..  /*
9300: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
9310: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
9320: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
9330: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
9340: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
9350: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
9360: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
9370: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
9380: 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
9390: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
93a0: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
93b0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
93c0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
93d0: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
93e0: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
93f0: 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
9400: 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78  eady held) (unix
9410: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
9420: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69              azFi
9430: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
9440: 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
9450: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
9460: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
9470: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
9480: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  nce is correct..
9490: 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
94a0: 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
94b0: 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
94c0: 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
94d0: 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
94e0: 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
94f0: 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
9500: 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
9510: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
9520: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
9530: 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
9540: 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
9550: 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
9560: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
9570: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
9580: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
9590: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
95a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
95b0: 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
95c0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
95d0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
95e0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
95f0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
9600: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
9610: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
9620: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
9630: 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
9640: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
9650: 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
9660: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
9670: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
9680: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
9690: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
96a0: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
96b0: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
96c0: 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
96d0: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
96e0: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
96f0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
9700: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
9710: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
9720: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
9730: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
9740: 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  k && .          
9750: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
9760: 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
9770: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
9780: 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  ARED_LOCK)).  ){
9790: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
97a0: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
97b0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
97c0: 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
97d0: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
97e0: 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
97f0: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
9800: 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
9810: 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
9820: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
9830: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
9840: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
9850: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
9860: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
9870: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
9880: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
9890: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
98a0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
98b0: 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
98c0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
98d0: 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
98e0: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
98f0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
9900: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
9910: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
9920: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
9930: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
9940: 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
9950: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
9960: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
9970: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
9980: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
9990: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
99a0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a  end_lock;.  }...
99b0: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
99c0: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
99d0: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
99e0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
99f0: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
9a00: 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
9a10: 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
9a20: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
9a30: 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
9a40: 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
9a50: 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c  d..  */.  lock.l
9a60: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63  _len = 1L;.  loc
9a70: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
9a80: 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69  K_SET;.  if( eFi
9a90: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
9aa0: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
9ab0: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
9ac0: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
9ad0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
9ae0: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
9af0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
9b00: 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  = (eFileLock==SH
9b10: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
9b20: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
9b30: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
9b40: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
9b50: 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65   s = fcntl(pFile
9b60: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
9b70: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 3d  ock);.    if( s=
9b80: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 74  =(-1) ){.      t
9b90: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
9ba0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9bb0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
9bc0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
9bd0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
9be0: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
9bf0: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
9c00: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
9c10: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
9c20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9c30: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
9c40: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
9c50: 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
9c60: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
9c70: 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
9c80: 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
9c90: 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
9ca0: 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
9cb0: 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
9cc0: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
9cd0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
9ce0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
9cf0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
9d00: 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  red==0 );.    as
9d10: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
9d20: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  ileLock==0 );.. 
9d30: 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
9d40: 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20  e read-lock */. 
9d50: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
9d60: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
9d70: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
9d80: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
9d90: 20 20 69 66 28 20 28 73 20 3d 20 66 63 6e 74 6c    if( (s = fcntl
9da0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
9db0: 4c 4b 2c 20 26 6c 6f 63 6b 29 29 3d 3d 28 2d 31  LK, &lock))==(-1
9dc0: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
9dd0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d  o = errno;.    }
9de0: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
9df0: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
9e00: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
9e10: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
9e20: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
9e30: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
9e40: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
9e50: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
9e60: 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  if( fcntl(pFile-
9e70: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
9e80: 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)!=0 ){.      
9e90: 69 66 28 20 73 20 21 3d 20 2d 31 20 29 7b 0a 20  if( s != -1 ){. 
9ea0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
9eb0: 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68  ould happen with
9ec0: 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74   a network mount
9ed0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 45 72 72   */.        tErr
9ee0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 0a 20 20 20  no = errno; .   
9ef0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9f00: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
9f10: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
9f20: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
9f30: 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  ; .        if( I
9f40: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
9f50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
9f60: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
9f70: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
9f80: 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
9f90: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  end_lock;.      
9fa0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
9fb0: 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  s==(-1) ){.     
9fc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
9fd0: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
9fe0: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
9ff0: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
a000: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
a010: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
a020: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
a030: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
a040: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
a050: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
a060: 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
a070: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e  _LOCK;.      pIn
a080: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
a090: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
a0a0: 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  red = 1;.    }. 
a0b0: 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
a0c0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a0d0: 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e  LOCK && pInode->
a0e0: 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20  nShared>1 ){.   
a0f0: 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
a100: 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
a110: 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
a120: 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
a130: 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  is.    ** same p
a140: 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
a150: 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
a160: 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
a170: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
a180: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
a190: 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
a1a0: 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
a1b0: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
a1c0: 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
a1d0: 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
a1e0: 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
a1f0: 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
a200: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
a210: 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
a220: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  /.    assert( 0!
a230: 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
a240: 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k );.    lock.l_
a250: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
a260: 20 20 20 20 73 77 69 74 63 68 28 20 65 46 69 6c      switch( eFil
a270: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 63  eLock ){.      c
a280: 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  ase RESERVED_LOC
a290: 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K:.        lock.
a2a0: 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56  l_start = RESERV
a2b0: 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 20  ED_BYTE;.       
a2c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a2d0: 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  se EXCLUSIVE_LOC
a2e0: 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K:.        lock.
a2f0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
a300: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
a310: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
a320: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
a330: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64    break;.      d
a340: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
a350: 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d  assert(0);.    }
a360: 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70  .    s = fcntl(p
a370: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
a380: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , &lock);.    if
a390: 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ( s==(-1) ){.   
a3a0: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
a3b0: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
a3c0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
a3d0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
a3e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
a3f0: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53  K);.      if( IS
a400: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
a410: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
a420: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
a430: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
a440: 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 6e    }.  }.  ..#ifn
a450: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
a460: 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e 73  Set up the trans
a470: 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63  action-counter c
a480: 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66  hange checking f
a490: 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74  lags when.  ** t
a4a0: 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
a4b0: 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61 20  m a SHARED to a 
a4c0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20  RESERVED lock.  
a4d0: 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20  The change.  ** 
a4e0: 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52  from SHARED to R
a4f0: 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68  ESERVED marks th
a500: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
a510: 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69   normal.  ** wri
a520: 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f  te operation (no
a530: 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  t a hot journal 
a540: 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a  rollback)..  */.
a550: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
a560: 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d  _OK.   && pFile-
a570: 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52  >eFileLock<=SHAR
a580: 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46  ED_LOCK.   && eF
a590: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
a5a0: 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20  D_LOCK.  ){.    
a5b0: 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
a5c0: 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46  Chng = 0;.    pF
a5d0: 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  ile->dbUpdate = 
a5e0: 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  0;.    pFile->in
a5f0: 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b  NormalWrite = 1;
a600: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20  .  }.#endif...  
a610: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
a620: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
a630: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
a640: 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64  eLock;.    pInod
a650: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
a660: 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73  FileLock;.  }els
a670: 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
a680: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a690: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
a6a0: 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
a6b0: 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  G_LOCK;.    pIno
a6c0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
a6d0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
a6e0: 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  }..end_lock:.  u
a6f0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
a700: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
a710: 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 75  K    %d %s %s (u
a720: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
a730: 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46  h, azFileLock(eF
a740: 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20  ileLock), .     
a750: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
a760: 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
a770: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
a780: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68  .}../*.** Add th
a790: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
a7a0: 72 20 75 73 65 64 20 62 79 20 66 69 6c 65 20 68  r used by file h
a7b0: 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74  andle pFile to t
a7c0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
a7d0: 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74  .** pUnused list
a7e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a7f0: 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e   setPendingFd(un
a800: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
a810: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
a820: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
a830: 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55  >pInode;.  UnixU
a840: 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69  nusedFd *p = pFi
a850: 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70  le->pUnused;.  p
a860: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65  ->pNext = pInode
a870: 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e  ->pUnused;.  pIn
a880: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70  ode->pUnused = p
a890: 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d  ;.  pFile->h = -
a8a0: 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75  1;.  pFile->pUnu
a8b0: 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  sed = 0;.}../*.*
a8c0: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
a8d0: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
a8e0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
a8f0: 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
a900: 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
a910: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
a920: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
a930: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
a940: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
a950: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
a960: 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
a970: 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
a980: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
a990: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
a9a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
a9b0: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49   no-op..** .** I
a9c0: 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  f handleNFSUnloc
a9d0: 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  k is true, then 
a9e0: 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61  on downgrading a
a9f0: 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  n EXCLUSIVE_LOCK
aa00: 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68   to SHARED.** th
aa10: 65 20 62 79 74 65 20 72 61 6e 67 65 20 69 73 20  e byte range is 
aa20: 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70  divided into 2 p
aa30: 61 72 74 73 20 61 6e 64 20 74 68 65 20 66 69 72  arts and the fir
aa40: 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63  st part is unloc
aa50: 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20  ked then.** set 
aa60: 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  to a read lock, 
aa70: 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70  then the other p
aa80: 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e  art is simply un
aa90: 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f  locked.  This wo
aaa0: 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61  rks .** around a
aab0: 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20   bug in BSD NFS 
aac0: 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e  lockd (also seen
aad0: 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b   on MacOSX 10.3+
aae0: 29 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20  ) that fails to 
aaf0: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77  .** remove the w
ab00: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72  rite lock on a r
ab10: 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61  egion when a rea
ab20: 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a  d lock is set..*
ab30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 70 6f  /.static int _po
ab40: 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  sixUnlock(sqlite
ab50: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
ab60: 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68  eFileLock, int h
ab70: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b  andleNFSUnlock){
ab80: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
ab90: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
aba0: 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
abb0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73  nfo *pInode;.  s
abc0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
abd0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
abe0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 68 3b  ITE_OK;.  int h;
abf0: 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20  .  int tErrno;  
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac10: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
ac20: 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61  e from system ca
ac30: 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 0a 20 20  ll errors */..  
ac40: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
ac50: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
ac60: 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
ac70: 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
ac80: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
ac90: 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
aca0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
acb0: 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
acc0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
acd0: 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
ace0: 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
acf0: 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61  getpid()));..  a
ad00: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
ad10: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
ad20: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
ad30: 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
ad40: 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
ad50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
ad60: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
ad70: 28 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65 2d  ();.  h = pFile-
ad80: 3e 68 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  >h;.  pInode = p
ad90: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
ada0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
adb0: 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
adc0: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
add0: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
ade0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
adf0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
ae00: 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
ae10: 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c  ock );.    Simul
ae20: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
ae30: 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  (1);.    Simulat
ae40: 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
ae50: 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49   ).    SimulateI
ae60: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
ae70: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
ae80: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
ae90: 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
aea0: 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
aeb0: 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
aec0: 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
aed0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
aee0: 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
aef0: 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
af00: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
af10: 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
af20: 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
af30: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
af40: 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
af50: 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
af60: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
af70: 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
af80: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
af90: 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
afa0: 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
afb0: 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
afc0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
afd0: 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
afe0: 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
aff0: 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
b000: 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
b010: 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
b020: 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
b030: 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
b040: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
b050: 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 20 20 61    */.#if 0.    a
b060: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e  ssert( pFile->in
b070: 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20  NormalWrite==0. 
b080: 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
b090: 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20  ->dbUpdate==0.  
b0a0: 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
b0b0: 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
b0c0: 31 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1 );.#endif.    
b0d0: 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
b0e0: 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  rite = 0;.#endif
b0f0: 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61  ..    /* downgra
b100: 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64  ding to a shared
b110: 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76   lock on NFS inv
b120: 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74  olves clearing t
b130: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20  he write lock.  
b140: 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61    ** before esta
b150: 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65 61  blishing the rea
b160: 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64  dlock - to avoid
b170: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
b180: 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20  n we downgrade. 
b190: 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69     ** the lock i
b1a0: 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74  n 2 blocks, so t
b1b0: 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  hat part of the 
b1c0: 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f  range will be co
b1d0: 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20 20  vered by a .    
b1e0: 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e  ** write lock un
b1f0: 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73 20  til the rest is 
b200: 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65 61  covered by a rea
b210: 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20  d lock:.    **  
b220: 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20  1:   [WWWWW].   
b230: 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57   **  2:   [....W
b240: 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b  ].    **  3:   [
b250: 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34  RRRRW].    **  4
b260: 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20  :   [RRRR.].    
b270: 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65  */.    if( eFile
b280: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
b290: 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68  K ){.      if( h
b2a0: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29  andleNFSUnlock )
b2b0: 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20  {.        off_t 
b2c0: 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44  divSize = SHARED
b2d0: 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20  _SIZE - 1;.     
b2e0: 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b     .        lock
b2f0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
b300: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
b310: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
b320: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
b330: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
b340: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
b350: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
b360: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
b370: 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  if( fcntl(h, F_S
b380: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  ETLK, &lock)==(-
b390: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
b3a0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
b3b0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
b3c0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
b3d0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
b3e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
b3f0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
b400: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
b410: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
b420: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
b430: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
b440: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b450: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
b460: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
b470: 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  }.        lock.l
b480: 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
b490: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
b4a0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
b4b0: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
b4c0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
b4d0: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
b4e0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76  lock.l_len = div
b4f0: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
b500: 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54  ( fcntl(h, F_SET
b510: 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  LK, &lock)==(-1)
b520: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
b530: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
b540: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
b550: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
b560: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
b570: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
b580: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  CK);.          i
b590: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
b5a0: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
b5b0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
b5c0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
b5d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b5e0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
b5f0: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
b600: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
b610: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
b620: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
b630: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
b640: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
b650: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
b660: 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20  IRST+divSize;.  
b670: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
b680: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64   = SHARED_SIZE-d
b690: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
b6a0: 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  if( fcntl(h, F_S
b6b0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  ETLK, &lock)==(-
b6c0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
b6d0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
b6e0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
b6f0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
b700: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
b710: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
b720: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
b730: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
b740: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
b750: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
b760: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
b770: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b780: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
b790: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
b7a0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
b7b0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
b7c0: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
b7d0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
b7e0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
b7f0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
b800: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
b810: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
b820: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
b830: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69  _SIZE;.        i
b840: 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45  f( fcntl(h, F_SE
b850: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  TLK, &lock)==(-1
b860: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
b870: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
b880: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
b890: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
b8a0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
b8b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
b8c0: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
b8d0: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
b8e0: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
b8f0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
b900: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
b910: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b920: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
b930: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
b940: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b950: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
b960: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f   F_UNLCK;.    lo
b970: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
b980: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
b990: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
b9a0: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
b9b0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61  k.l_len = 2L;  a
b9c0: 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42  ssert( PENDING_B
b9d0: 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f  YTE+1==RESERVED_
b9e0: 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20  BYTE );.    if( 
b9f0: 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b  fcntl(h, F_SETLK
ba00: 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29  , &lock)!=(-1) )
ba10: 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
ba20: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
ba30: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
ba40: 73 65 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f  se{.      tErrno
ba50: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
ba60: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
ba70: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
ba80: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
ba90: 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
baa0: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
bab0: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
bac0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
bad0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
bae0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
baf0: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
bb00: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46    }.  }.  if( eF
bb10: 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
bb20: 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   ){.    /* Decre
bb30: 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
bb40: 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
bb50: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
bb60: 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
bb70: 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
bb80: 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
bb90: 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
bba0: 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
bbb0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
bbc0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
bbd0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
bbe0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
bbf0: 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
bc00: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
bc10: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
bc20: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
bc30: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
bc40: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
bc50: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
bc60: 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
bc70: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
bc80: 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
bc90: 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
bca0: 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
bcb0: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
bcc0: 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c  .      if( fcntl
bcd0: 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  (h, F_SETLK, &lo
bce0: 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)!=(-1) ){.   
bcf0: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
bd00: 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
bd10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
bd20: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
bd30: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
bd40: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
bd50: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
bd60: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
bd70: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
bd80: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
bd90: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
bda0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
bdb0: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
bdc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bdd0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
bde0: 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
bdf0: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
be00: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
be10: 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
be20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   }..    /* Decre
be30: 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f  ment the count o
be40: 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20  f locks against 
be50: 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20  this same file. 
be60: 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   When the.    **
be70: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
be80: 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f  ero, close any o
be90: 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
bea0: 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73  ptors whose clos
beb0: 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66  e.    ** was def
bec0: 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66  erred because of
bed0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
bee0: 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ks..    */.    p
bef0: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
bf00: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
bf10: 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  de->nLock>=0 );.
bf20: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
bf30: 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  nLock==0 ){.    
bf40: 20 20 69 6e 74 20 72 63 32 20 3d 20 63 6c 6f 73    int rc2 = clos
bf50: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
bf60: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
bf70: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
bf80: 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
bf90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bfa0: 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a   }...end_unlock:
bfb0: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
bfc0: 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  x();.  if( rc==S
bfd0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65  QLITE_OK ) pFile
bfe0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
bff0: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72  ileLock;.  retur
c000: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
c010: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
c020: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
c030: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
c040: 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
c050: 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
c060: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
c070: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
c080: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
c090: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
c0a0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
c0b0: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
c0c0: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
c0d0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
c0e0: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
c0f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
c100: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
c110: 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71  nt unixUnlock(sq
c120: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
c130: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
c140: 20 20 72 65 74 75 72 6e 20 5f 70 6f 73 69 78 55    return _posixU
c150: 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c  nlock(id, eFileL
c160: 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ock, 0);.}../*.*
c170: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c180: 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72  performs the par
c190: 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65  ts of the "close
c1a0: 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e   file" operation
c1b0: 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61   .** common to a
c1c0: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  ll locking schem
c1d0: 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68  es. It closes th
c1e0: 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  e directory and 
c1f0: 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c  file.** handles,
c200: 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c   if they are val
c210: 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c  id, and sets all
c220: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75   fields of the u
c230: 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
c240: 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a  ture to 0..**.**
c250: 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63   It is *not* nec
c260: 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74  essary to hold t
c270: 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68  he mutex when th
c280: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
c290: 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e  lled,.** even on
c2a0: 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74   VxWorks.  A mut
c2b0: 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69  ex will be acqui
c2c0: 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62  red on VxWorks b
c2d0: 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73  y the.** vxworks
c2e0: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20  ReleaseFileId() 
c2f0: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
c300: 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78  ic int closeUnix
c310: 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  File(sqlite3_fil
c320: 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
c330: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
c340: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28  xFile*)id;.  if(
c350: 20 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 66   pFile ){.    if
c360: 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d  ( pFile->dirfd>=
c370: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  0 ){.      int e
c380: 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65  rr = close(pFile
c390: 2d 3e 64 69 72 66 64 29 3b 0a 20 20 20 20 20 20  ->dirfd);.      
c3a0: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
c3b0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
c3c0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
c3d0: 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
c3e0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
c3f0: 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 2c  IOERR_DIR_CLOSE,
c400: 20 22 63 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d   "close", pFile-
c410: 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d  >zPath);.      }
c420: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
c430: 69 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20  ile->dirfd=-1;. 
c440: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c450: 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
c460: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72   ){.      int er
c470: 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d  r = close(pFile-
c480: 3e 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  >h);.      if( e
c490: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  rr ){.        pF
c4a0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
c4b0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
c4c0: 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
c4d0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
c4e0: 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c  _CLOSE, "close",
c4f0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
c500: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
c510: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
c520: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20   if( pFile->pId 
c530: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69  ){.      if( pFi
c540: 6c 65 2d 3e 69 73 44 65 6c 65 74 65 20 29 7b 0a  le->isDelete ){.
c550: 20 20 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28 70          unlink(p
c560: 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  File->pId->zCano
c570: 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
c580: 20 20 7d 0a 20 20 20 20 20 20 76 78 77 6f 72 6b    }.      vxwork
c590: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70  sReleaseFileId(p
c5a0: 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20  File->pId);.    
c5b0: 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30    pFile->pId = 0
c5c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c5d0: 20 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f     OSTRACE(("CLO
c5e0: 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  SE   %-3d\n", pF
c5f0: 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 4f 70  ile->h));.    Op
c600: 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
c610: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c620: 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b  pFile->pUnused);
c630: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  .    memset(pFil
c640: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  e, 0, sizeof(uni
c650: 78 46 69 6c 65 29 29 3b 0a 20 20 7d 0a 20 20 72  xFile));.  }.  r
c660: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c670: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
c680: 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
c690: 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28  c int unixClose(
c6a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
c6b0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
c6c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
c6d0: 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    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 20 2a 29 69 64 3b 0a 20 20 20 20 75  File *)id;.    u
c700: 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  nixUnlock(id, NO
c710: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78  _LOCK);.    unix
c720: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
c730: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
c740: 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  ode && pFile->pI
c750: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
c760: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
c770: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
c780: 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
c790: 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
c7a0: 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
c7b0: 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
c7c0: 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
c7d0: 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
c7e0: 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
c7f0: 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
c800: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
c810: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73  ode->pUnused lis
c820: 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  t.  It will be a
c830: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
c840: 73 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 77 68  sed .      ** wh
c850: 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  en the last lock
c860: 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20   is cleared..   
c870: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50     */.      setP
c880: 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b  endingFd(pFile);
c890: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61  .    }.    relea
c8a0: 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
c8b0: 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f  e);.    rc = clo
c8c0: 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
c8d0: 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
c8e0: 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ex();.  }.  retu
c8f0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  rn rc;.}../*****
c900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
c910: 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69 73   the posix advis
c920: 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ory lock impleme
c930: 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
c940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
c950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c990: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
c9a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c9b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c9c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c9d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c9e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
c9f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20  ********* No-op 
ca10: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
ca20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
ca40: 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   Of the various 
ca50: 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
ca60: 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c  tations availabl
ca70: 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66 61  e, this is by fa
ca80: 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73  r the.** simples
ca90: 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69  t:  locking is i
caa0: 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65  gnored.  No atte
cab0: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c  mpt is made to l
cac0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
cad0: 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61  .** file for rea
cae0: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e  ding or writing.
caf0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b  .**.** This lock
cb00: 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72  ing mode is appr
cb10: 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65 20  opriate for use 
cb20: 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74  on read-only dat
cb30: 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64  abases.** (ex: d
cb40: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61 72  atabases that ar
cb50: 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44  e burned into CD
cb60: 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c  -ROM, for exampl
cb70: 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61  e.)  It can.** a
cb80: 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20 74  lso be used if t
cb90: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65  he application e
cba0: 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65  mploys some exte
cbb0: 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74  rnal mechanism t
cbc0: 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d  o.** prevent sim
cbd0: 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73  ultaneous access
cbe0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61 74   of the same dat
cbf0: 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20  abase by two or 
cc00: 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  more.** database
cc10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42   connections.  B
cc20: 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73 65  ut there is a se
cc30: 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61  rious risk of da
cc40: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70  tabase.** corrup
cc50: 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63  tion if this loc
cc60: 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  king mode is use
cc70: 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20  d in situations 
cc80: 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a  where multiple.*
cc90: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
cca0: 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73  ctions are acces
ccb0: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
ccc0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
ccd0: 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20  he same.** time 
cce0: 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  and one or more 
ccf0: 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74  of those connect
cd00: 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67  ions are writing
cd10: 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
cd20: 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
cd30: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
cd40: 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
cd50: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
cd60: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
cd70: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70  R(NotUsed);.  *p
cd80: 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65  ResOut = 0;.  re
cd90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cda0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  }.static int nol
cdb0: 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
cdc0: 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
cdd0: 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
cde0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
cdf0: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
ce00: 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
ce10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
ce20: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c  ic int nolockUnl
ce30: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
ce40: 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e   *NotUsed, int N
ce50: 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
ce60: 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
ce70: 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
ce80: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ce90: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
cea0: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a  lose the file..*
ceb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  /.static int nol
cec0: 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
ced0: 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72  _file *id) {.  r
cee0: 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46  eturn closeUnixF
cef0: 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a  ile(id);.}../***
cf00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf10: 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f   End of the no-o
cf20: 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  p lock implement
cf30: 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
cf40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
cf50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
cfa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cfb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cfc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cfd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cfe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
cff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d000: 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74  ****** Begin dot
d010: 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a  -file Locking **
d020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
d040: 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c  ** The dotfile l
d050: 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
d060: 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65  ation uses the e
d070: 78 69 73 74 61 6e 63 65 20 6f 66 20 73 65 70 61  xistance of sepa
d080: 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c  rate lock.** fil
d090: 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  es in order to c
d0a0: 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f  ontrol access to
d0b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
d0c0: 54 68 69 73 20 77 6f 72 6b 73 20 6f 6e 20 6a 75  This works on ju
d0d0: 73 74 0a 2a 2a 20 61 62 6f 75 74 20 65 76 65 72  st.** about ever
d0e0: 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61  y filesystem ima
d0f0: 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68  ginable.  But th
d100: 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20  ere are serious 
d110: 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a  downsides:.**.**
d120: 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69      (1)  There i
d130: 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e  s zero concurren
d140: 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65  cy.  A single re
d150: 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20  ader blocks all 
d160: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
d170: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f   connections fro
d180: 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  m reading or wri
d190: 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
d1a0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
d1b0: 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20   An application 
d1c0: 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c  crash or power l
d1d0: 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74  oss can leave st
d1e0: 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a  ale lock files.*
d1f0: 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e  *         sittin
d200: 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65  g around that ne
d210: 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64  ed to be cleared
d220: 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a   manually..**.**
d230: 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61   Nevertheless, a
d240: 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61   dotlock is an a
d250: 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
d260: 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20  ng mode for use 
d270: 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c  if no.** other l
d280: 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
d290: 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  is available..**
d2a0: 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b  .** Dotfile lock
d2b0: 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65  ing works by cre
d2c0: 61 74 69 6e 67 20 61 20 66 69 6c 65 20 69 6e 20  ating a file in 
d2d0: 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
d2e0: 72 79 20 61 73 20 74 68 65 0a 2a 2a 20 64 61 74  ry as the.** dat
d2f0: 61 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74  abase and with t
d300: 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74  he same name but
d310: 20 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20   with a ".lock" 
d320: 65 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e  extension added.
d330: 0a 2a 2a 20 54 68 65 20 65 78 69 73 74 61 6e 63  .** The existanc
d340: 65 20 6f 66 20 61 20 6c 6f 63 6b 20 66 69 6c 65  e of a lock file
d350: 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c   implies an EXCL
d360: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c  USIVE lock.  All
d370: 20 6f 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74   other lock.** t
d380: 79 70 65 73 20 28 53 48 41 52 45 44 2c 20 52 45  ypes (SHARED, RE
d390: 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29  SERVED, PENDING)
d3a0: 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f   are mapped into
d3b0: 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a   EXCLUSIVE..*/..
d3c0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73  /*.** The file s
d3d0: 75 66 66 69 78 20 61 64 64 65 64 20 74 6f 20 74  uffix added to t
d3e0: 68 65 20 64 61 74 61 20 62 61 73 65 20 66 69 6c  he data base fil
d3f0: 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74  ename in order t
d400: 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20  o create the.** 
d410: 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64  lock file..*/.#d
d420: 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55  efine DOTLOCK_SU
d430: 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a  FFIX ".lock"../*
d440: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d450: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
d460: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
d470: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
d480: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
d490: 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
d4a0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
d4b0: 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
d4c0: 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
d4d0: 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
d4e0: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
d4f0: 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
d500: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
d510: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
d520: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
d530: 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
d540: 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
d550: 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
d560: 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  hecking..**.** I
d570: 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  n dotfile lockin
d580: 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b  g, either a lock
d590: 20 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f   exists or it do
d5a0: 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74  es not.  So in t
d5b0: 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e  his.** variation
d5c0: 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65   of CheckReserve
d5d0: 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75  dLock(), *pResOu
d5e0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
d5f0: 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20   if any lock.** 
d600: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  is held on the f
d610: 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ile and false if
d620: 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
d630: 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ocked..*/.static
d640: 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63   int dotlockChec
d650: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
d660: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
d670: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
d680: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d690: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
d6a0: 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
d6b0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
d6c0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
d6d0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
d6e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
d6f0: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
d700: 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
d710: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
d720: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
d730: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
d740: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
d750: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
d760: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
d770: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
d780: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65   ){.    /* Eithe
d790: 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  r this connectio
d7a0: 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  n or some other 
d7b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68  connection in th
d7c0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20  e same process. 
d7d0: 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f     ** holds a lo
d7e0: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20  ck on the file. 
d7f0: 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63   No need to chec
d800: 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  k further. */.  
d810: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
d820: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
d830: 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  The lock is held
d840: 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
d850: 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69  the lockfile exi
d860: 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  sts */.    const
d870: 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
d880: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
d890: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
d8a0: 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72  ntext;.    reser
d8b0: 76 65 64 20 3d 20 61 63 63 65 73 73 28 7a 4c 6f  ved = access(zLo
d8c0: 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20  ckFile, 0)==0;. 
d8d0: 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
d8e0: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
d8f0: 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d %d (dotlock)\n
d900: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
d910: 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a   reserved));.  *
d920: 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
d930: 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
d940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
d950: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
d960: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
d970: 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
d980: 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
d990: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
d9a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
d9b0: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
d9c0: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
d9d0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
d9e0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
d9f0: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
da00: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
da10: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
da20: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
da30: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
da40: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
da50: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
da60: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
da70: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
da80: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
da90: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
daa0: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
dab0: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
dac0: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
dad0: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
dae0: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
daf0: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
db00: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
db10: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
db20: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
db30: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
db40: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
db50: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
db60: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
db70: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
db80: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
db90: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
dba0: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
dbb0: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
dbc0: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
dbd0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
dbe0: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
dbf0: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
dc00: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
dc10: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
dc20: 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
dc30: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
dc40: 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
dc50: 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
dc60: 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  vel..**.** With 
dc70: 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
dc80: 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20   we really only 
dc90: 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34  support state (4
dca0: 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a  ): EXCLUSIVE..**
dcb0: 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68   But we track th
dcc0: 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  e other locking 
dcd0: 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c  levels internall
dce0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
dcf0: 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c   dotlockLock(sql
dd00: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
dd10: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
dd20: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
dd30: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
dd40: 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63  d;.  int fd;.  c
dd50: 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
dd60: 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
dd70: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
dd80: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
dd90: 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20  E_OK;...  /* If 
dda0: 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b  we have any lock
ddb0: 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
ddc0: 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  file already exi
ddd0: 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76  sts.  All we hav
dde0: 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
ddf0: 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72  adjust our inter
de00: 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
de10: 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20  e lock level..  
de20: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
de30: 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
de40: 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
de50: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
de60: 69 6c 65 4c 6f 63 6b 3b 0a 23 69 66 20 21 4f 53  ileLock;.#if !OS
de70: 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 2f 2a 20  _VXWORKS.    /* 
de80: 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68  Always update th
de90: 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74  e timestamp on t
dea0: 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20  he old file */. 
deb0: 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46     utimes(zLockF
dec0: 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  ile, NULL);.#end
ded0: 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
dee0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
def0: 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
df00: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
df10: 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4c 6f 63 6b   fd = open(zLock
df20: 46 69 6c 65 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  File,O_RDONLY|O_
df30: 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30  CREAT|O_EXCL,060
df40: 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29  0);.  if( fd<0 )
df50: 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20  {.    /* failed 
df60: 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
df70: 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65  he file, someone
df80: 20 65 6c 73 65 20 6d 61 79 20 68 61 76 65 20 73   else may have s
df90: 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b 20 2a  tolen the lock *
dfa0: 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  /.    int tErrno
dfb0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66   = errno;.    if
dfc0: 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72  ( EEXIST == tErr
dfd0: 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  no ){.      rc =
dfe0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
dff0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
e000: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
e010: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
e020: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
e030: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
e040: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
e050: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
e060: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
e070: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
e080: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e090: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a  return rc;.  } .
e0a0: 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64 29 20    if( close(fd) 
e0b0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
e0c0: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
e0d0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
e0e0: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20  _IOERR_CLOSE;.  
e0f0: 7d 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74  }.  .  /* got it
e100: 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
e110: 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
e120: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
e130: 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
e140: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e150: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
e160: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
e170: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
e180: 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
e190: 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
e1a0: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
e1b0: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
e1c0: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
e1d0: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
e1e0: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
e1f0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
e200: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
e210: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
e220: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
e230: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
e240: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
e250: 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69  * When the locki
e260: 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73  ng level reaches
e270: 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65   NO_LOCK, delete
e280: 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a   the lock file..
e290: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
e2a0: 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  tlockUnlock(sqli
e2b0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
e2c0: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
e2d0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
e2e0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
e2f0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  ;.  char *zLockF
e300: 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46  ile = (char *)pF
e310: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
e320: 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ext;..  assert( 
e330: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
e340: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
e350: 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
e360: 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70   (dotlock)\n", p
e370: 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
e380: 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 65  ck,..   pFile->e
e390: 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64  FileLock, getpid
e3a0: 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
e3b0: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
e3c0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
e3d0: 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
e3e0: 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
e3f0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
e400: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
e410: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e420: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64  ;.  }..  /* To d
e430: 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72  owngrade to shar
e440: 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74  ed, simply updat
e450: 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e  e our internal n
e460: 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  otion of the.  *
e470: 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e  * lock state.  N
e480: 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77  o need to mess w
e490: 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  ith the file on 
e4a0: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  disk..  */.  if(
e4b0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
e4c0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  ED_LOCK ){.    p
e4d0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
e4e0: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
e4f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e500: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
e510: 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b   To fully unlock
e520: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64   the database, d
e530: 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
e540: 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ile */.  assert(
e550: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
e560: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  OCK );.  if( unl
e570: 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 20 29  ink(zLockFile) )
e580: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 30  {.    int rc = 0
e590: 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  ;.    int tErrno
e5a0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66   = errno;.    if
e5b0: 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72  ( ENOENT != tErr
e5c0: 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  no ){.      rc =
e5d0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
e5e0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
e5f0: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
e600: 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20  UNLOCK);.    }. 
e610: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
e620: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
e630: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
e640: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
e650: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
e660: 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  ; .  }.  pFile->
e670: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
e680: 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  OCK;.  return SQ
e690: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
e6a0: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20  * Close a file. 
e6b0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
e6c0: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c  ock has been rel
e6d0: 65 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f  eased before clo
e6e0: 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sing..*/.static 
e6f0: 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65  int dotlockClose
e700: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
e710: 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  d) {.  int rc;. 
e720: 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
e730: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
e740: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
e750: 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63      dotlockUnloc
e760: 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
e770: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
e780: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
e790: 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72  ontext);.  }.  r
e7a0: 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
e7b0: 65 28 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(id);.  return 
e7c0: 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  rc;.}./*********
e7d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
e7e0: 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f   the dot-file lo
e7f0: 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
e800: 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
e810: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
e820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e860: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
e870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e8a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e8b0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
e8c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e8d0: 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f  * Begin flock Lo
e8e0: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
e8f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e900: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65  ******.**.** Use
e910: 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73   the flock() sys
e920: 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66  tem call to do f
e930: 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a  ile locking..**.
e940: 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69  ** flock() locki
e950: 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66  ng is like dot-f
e960: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  ile locking in t
e970: 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a  hat the various.
e980: 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f  ** fine-grain lo
e990: 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70  cking levels sup
e9a0: 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74 65  ported by SQLite
e9b0: 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69   are collapsed i
e9c0: 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
e9d0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
e9e0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
e9f0: 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45   SHARED, RESERVE
ea00: 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e  D, and.** PENDIN
ea10: 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20  G locks are the 
ea20: 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e  same thing as an
ea30: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
ea40: 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c    SQLite.** stil
ea50: 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75  l works when you
ea60: 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f   do this, but co
ea70: 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65 64  ncurrency is red
ea80: 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e  uced since.** on
ea90: 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  ly a single proc
eaa0: 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ess can be readi
eab0: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
eac0: 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  at a time..**.**
ead0: 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74 69   Omit this secti
eae0: 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  on if SQLITE_ENA
eaf0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
eb00: 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20  E is turned off 
eb10: 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69  or if.** compili
eb20: 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a  ng for VXWORKS..
eb30: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
eb40: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
eb50: 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b  LE && !OS_VXWORK
eb60: 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  S../*.** This ro
eb70: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
eb80: 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
eb90: 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
eba0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
ebb0: 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
ebc0: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
ebd0: 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
ebe0: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
ebf0: 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
ec00: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
ec10: 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
ec20: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
ec30: 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
ec40: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
ec50: 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
ec60: 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
ec70: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
ec80: 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
ec90: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
eca0: 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
ecb0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
ecc0: 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
ecd0: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
ece0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
ecf0: 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
ed00: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
ed10: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
ed20: 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
ed30: 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
ed40: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
ed50: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
ed60: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
ed70: 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43  ile );.  .  /* C
ed80: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
ed90: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
eda0: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
edb0: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
edc0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
edd0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
ede0: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
edf0: 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
ee00: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
ee10: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
ee20: 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  lds it. */.  if(
ee30: 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
ee40: 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20    /* attempt to 
ee50: 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  get the lock */.
ee60: 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 66 6c      int lrc = fl
ee70: 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
ee80: 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29  CK_EX | LOCK_NB)
ee90: 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29  ;.    if( !lrc )
eea0: 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74  {.      /* got t
eeb0: 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  he lock, unlock 
eec0: 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  it */.      lrc 
eed0: 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  = flock(pFile->h
eee0: 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20  , LOCK_UN);.    
eef0: 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20    if ( lrc ) {. 
ef00: 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e         int tErrn
ef10: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
ef20: 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69     /* unlock fai
ef30: 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  led with an erro
ef40: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63  r */.        lrc
ef50: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
ef60: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
ef70: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
ef80: 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20  R_UNLOCK); .    
ef90: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
efa0: 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
efb0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
efc0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
efd0: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
efe0: 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  = lrc;.        }
eff0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
f000: 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lse {.      int 
f010: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
f020: 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
f030: 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d   1;.      /* som
f040: 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20  eone else might 
f050: 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64  have it reserved
f060: 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
f070: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
f080: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
f090: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
f0a0: 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28  OCK); .      if(
f0b0: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
f0c0: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
f0d0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
f0e0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
f0f0: 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
f100: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
f110: 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
f120: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
f130: 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
f140: 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
f150: 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ed));..#ifdef SQ
f160: 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
f170: 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
f180: 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45  if( (rc & SQLITE
f190: 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
f1a0: 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
f1b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
f1c0: 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20     reserved=1;. 
f1d0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
f1e0: 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
f1f0: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
f200: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
f210: 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
f220: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
f230: 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
f240: 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
f250: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
f260: 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
f270: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
f280: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
f290: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
f2a0: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
f2b0: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
f2c0: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
f2d0: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
f2e0: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
f2f0: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
f300: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
f310: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
f320: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
f330: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
f340: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
f350: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
f360: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
f370: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
f380: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
f390: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
f3a0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
f3b0: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
f3c0: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
f3d0: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
f3e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
f3f0: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
f400: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
f410: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
f420: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
f430: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
f440: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
f450: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
f460: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
f470: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
f480: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
f490: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
f4a0: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
f4b0: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
f4c0: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
f4d0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
f4e0: 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61  flock() only rea
f4f0: 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
f500: 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
f510: 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
f520: 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
f530: 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
f540: 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
f550: 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
f560: 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
f570: 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
f580: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
f590: 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
f5a0: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
f5b0: 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
f5c0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
f5d0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
f5e0: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
f5f0: 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
f600: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
f610: 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
f620: 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
f630: 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
f640: 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  nt flockLock(sql
f650: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
f660: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
f670: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f680: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
f690: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
f6a0: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65  ile*)id;..  asse
f6b0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
f6c0: 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
f6d0: 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
f6e0: 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
f6f0: 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
f700: 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
f710: 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
f720: 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
f730: 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
f740: 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
f750: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
f760: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
f770: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
f780: 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
f790: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
f7a0: 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 66 6c  k */.  .  if (fl
f7b0: 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
f7c0: 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29  CK_EX | LOCK_NB)
f7d0: 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72  ) {.    int tErr
f7e0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
f7f0: 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d  /* didn't get, m
f800: 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20  ust be busy */. 
f810: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
f820: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
f830: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
f840: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
f850: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
f860: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
f870: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f880: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
f890: 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  }.  } else {.   
f8a0: 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
f8b0: 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
f8c0: 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46  urn ok */.    pF
f8d0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
f8e0: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a   eFileLock;.  }.
f8f0: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
f900: 20 20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c      %d %s %s (fl
f910: 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
f920: 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46  h, azFileLock(eF
f930: 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20  ileLock), .     
f940: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
f950: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
f960: 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20  iled"));.#ifdef 
f970: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
f980: 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
f990: 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49    if( (rc & SQLI
f9a0: 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
f9b0: 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
f9c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
f9d0: 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  Y;.  }.#endif /*
f9e0: 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
f9f0: 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
fa00: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
fa10: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  .}.../*.** Lower
fa20: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
fa30: 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
fa40: 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
fa50: 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
fa60: 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
fa70: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
fa80: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
fa90: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
faa0: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
fab0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
fac0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
fad0: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
fae0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
faf0: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
fb00: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
fb10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
fb20: 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
fb30: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
fb40: 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
fb50: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
fb60: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
fb70: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
fb80: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
fb90: 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
fba0: 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28   was %d pid=%d (
fbb0: 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
fbc0: 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
fbd0: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
fbe0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74  ->eFileLock, get
fbf0: 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72  pid()));.  asser
fc00: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
fc10: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
fc20: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
fc30: 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
fc40: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
fc50: 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
fc60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fc70: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
fc80: 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74   shared can just
fc90: 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20   be set because 
fca0: 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61  we always have a
fcb0: 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20  n exclusive */. 
fcc0: 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if (eFileLock==
fcd0: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SHARED_LOCK) {. 
fce0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
fcf0: 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
fd00: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fd10: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
fd20: 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75  /* no, really, u
fd30: 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e 74 20  nlock. */.  int 
fd40: 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65  rc = flock(pFile
fd50: 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20  ->h, LOCK_UN);. 
fd60: 20 69 66 20 28 72 63 29 20 7b 0a 20 20 20 20 69   if (rc) {.    i
fd70: 6e 74 20 72 2c 20 74 45 72 72 6e 6f 20 3d 20 65  nt r, tErrno = e
fd80: 72 72 6e 6f 3b 0a 20 20 20 20 72 20 3d 20 73 71  rrno;.    r = sq
fd90: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
fda0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
fdb0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
fdc0: 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
fdd0: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 29 20 29  _LOCK_ERROR(r) )
fde0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
fdf0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
fe00: 6f 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  o;.    }.#ifdef 
fe10: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
fe20: 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
fe30: 20 20 20 20 69 66 28 20 28 72 20 26 20 53 51 4c      if( (r & SQL
fe40: 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
fe50: 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
fe60: 20 20 20 20 72 20 3d 20 53 51 4c 49 54 45 5f 42      r = SQLITE_B
fe70: 55 53 59 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  USY;.    }.#endi
fe80: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
fe90: 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
fea0: 52 4f 52 53 20 2a 2f 0a 20 20 20 20 0a 20 20 20  RORS */.    .   
feb0: 20 72 65 74 75 72 6e 20 72 3b 0a 20 20 7d 20 65   return r;.  } e
fec0: 6c 73 65 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  lse {.    pFile-
fed0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
fee0: 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e  LOCK;.    return
fef0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
ff00: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
ff10: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
ff20: 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28   int flockClose(
ff30: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
ff40: 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  ) {.  if( id ){.
ff50: 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28      flockUnlock(
ff60: 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
ff70: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65  }.  return close
ff80: 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a  UnixFile(id);.}.
ff90: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ffa0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
ffb0: 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
ffc0: 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  WORK */../******
ffd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
ffe0: 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c  d of the flock l
fff0: 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
10000 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
10010 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
10020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10060 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
10070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
100a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
100b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
100c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
100d0 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53  ** Begin Named S
100e0 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67  emaphore Locking
100f0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
10100 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
10110 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
10120 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
10130 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57  supported on VxW
10140 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  orks..**.** Sema
10150 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
10160 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61   like dot-lock a
10170 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74  nd flock in that
10180 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a   it really only.
10190 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c  ** supports EXCL
101a0 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20  USIVE locking.  
101b0 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  Only a single pr
101c0 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f  ocess can read o
101d0 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64  r write.** the d
101e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
101f0 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65  a time.  This re
10200 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20  duces potential 
10210 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74  concurrency, but
10220 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f  .** makes the lo
10230 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
10240 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a  n much easier..*
10250 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  /.#if OS_VXWORKS
10260 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
10270 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
10280 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
10290 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
102a0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
102b0 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
102c0 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
102d0 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
102e0 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
102f0 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
10300 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
10310 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
10320 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
10330 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
10340 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
10350 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
10360 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
10370 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
10380 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
10390 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 68  static int semCh
103a0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
103b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
103c0 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
103d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
103e0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
103f0 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
10400 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
10410 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
10420 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
10430 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
10440 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
10450 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
10460 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
10470 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
10480 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
10490 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
104a0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
104b0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
104c0 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
104d0 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
104e0 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20  ed = 1;.  }.  . 
104f0 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
10500 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
10510 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
10520 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65  . */.  if( !rese
10530 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f  rved ){.    sem_
10540 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
10550 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20  >pInode->pSem;. 
10560 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
10570 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28  tatBuf;..    if(
10580 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65   sem_trywait(pSe
10590 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  m)==-1 ){.      
105a0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
105b0 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41  no;.      if( EA
105c0 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29  GAIN != tErrno )
105d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
105e0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
105f0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
10600 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
10610 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
10620 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
10630 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
10640 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73  rno;.      } els
10650 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73  e {.        /* s
10660 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20  omeone else has 
10670 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65  the lock when we
10680 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20   are in NO_LOCK 
10690 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72  */.        reser
106a0 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46  ved = (pFile->eF
106b0 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44  ileLock < SHARED
106c0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
106d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
106e0 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76   /* we could hav
106f0 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20  e it if we want 
10700 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f  it */.      sem_
10710 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20  post(pSem);.    
10720 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
10730 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
10740 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22  d %d %d (sem)\n"
10750 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
10760 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a  reserved));..  *
10770 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
10780 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
10790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
107a0 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
107b0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
107c0 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
107d0 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
107e0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
107f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
10800 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
10810 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
10820 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
10830 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
10840 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
10850 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
10860 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
10870 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
10880 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
10890 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
108a0 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
108b0 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
108c0 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
108d0 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
108e0 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
108f0 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
10900 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
10910 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
10920 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
10930 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
10940 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
10950 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
10960 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
10970 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
10980 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
10990 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
109a0 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
109b0 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
109c0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
109d0 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
109e0 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
109f0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
10a00 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
10a10 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
10a20 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
10a30 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
10a40 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d  LUSIVE.**.** Sem
10a50 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c  aphore locks onl
10a60 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74  y really support
10a70 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
10a80 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65  .  We track inte
10a90 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b  rmediate.** lock
10aa0 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73   states in the s
10ab0 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
10ac0 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c  cture, but all l
10ad0 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a  ocks SHARED or.*
10ae0 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c  * above are real
10af0 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ly EXCLUSIVE loc
10b00 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61  ks and exclude a
10b10 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ll other process
10b20 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73  es from.** acces
10b30 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  s the file..**.*
10b40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
10b50 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
10b60 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
10b70 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
10b80 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
10b90 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
10ba0 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
10bb0 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28  tic int semLock(
10bc0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
10bd0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
10be0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
10bf0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
10c00 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a  *)id;.  int fd;.
10c10 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
10c20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
10c30 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Sem;.  int rc = 
10c40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
10c50 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
10c60 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
10c70 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
10c80 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
10c90 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
10ca0 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
10cb0 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46  .  if (pFile->eF
10cc0 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
10cd0 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
10ce0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
10cf0 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20  eLock;.    rc = 
10d00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
10d10 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
10d20 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f  ;.  }.  .  /* lo
10d30 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77  ck semaphore now
10d40 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68   but bail out wh
10d50 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65  en already locke
10d60 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f  d. */.  if( sem_
10d70 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d  trywait(pSem)==-
10d80 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
10d90 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
10da0 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
10db0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20  ;.  }..  /* got 
10dc0 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
10dd0 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
10de0 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
10df0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
10e00 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  ;.. sem_end_lock
10e10 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
10e20 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
10e30 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
10e40 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
10e50 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
10e60 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
10e70 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
10e80 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
10e90 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
10ea0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
10eb0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
10ec0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
10ed0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
10ee0 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
10ef0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
10f00 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
10f10 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
10f20 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55  .static int semU
10f30 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
10f40 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
10f50 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
10f60 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10f70 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65  ixFile*)id;.  se
10f80 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
10f90 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
10fa0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
10fb0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
10fc0 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  Sem );.  OSTRACE
10fd0 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
10fe0 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28   was %d pid=%d (
10ff0 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  sem)\n", pFile->
11000 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20  h, eFileLock,.. 
11010 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
11020 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
11030 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
11040 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
11050 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
11060 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
11070 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
11080 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
11090 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
110a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
110b0 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
110c0 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
110d0 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
110e0 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
110f0 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c  ve */.  if (eFil
11100 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
11110 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
11120 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
11130 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
11140 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11150 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
11160 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  ally unlock. */.
11170 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28    if ( sem_post(
11180 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20  pSem)==-1 ) {.  
11190 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f    int rc, tErrno
111a0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63   = errno;.    rc
111b0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
111c0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
111d0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
111e0 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  R_UNLOCK);.    i
111f0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
11200 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
11210 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11220 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
11230 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20     return rc; . 
11240 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c   }.  pFile->eFil
11250 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
11260 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11270 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43  _OK;.}../*. ** C
11280 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f  lose a file.. */
11290 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43  .static int semC
112a0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
112b0 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
112c0 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
112d0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
112e0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65  File*)id;.    se
112f0 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  mUnlock(id, NO_L
11300 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OCK);.    assert
11310 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75  ( pFile );.    u
11320 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
11330 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
11340 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
11350 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
11360 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69  ();.    closeUni
11370 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20  xFile(id);.  }. 
11380 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11390 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
113a0 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
113b0 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68  .** Named semaph
113c0 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  ore locking is o
113d0 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
113e0 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a   VxWorks..**.***
113f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
11400 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65   of the named se
11410 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70  maphore lock imp
11420 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
11430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
11440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
11490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
114e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
11500 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a   AFP Locking ***
11510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11530 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20  *.** AFP is the 
11540 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f  Apple Filing Pro
11550 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61  tocol.  AFP is a
11560 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73   network filesys
11570 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20  tem found.** on 
11580 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20  Apple Macintosh 
11590 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68  computers - both
115a0 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a   OS9 and OSX..**
115b0 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20  .** Third-party 
115c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
115d0 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c  of AFP are avail
115e0 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20  able.  But this 
115f0 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c  code here.** onl
11600 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a  y works on OSX..
11610 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
11620 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
11630 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
11640 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20  ING_STYLE./*.** 
11650 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  The afpLockingCo
11660 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
11670 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70  contains all afp
11680 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73   lock specific s
11690 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20  tate.*/.typedef 
116a0 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
116b0 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b  gContext afpLock
116c0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  ingContext;.stru
116d0 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
116e0 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73  text {.  int res
116f0 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63  erved;.  const c
11700 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
11710 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
11720 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
11730 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  e */.};..struct 
11740 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
11750 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .{.  unsigned lo
11760 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20  ng long offset; 
11770 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74         /* offset
11780 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74   to first byte t
11790 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
117a0 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
117b0 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a  ength;        /*
117c0 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f   nbr of bytes to
117d0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
117e0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65  ned long long re
117f0 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20  tRangeStart; /* 
11800 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20  nbr of 1st byte 
11810 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73  locked if succes
11820 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  sful */.  unsign
11830 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c  ed char unLockFl
11840 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31  ag;         /* 1
11850 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c   = unlock, 0 = l
11860 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
11870 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46  d char startEndF
11880 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d  lag;       /* 1=
11890 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f  rel to end of fo
118a0 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61  rk, 0=rel to sta
118b0 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  rt */.  int fd; 
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c            /* fil
118e0 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20  e desc to assoc 
118f0 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a  this lock with *
11900 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66  /.};..#define af
11910 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
11920 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49  2FSCTL        _I
11930 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
11940 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
11950 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  kPB2)../*.** Thi
11960 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  s is a utility f
11970 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c  or setting or cl
11980 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e  earing a bit-ran
11990 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a  ge lock on an.**
119a0 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e   AFP filesystem.
119b0 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53  .** .** Return S
119c0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
119d0 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ess, SQLITE_BUSY
119e0 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
119f0 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65  static int afpSe
11a00 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63  tLock(.  const c
11a10 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20  har *path,      
11a20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
11a30 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  of the file to b
11a40 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f  e locked or unlo
11a50 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69  cked */.  unixFi
11a60 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
11a70 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
11a80 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11a90 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e   on path */.  un
11aa0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
11ab0 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20   offset,     /* 
11ac0 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65  First byte to be
11ad0 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73   locked */.  uns
11ae0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
11af0 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e  length,     /* N
11b00 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
11b10 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  o lock */.  int 
11b20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20  setLockFlag     
11b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
11b40 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20  ue to set lock. 
11b50 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20   False to clear 
11b60 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
11b70 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
11b80 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65  kPB2 pb;.  int e
11b90 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f  rr;.  .  pb.unLo
11ba0 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b  ckFlag = setLock
11bb0 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20  Flag ? 0 : 1;.  
11bc0 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20  pb.startEndFlag 
11bd0 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74  = 0;.  pb.offset
11be0 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e   = offset;.  pb.
11bf0 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
11c00 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c   .  pb.fd = pFil
11c10 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41  e->h;.  .  OSTRA
11c20 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE(("AFPSETLOCK 
11c30 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e  [%s] for %d%s in
11c40 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78   range %llx:%llx
11c50 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f  \n", .    (setLo
11c60 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46  ckFlag?"ON":"OFF
11c70 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70  "), pFile->h, (p
11c80 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76  b.fd==-1?"[testv
11c90 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20  al-1]":""),.    
11ca0 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29  offset, length))
11cb0 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28  ;.  err = fsctl(
11cc0 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52  path, afpfsByteR
11cd0 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20  angeLock2FSCTL, 
11ce0 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20  &pb, 0);.  if ( 
11cf0 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  err==-1 ) {.    
11d00 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
11d10 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
11d20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 46      OSTRACE(("AF
11d30 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20  PSETLOCK failed 
11d40 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20  to fsctl() '%s' 
11d50 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
11d60 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72         path, tEr
11d70 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45  rno, strerror(tE
11d80 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20  rrno)));.#ifdef 
11d90 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46  SQLITE_IGNORE_AF
11da0 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  P_LOCK_ERRORS.  
11db0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
11dc0 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63  SY;.#else.    rc
11dd0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
11de0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
11df0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
11e00 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b           setLock
11e10 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f  Flag ? SQLITE_IO
11e20 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54  ERR_LOCK : SQLIT
11e30 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
11e40 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11e50 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43  E_IGNORE_AFP_LOC
11e60 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20  K_ERRORS */.    
11e70 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
11e80 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
11e90 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
11ea0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
11eb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11ec0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65   } else {.    re
11ed0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11ee0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
11ef0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
11f00 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
11f10 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
11f20 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
11f30 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
11f40 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
11f50 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
11f60 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
11f70 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
11f80 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
11f90 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
11fa0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
11fb0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
11fc0 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
11fd0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
11fe0 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
11ff0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
12000 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
12010 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12020 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
12030 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
12040 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
12050 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
12060 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
12070 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
12080 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
12090 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
120a0 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65  d;.  .  Simulate
120b0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
120c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
120d0 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
120e0 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
120f0 70 46 69 6c 65 20 29 3b 0a 20 20 61 66 70 4c 6f  pFile );.  afpLo
12100 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
12110 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
12120 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
12130 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
12140 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65  ext;.  if( conte
12150 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a  xt->reserved ){.
12160 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31      *pResOut = 1
12170 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12180 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
12190 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
121a0 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65  /* Because pFile
121b0 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
121c0 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
121d0 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65  s */.  .  /* Che
121e0 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
121f0 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
12200 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
12210 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
12220 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
12230 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
12240 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
12250 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
12260 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
12270 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
12280 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
12290 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
122a0 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f  ved ){.    /* lo
122b0 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ck the RESERVED 
122c0 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  byte */.    int 
122d0 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
122e0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
122f0 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
12300 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a  D_BYTE, 1,1);  .
12310 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
12320 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20  K==lrc ){.      
12330 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64  /* if we succeed
12340 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65  ed in taking the
12350 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20   reserved lock, 
12360 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73  unlock it to res
12370 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  tore.      ** th
12380 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  e original state
12390 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
123a0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
123b0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
123c0 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
123d0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65  , 1, 0);.    } e
123e0 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69  lse {.      /* i
123f0 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67  f we failed to g
12400 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e  et the lock then
12410 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75   someone else mu
12420 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20  st have it */.  
12430 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
12440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12450 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
12460 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c  c) ){.      rc=l
12470 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
12480 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
12490 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
124a0 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
124b0 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c   %d %d (afp)\n",
124c0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
124d0 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20  eserved));.  .  
124e0 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
124f0 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
12500 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
12510 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
12520 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
12530 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
12540 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
12550 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
12560 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
12570 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
12580 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
12590 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
125a0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
125b0 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
125c0 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
125d0 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
125e0 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
125f0 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
12600 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
12610 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
12620 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
12630 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
12640 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
12650 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
12660 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
12670 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
12680 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
12690 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
126a0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
126b0 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
126c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
126d0 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
126e0 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
126f0 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
12700 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
12710 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
12720 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
12730 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
12740 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
12750 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
12760 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
12770 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
12780 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
12790 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
127a0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
127b0 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
127c0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
127d0 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
127e0 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
127f0 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
12800 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
12810 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
12820 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
12830 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69  int afpLock(sqli
12840 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
12850 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
12860 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12870 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
12880 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
12890 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
128a0 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
128b0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
128c0 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
128d0 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
128e0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
128f0 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
12900 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  ingContext;.  . 
12910 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
12920 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
12930 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
12940 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
12950 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
12960 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
12970 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
12980 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63  Lock), azFileLoc
12990 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  k(pFile->eFileLo
129a0 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ck),.           
129b0 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64  azFileLock(pInod
129c0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70  e->eFileLock), p
129d0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c  Inode->nShared ,
129e0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
129f0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
12a00 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
12a10 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
12a20 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
12a30 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46  n the.  ** unixF
12a40 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ile, do nothing.
12a50 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61   Don't use the a
12a60 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  fp_end_lock: exi
12a70 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
12a80 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
12a90 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
12aa0 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
12ab0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
12ac0 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock>=eFileLock 
12ad0 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
12ae0 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
12af0 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
12b00 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
12b10 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
12b20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
12b30 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74  Lock)));.    ret
12b40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12b50 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
12b60 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
12b70 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
12b80 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20  ct.  **  (1) We 
12b90 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20  never move from 
12ba0 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74  unlocked to anyt
12bb0 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e  hing higher than
12bc0 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20   shared lock..  
12bd0 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e  **  (2) SQLite n
12be0 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20  ever explicitly 
12bf0 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69  requests a pendi
12c00 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33  g lock..  **  (3
12c10 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  ) A shared lock 
12c20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77  is always held w
12c30 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f  hen a reserve lo
12c40 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  ck is requested.
12c50 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
12c60 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12c70 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  !=NO_LOCK || eFi
12c80 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
12c90 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
12ca0 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44   eFileLock!=PEND
12cb0 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ING_LOCK );.  as
12cc0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
12cd0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
12ce0 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  | pFile->eFileLo
12cf0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
12d00 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20  );.  .  /* This 
12d10 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20  mutex is needed 
12d20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  because pFile->p
12d30 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
12d40 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20  across threads. 
12d50 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
12d60 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
12d70 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
12d80 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20  ;..  /* If some 
12d90 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
12da0 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b  s PID has a lock
12db0 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74   via a different
12dc0 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20   unixFile*.  ** 
12dd0 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63  handle that prec
12de0 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73  ludes the reques
12df0 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  ted lock, return
12e00 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66   BUSY..  */.  if
12e10 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ( (pFile->eFileL
12e20 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69  ock!=pInode->eFi
12e30 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20  leLock && .     
12e40 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
12e50 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
12e60 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e  CK || eFileLock>
12e70 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SHARED_LOCK)).  
12e80 20 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53     ){.    rc = S
12e90 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
12ea0 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
12eb0 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49  k;.  }.  .  /* I
12ec0 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  f a SHARED lock 
12ed0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  is requested, an
12ee0 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  d some thread us
12ef0 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72  ing this PID alr
12f00 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20  eady.  ** has a 
12f10 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56  SHARED or RESERV
12f20 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e  ED lock, then in
12f30 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  crement referenc
12f40 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a  e counts and.  *
12f50 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
12f60 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  OK..  */.  if( e
12f70 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
12f80 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28  _LOCK && .     (
12f90 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
12fa0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
12fb0 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  | pInode->eFileL
12fc0 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
12fd0 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
12fe0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
12ff0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
13000 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
13010 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
13020 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
13030 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b  de->nShared>0 );
13040 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
13050 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
13060 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
13070 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20  >nShared++;.    
13080 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
13090 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e  .    goto afp_en
130a0 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20  d_lock;.  }.    
130b0 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
130c0 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
130d0 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
130e0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
130f0 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
13100 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
13110 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
13120 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
13130 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
13140 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
13150 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ed..  */.  if( e
13160 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
13170 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20  _LOCK .      || 
13180 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  (eFileLock==EXCL
13190 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
131a0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50  ile->eFileLock<P
131b0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29  ENDING_LOCK).  )
131c0 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  {.    int failed
131d0 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61  ;.    failed = a
131e0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
131f0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
13200 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
13210 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66  1, 1);.    if (f
13220 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72  ailed) {.      r
13230 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  c = failed;.    
13240 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
13250 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ock;.    }.  }. 
13260 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f   .  /* If contro
13270 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70  l gets to this p
13280 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61  oint, then actua
13290 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64  lly go ahead and
132a0 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61   make.  ** opera
132b0 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c  ting system call
132c0 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  s for the specif
132d0 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ied lock..  */. 
132e0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
132f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
13300 20 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63     int lrc1, lrc
13310 32 2c 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20  2, lrc1Errno;.  
13320 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b    long lk, mask;
13330 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74  .    .    assert
13340 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
13350 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
13360 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
13370 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
13380 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20      .    mask = 
13390 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38  (sizeof(long)==8
133a0 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ) ? LARGEST_INT6
133b0 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a  4 : 0x7fffffff;.
133c0 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
133d0 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
133e0 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
133f0 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
13400 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
13410 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
13420 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
13430 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
13440 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70  random(); .    p
13450 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
13460 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25  e = (lk & mask)%
13470 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
13480 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66  );.    lrc1 = af
13490 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
134a0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
134b0 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52   .          SHAR
134c0 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
134d0 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
134e0 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  1);.    if( IS_L
134f0 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
13500 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72  ){.      lrc1Err
13510 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  no = pFile->last
13520 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
13530 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
13540 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
13550 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20  ock */.    lrc2 
13560 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
13570 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
13580 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
13590 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20  E, 1, 0);.    . 
135a0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
135b0 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20  RROR(lrc1) ) {. 
135c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
135d0 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e  Errno = lrc1Errn
135e0 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  o;.      rc = lr
135f0 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c1;.      goto a
13600 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
13610 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c   } else if( IS_L
13620 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20  OCK_ERROR(lrc2) 
13630 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  ){.      rc = lr
13640 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c2;.      goto a
13650 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
13660 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31   } else if( lrc1
13670 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20   != SQLITE_OK ) 
13680 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  {.      rc = lrc
13690 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  1;.    } else {.
136a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
136b0 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
136c0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
136d0 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
136e0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
136f0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
13700 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
13710 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
13720 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
13730 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
13740 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
13750 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
13760 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
13770 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
13780 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  s.     ** same p
13790 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
137a0 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
137b0 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
137c0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
137d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
137e0 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
137f0 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
13800 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
13810 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
13820 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
13830 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
13840 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
13850 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
13860 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
13870 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  /.    int failed
13880 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
13890 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ( 0!=pFile->eFil
138a0 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20  eLock );.    if 
138b0 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45  (eFileLock >= RE
138c0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70  SERVED_LOCK && p
138d0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
138e0 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  < RESERVED_LOCK)
138f0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63   {.        /* Ac
13900 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44  quire a RESERVED
13910 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
13920 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
13930 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
13940 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
13950 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
13960 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69  ;.      if( !fai
13970 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63  led ){.        c
13980 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
13990 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
139a0 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69    }.    if (!fai
139b0 6c 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  led && eFileLock
139c0 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   == EXCLUSIVE_LO
139d0 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41  CK) {.      /* A
139e0 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
139f0 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  IVE lock */.    
13a00 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65      .      /* Re
13a10 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64 20  move the shared 
13a20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69  lock before tryi
13a30 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77  ng the range.  w
13a40 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20  e'll need to .  
13a50 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69      ** reestabli
13a60 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
13a70 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20 67  ck if we can't g
13a80 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63  et the  afpUnloc
13a90 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  k.      */.     
13aa0 20 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20   if( !(failed = 
13ab0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
13ac0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
13ad0 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  e, SHARED_FIRST 
13ae0 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
13af0 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64             pInod
13b00 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  e->sharedByte, 1
13b10 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 0)) ){.       
13b20 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53   int failed2 = S
13b30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
13b40 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70    /* now attemmp
13b50 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63  t to get the exc
13b60 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67  lusive lock rang
13b70 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  e */.        fai
13b80 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
13b90 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
13ba0 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
13bb0 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20  FIRST, .        
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bd0 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
13be0 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ZE, 1);.        
13bf0 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66  if( failed && (f
13c00 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c  ailed2 = afpSetL
13c10 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
13c20 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
13c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c40 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
13c50 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65   + pInode->share
13c60 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b  dByte, 1, 1)) ){
13c70 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
13c80 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20  n't reestablish 
13c90 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  the shared lock.
13ca0 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64    Sqlite can't d
13cb0 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20  eal, this is.   
13cc0 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74         ** a crit
13cd0 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20  ical I/O error. 
13ce0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
13cf0 20 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69        rc = ((fai
13d00 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  led & SQLITE_IOE
13d10 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
13d20 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a  ERR) ? failed2 :
13d30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
13d40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
13d50 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  CK;.          go
13d60 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
13d70 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
13d80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13d90 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20   rc = failed; . 
13da0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13db0 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20   if( failed ){. 
13dc0 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
13dd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
13de0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13df0 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
13e00 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
13e10 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
13e20 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
13e30 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
13e40 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
13e50 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
13e60 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
13e70 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
13e80 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
13e90 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
13ea0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
13eb0 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f   }.  .afp_end_lo
13ec0 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
13ed0 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
13ee0 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
13ef0 73 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70  s %s (afp)\n", p
13f00 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c  File->h, azFileL
13f10 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
13f20 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  .         rc==SQ
13f30 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
13f40 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
13f50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13f60 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
13f70 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
13f80 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
13f90 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
13fa0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
13fb0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
13fc0 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
13fd0 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
13fe0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
13ff0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
14000 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
14010 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
14020 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
14030 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
14040 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
14050 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
14060 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b  ic int afpUnlock
14070 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14080 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
14090 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
140a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
140b0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
140c0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
140d0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
140e0 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  node;.  afpLocki
140f0 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
14100 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
14110 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
14120 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
14130 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72  ;.  int skipShar
14140 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ed = 0;.#ifdef S
14150 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
14160 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23   h = pFile->h;.#
14170 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
14180 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
14190 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
141a0 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64   %d was %d(%d,%d
141b0 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
141c0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
141d0 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
141e0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
141f0 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
14200 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  de->eFileLock, p
14210 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
14220 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20  hared,.         
14230 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20    getpid()));.. 
14240 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
14250 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
14260 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
14270 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65  eFileLock<=eFile
14280 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
14290 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
142a0 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
142b0 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
142c0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
142d0 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
142e0 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a  ->nShared!=0 );.
142f0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
14300 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
14310 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
14320 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
14330 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ock==pFile->eFil
14340 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d  eLock );.    Sim
14350 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
14360 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c  gn(1);.    Simul
14370 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
14380 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74  1) ).    Simulat
14390 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
143a0 29 3b 0a 20 20 20 20 0a 23 69 66 6e 64 65 66 20  );.    .#ifndef 
143b0 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68  NDEBUG.    /* Wh
143c0 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f  en reducing a lo
143d0 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68  ck such that oth
143e0 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e  er processes can
143f0 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65   start.    ** re
14400 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
14410 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d  se file again, m
14420 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
14430 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
14440 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
14450 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20   updated if any 
14460 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
14470 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
14480 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
14490 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
144a0 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64  unter is not upd
144b0 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68  ated,.    ** oth
144c0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  er connections t
144d0 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  o the same file 
144e0 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a  might not realiz
144f0 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
14500 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67  e file has chang
14510 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67  ed and hence mig
14520 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66  ht not know to f
14530 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a  lush their.    *
14540 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73  * cache.  The us
14550 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63  e of a stale cac
14560 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  he can lead to d
14570 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
14580 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
14590 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e  ssert( pFile->in
145a0 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20  NormalWrite==0. 
145b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69            || pFi
145c0 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a  le->dbUpdate==0.
145d0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46             || pF
145e0 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
145f0 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69  ng==1 );.    pFi
14600 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
14610 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  e = 0;.#endif.  
14620 20 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65    .    if( pFile
14630 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ->eFileLock==EXC
14640 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
14650 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
14660 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
14670 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
14680 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45  RED_FIRST, SHARE
14690 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
146a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
146b0 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63  _OK && (eFileLoc
146c0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
146d0 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  | pInode->nShare
146e0 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  d>1) ){.        
146f0 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62  /* only re-estab
14700 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
14710 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72  lock if necessar
14720 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  y */.        int
14730 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20   sharedLockByte 
14740 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  = SHARED_FIRST+p
14750 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
14760 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e;.        rc = 
14770 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
14780 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
14790 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e, sharedLockByt
147a0 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  e, 1, 1);.      
147b0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
147c0 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b   skipShared = 1;
147d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
147e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
147f0 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  E_OK && pFile->e
14800 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e  FileLock>=PENDIN
14810 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  G_LOCK ){.      
14820 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
14830 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
14840 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
14850 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
14860 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   } .    if( rc==
14870 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
14880 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52  le->eFileLock>=R
14890 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
148a0 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
148b0 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
148c0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
148d0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
148e0 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
148f0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 1, 0);.      i
14900 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20  f( !rc ){ .     
14910 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65     context->rese
14920 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20  rved = 0; .     
14930 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
14940 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14950 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  & (eFileLock==SH
14960 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
14970 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29  ode->nShared>1))
14980 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
14990 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
149a0 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  ED_LOCK;.    }. 
149b0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
149c0 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c  ITE_OK && eFileL
149d0 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ock==NO_LOCK ){.
149e0 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
149f0 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  t the shared loc
14a00 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65  k counter.  Rele
14a10 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ase the lock usi
14a20 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20  ng an.    ** OS 
14a30 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61  call only when a
14a40 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68  ll threads in th
14a50 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  is same process 
14a60 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20  have released.  
14a70 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20    ** the lock.. 
14a80 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e     */.    unsign
14a90 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61  ed long long sha
14aa0 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
14ab0 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
14ac0 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  e->sharedByte;. 
14ad0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
14ae0 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ed--;.    if( pI
14af0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
14b00 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61   ){.      Simula
14b10 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
14b20 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  1);.      Simula
14b30 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
14b40 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  ) ).      Simula
14b50 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
14b60 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73  0);.      if( !s
14b70 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20  kipShared ){.   
14b80 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
14b90 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
14ba0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61  Path, pFile, sha
14bb0 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
14bc0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
14bd0 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
14be0 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
14bf0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
14c00 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
14c10 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
14c20 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
14c30 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
14c40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14c50 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
14c60 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  --;.      assert
14c70 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e  ( pInode->nLock>
14c80 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
14c90 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
14ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
14cb0 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
14cc0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d  (pFile);.      }
14cd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
14ce0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
14cf0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
14d00 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65  TE_OK ) pFile->e
14d10 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
14d20 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
14d30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
14d40 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e  e a file & clean
14d50 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20  up AFP specific 
14d60 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
14d70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
14d80 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  fpClose(sqlite3_
14d90 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
14da0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14db0 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  ;.  if( id ){.  
14dc0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
14dd0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
14de0 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b  d;.    afpUnlock
14df0 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
14e00 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
14e10 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69  x();.    if( pFi
14e20 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46  le->pInode && pF
14e30 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
14e40 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ck ){.      /* I
14e50 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
14e60 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
14e70 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
14e80 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
14e90 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20  st.      ** yet 
14ea0 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
14eb0 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
14ec0 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
14ed0 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
14ee0 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
14ef0 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e   to pInode->aPen
14f00 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62  ding.  It will b
14f10 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
14f20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20  closed when.    
14f30 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f    ** the last lo
14f40 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
14f50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65       */.      se
14f60 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
14f70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  );.    }.    rel
14f80 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
14f90 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ile);.    sqlite
14fa0 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
14fb0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
14fc0 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69     rc = closeUni
14fd0 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75  xFile(id);.    u
14fe0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
14ff0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
15000 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ;.}..#endif /* d
15010 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
15020 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
15030 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
15040 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f   */./*.** The co
15050 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20  de above is the 
15060 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
15070 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f  ntation.  The co
15080 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a  de is specific.*
15090 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20  * to MacOSX and 
150a0 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
150b0 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74   other unix plat
150c0 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72  forms.  No alter
150d0 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61  native.** is ava
150e0 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20  ilable.  If you 
150f0 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f  don't compile fo
15100 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68  r a mac, then th
15110 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20  e "unix-afp".** 
15120 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  VFS is not avail
15130 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  able..**.*******
15140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
15150 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f  nd of the AFP lo
15160 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
15170 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
15180 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
15190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151d0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
151e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15220 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
15230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15240 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20  ***** Begin NFS 
15250 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
15260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15270 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64  ********/..#if d
15280 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
15290 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
152a0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
152b0 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68  ./*. ** Lower th
152c0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
152d0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
152e0 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
152f0 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
15300 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  k. ** must be ei
15310 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
15320 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a  SHARED_LOCK.. **
15330 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  . ** If the lock
15340 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
15350 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
15360 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
15370 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20  r below. ** the 
15380 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
15390 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
153a0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
153b0 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
153c0 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   nfsUnlock(sqlit
153d0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
153e0 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72   eFileLock){.  r
153f0 65 74 75 72 6e 20 5f 70 6f 73 69 78 55 6e 6c 6f  eturn _posixUnlo
15400 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b  ck(id, eFileLock
15410 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  , 1);.}..#endif 
15420 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
15430 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
15440 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
15450 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
15460 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
15470 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
15480 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
15490 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
154a0 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
154b0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
154c0 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
154d0 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
154e0 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
154f0 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a   available.  .**
15500 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
15510 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
15520 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
15530 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
15540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15550 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
15560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
155a0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
155b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
155c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
155d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
155e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
155f0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
15600 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73  ** Non-locking s
15610 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
15620 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
15630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15640 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  *.**.** The next
15650 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
15660 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ns implementatio
15670 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f  ns for all metho
15680 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71  ds of the .** sq
15690 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63  lite3_file objec
156a0 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  t other than the
156b0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
156c0 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  .  The locking.*
156d0 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64  * methods were d
156e0 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69  efined in divisi
156f0 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c  ons above (one l
15700 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65  ocking method pe
15710 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20  r.** division). 
15720 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74   Those methods t
15730 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74  hat are common t
15740 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f  o all locking mo
15750 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65  des.** are gathe
15760 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20  r together into 
15770 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  this division..*
15780 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  /../*.** Seek to
15790 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73   the offset pass
157a0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
157b0 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20   argument, then 
157c0 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74  read cnt .** byt
157d0 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65  es into pBuf. Re
157e0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
157f0 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
15800 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42  y read..**.** NB
15810 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65  :  If you define
15820 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53   USE_PREAD or US
15830 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20  E_PREAD64, then 
15840 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a  it might also.**
15850 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
15860 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
15870 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e  OURCE to be 500.
15880 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72    This varies fr
15890 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d  om.** one system
158a0 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69   to another.  Si
158b0 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20  nce SQLite does 
158c0 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50  not define USE_P
158d0 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20  READ.** any any 
158e0 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c  form by default,
158f0 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74   we will not att
15900 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f  empt to define _
15910 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a  XOPEN_SOURCE..**
15920 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37   See tickets #27
15930 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a  41 and #2681..**
15940 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
15950 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
15960 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
15970 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45  d read the lastE
15980 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73  rrno value.** is
15990 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75   set before retu
159a0 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
159b0 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64   int seekAndRead
159c0 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73  (unixFile *id, s
159d0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
159e0 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c  set, void *pBuf,
159f0 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74   int cnt){.  int
15a00 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69   got;.#if (!defi
15a10 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
15a20 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
15a30 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
15a40 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
15a50 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
15a60 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
15a70 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d 20 70  PREAD).  got = p
15a80 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66  read(id->h, pBuf
15a90 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
15aa0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
15ab0 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
15ac0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
15ad0 5f 50 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20  _PREAD64).  got 
15ae0 3d 20 70 72 65 61 64 36 34 28 69 64 2d 3e 68 2c  = pread64(id->h,
15af0 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
15b00 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  et);.  SimulateI
15b10 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
15b20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f   );.#else.  newO
15b30 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64  ffset = lseek(id
15b40 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45  ->h, offset, SEE
15b50 4b 5f 53 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61  K_SET);.  Simula
15b60 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66  teIOError( newOf
15b70 66 73 65 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20  fset-- );.  if( 
15b80 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65  newOffset!=offse
15b90 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77  t ){.    if( new
15ba0 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a  Offset == -1 ){.
15bb0 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
15bc0 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
15bd0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65   = errno;.    }e
15be0 6c 73 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  lse{.      ((uni
15bf0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
15c00 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20  Errno = 0;....  
15c10 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d    }.    return -
15c20 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 72  1;.  }.  got = r
15c30 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
15c40 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20   cnt);.#endif.  
15c50 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28  TIMER_END;.  if(
15c60 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28   got<0 ){.    ((
15c70 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
15c80 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
15c90 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
15ca0 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
15cb0 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
15cc0 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66  , id->h, got, of
15cd0 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50  fset, TIMER_ELAP
15ce0 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  SED));.  return 
15cf0 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  got;.}../*.** Re
15d00 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
15d10 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
15d20 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
15d30 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
15d40 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
15d50 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
15d60 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
15d70 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
15d80 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
15d90 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a  c int unixRead(.
15da0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
15db0 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75  id, .  void *pBu
15dc0 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
15dd0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
15de0 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46  ffset.){.  unixF
15df0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
15e00 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69  ixFile *)id;.  i
15e10 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74  nt got;.  assert
15e20 28 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ( id );..  /* If
15e30 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
15e40 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
15e50 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
15e60 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
15e70 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
15e80 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
15e90 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
15ea0 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
15eb0 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
15ec0 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
15ed0 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
15ee0 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
15ef0 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
15f00 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
15f10 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
15f20 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
15f30 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65  dif..  got = see
15f40 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
15f50 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d  offset, pBuf, am
15f60 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61  t);.  if( got==a
15f70 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  mt ){.    return
15f80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
15f90 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  lse if( got<0 ){
15fa0 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e  .    /* lastErrn
15fb0 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
15fc0 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75  Read */.    retu
15fd0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
15fe0 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
15ff0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
16000 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20  rno = 0; /* not 
16010 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
16020 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  /.    /* Unread 
16030 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
16040 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
16050 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
16060 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
16070 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d  Buf)[got], 0, am
16080 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75  t-got);.    retu
16090 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
160a0 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
160b0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  }../*.** Seek to
160c0 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69   the offset in i
160d0 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72  d->offset then r
160e0 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e  ead cnt bytes in
160f0 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75  to pBuf..** Retu
16100 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
16110 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
16120 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68  read.  Update th
16130 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  e offset..**.** 
16140 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e  To avoid stompin
16150 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75  g the errno valu
16160 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72  e on a failed wr
16170 69 74 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e  ite the lastErrn
16180 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  o value.** is se
16190 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
161a0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
161b0 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75  t seekAndWrite(u
161c0 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  nixFile *id, i64
161d0 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76   offset, const v
161e0 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
161f0 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
16200 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53  #if (!defined(US
16210 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66  E_PREAD) && !def
16220 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
16230 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  )).  i64 newOffs
16240 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  et;.#endif.  TIM
16250 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65  ER_START;.#if de
16260 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
16270 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65 28  .  got = pwrite(
16280 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
16290 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 69 66  , offset);.#elif
162a0 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
162b0 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 77  AD64).  got = pw
162c0 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70 42  rite64(id->h, pB
162d0 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
162e0 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66  ;.#else.  newOff
162f0 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
16300 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
16310 53 45 54 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f  SET);.  if( newO
16320 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b  ffset!=offset ){
16330 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73  .    if( newOffs
16340 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
16350 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
16360 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
16370 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rrno;.    }else{
16380 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
16390 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
163a0 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a  o = 0;....    }.
163b0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
163c0 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69 74 65   }.  got = write
163d0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
163e0 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  t);.#endif.  TIM
163f0 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f  ER_END;.  if( go
16400 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  t<0 ){.    ((uni
16410 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
16420 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
16430 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
16440 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64  WRITE   %-3d %5d
16450 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
16460 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
16470 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
16480 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  D));.  return go
16490 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  t;.}.../*.** Wri
164a0 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
164b0 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
164c0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
164d0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
164e0 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
164f0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
16500 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
16510 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
16520 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
16530 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  *id, .  const vo
16540 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
16550 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
16560 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b  int64 offset .){
16570 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
16580 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
16590 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  id;.  int wrote 
165a0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
165b0 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
165c0 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
165d0 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
165e0 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
165f0 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
16600 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
16610 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
16620 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
16630 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
16640 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
16650 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
16660 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
16670 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
16680 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
16690 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
166a0 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
166b0 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
166c0 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
166d0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  dif..#ifndef NDE
166e0 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61  BUG.  /* If we a
166f0 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61  re doing a norma
16700 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74  l write to a dat
16710 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f  abase file (as o
16720 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64  pposed to.  ** d
16730 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
16740 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
16750 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
16760 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
16770 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74  .  ** normal dat
16780 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e  abase file) then
16790 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
167a0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
167b0 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e  se.  ** has chan
167c0 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
167d0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
167e0 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65   is modified, re
167f0 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66  cord that.  ** f
16800 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  act too..  */.  
16810 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
16820 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20  malWrite ){.    
16830 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
16840 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  = 1;  /* The dat
16850 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d  abase has been m
16860 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69  odified */.    i
16870 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26  f( offset<=24 &&
16880 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20   offset+amt>=27 
16890 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
168a0 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43  .      char oldC
168b0 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69  ntr[4];.      Si
168c0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
168d0 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63  ign(1);.      rc
168e0 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70   = seekAndRead(p
168f0 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74  File, 24, oldCnt
16900 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d  r, 4);.      Sim
16910 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
16920 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
16930 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70   rc!=4 || memcmp
16940 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61  (oldCntr, &((cha
16950 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73  r*)pBuf)[24-offs
16960 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20  et], 4)!=0 ){.  
16970 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
16980 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20  nsCntrChng = 1; 
16990 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
169a0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20  ion counter has 
169b0 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20  changed */.     
169c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
169d0 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d  dif..  while( am
169e0 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20  t>0 && (wrote = 
169f0 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
16a00 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
16a10 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20  , amt))>0 ){.   
16a20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20   amt -= wrote;. 
16a30 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f     offset += wro
16a40 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
16a50 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
16a60 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75  ote];.  }.  Simu
16a70 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72  lateIOError(( wr
16a80 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20  ote=(-1), amt=1 
16a90 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  ));.  SimulateDi
16aa0 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72  skfullError(( wr
16ab0 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b  ote=0, amt=1 ));
16ac0 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b  ..  if( amt>0 ){
16ad0 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30  .    if( wrote<0
16ae0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73   ){.      /* las
16af0 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
16b00 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
16b10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16b20 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
16b30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16b40 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16b50 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
16b60 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
16b70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16b80 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
16b90 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
16ba0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
16bb0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
16bc0 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
16bd0 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
16be0 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
16bf0 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
16c00 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
16c10 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
16c20 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72  syncs are occurr
16c30 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
16c40 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
16c50 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
16c60 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
16c70 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
16c80 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
16c90 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74  *.** We do not t
16ca0 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20  rust systems to 
16cb0 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e  provide a workin
16cc0 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20  g fdatasync().  
16cd0 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65  Some do..** Othe
16ce0 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65  rs do no.  To be
16cf0 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73   safe, we will s
16d00 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73  tick with the (s
16d10 6c 6f 77 65 72 29 20 66 73 79 6e 63 28 29 2e 0a  lower) fsync()..
16d20 2a 2a 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74  ** If you know t
16d30 68 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20  hat your system 
16d40 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61  does support fda
16d50 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74  tasync() correct
16d60 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70  ly,.** then simp
16d70 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20  ly compile with 
16d80 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74  -Dfdatasync=fdat
16d90 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65  async.*/.#if !de
16da0 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29  fined(fdatasync)
16db0 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c   && !defined(__l
16dc0 69 6e 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65  inux__).# define
16dd0 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63   fdatasync fsync
16de0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
16df0 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
16e00 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64  SYNC to 0 or 1 d
16e10 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
16e20 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
16e30 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61  e F_FULLFSYNC ma
16e40 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20  cro is defined. 
16e50 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20   F_FULLFSYNC is 
16e60 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c  currently.** onl
16e70 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d  y available on M
16e80 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68  ac OS X.  But th
16e90 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e  at could change.
16ea0 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c  .*/.#ifdef F_FUL
16eb0 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  LFSYNC.# define 
16ec0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31  HAVE_FULLFSYNC 1
16ed0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
16ee0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30  HAVE_FULLFSYNC 0
16ef0 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
16f00 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74  The fsync() syst
16f10 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74  em call does not
16f20 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69   work as adverti
16f30 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75  sed on many.** u
16f40 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68  nix systems.  Th
16f50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63  e following proc
16f60 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65  edure is an atte
16f70 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69  mpt to make.** i
16f80 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a  t work better..*
16f90 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
16fa0 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69  NO_SYNC macro di
16fb0 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63  sables all fsync
16fc0 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ()s.  This is us
16fd0 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74  eful.** for test
16fe0 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74  ing when we want
16ff0 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20   to run through 
17000 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71  the test suite q
17010 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61  uickly..** You a
17020 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69  re strongly advi
17030 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70  sed *not* to dep
17040 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f  loy with SQLITE_
17050 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c  NO_SYNC.** enabl
17060 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e  ed, however, sin
17070 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  ce with SQLITE_N
17080 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20  O_SYNC enabled, 
17090 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f  an OS crash.** o
170a0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  r power failure 
170b0 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72  will likely corr
170c0 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65  upt the database
170d0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
170e0 69 74 65 20 73 65 74 73 20 74 68 65 20 64 61 74  ite sets the dat
170f0 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68  aOnly flag if th
17100 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
17110 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  le is unchanged.
17120 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65 68  .** The idea beh
17130 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20  ind dataOnly is 
17140 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f  that it should o
17150 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20 66 69  nly write the fi
17160 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f  le content.** to
17170 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69   disk, not the i
17180 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73  node.  We only s
17190 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74  et dataOnly if t
171a0 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20  he file size is 
171b0 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69  .** unchanged si
171c0 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a  nce the file siz
171d0 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
171e0 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72   inode.  However
171f0 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74  , .** Ted Ts'o t
17200 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64 61  ells us that fda
17210 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c  tasync() will al
17220 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f  so write the ino
17230 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c  de if the.** fil
17240 65 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67  e size has chang
17250 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65  ed.  The only re
17260 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  al difference be
17270 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28  tween fdatasync(
17280 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29  ).** and fsync()
17290 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20  , Ted tells us, 
172a0 69 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e  is that fdatasyn
172b0 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75  c() will not flu
172c0 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20  sh the.** inode 
172d0 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20  if the mtime or 
172e0 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69  owner or other i
172f0 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 20  node attributes 
17300 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  have changed..**
17310 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62   We only care ab
17320 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a  out the file siz
17330 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72  e, not the other
17340 20 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73   file attributes
17350 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61  , so.** as far a
17360 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63  s SQLite is conc
17370 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73  erned, an fdatas
17380 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73 20  ync() is always 
17390 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c  adequate..** So,
173a0 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66   we always use f
173b0 64 61 74 61 73 79 6e 63 28 29 20 69 66 20 69 74  datasync() if it
173c0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
173d0 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20  egardless of.** 
173e0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
173f0 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a   dataOnly flag..
17400 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75  */.static int fu
17410 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c  ll_fsync(int fd,
17420 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69   int fullSync, i
17430 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20  nt dataOnly){.  
17440 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
17450 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64  e following "ifd
17460 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62  ef/elif/else/" b
17470 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d  lock has the sam
17480 65 20 73 74 72 75 63 74 75 72 65 20 61 73 0a 20  e structure as. 
17490 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f   ** the one belo
174a0 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63 61  w. It is replica
174b0 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20  ted here solely 
174c0 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72  to avoid clutter
174d0 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ing .  ** up the
174e0 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20   real code with 
174f0 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  the UNUSED_PARAM
17500 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20  ETER() macros.. 
17510 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
17520 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53  E_NO_SYNC.  UNUS
17530 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
17540 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
17550 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a  ETER(fullSync);.
17560 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
17570 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65  ER(dataOnly);.#e
17580 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
17590 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
175a0 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
175b0 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
175c0 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79  PARAMETER(fullSy
175d0 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  nc);.  UNUSED_PA
175e0 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
175f0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
17600 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
17610 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
17620 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66  we do a normal f
17630 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a  sync() and .  **
17640 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73   FULLSYNC.  This
17650 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
17660 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66  testing to verif
17670 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63  y that this proc
17680 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20  edure.  ** gets 
17690 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
176a0 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74  correct argument
176b0 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
176c0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
176d0 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69   fullSync ) sqli
176e0 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
176f0 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt++;.  sqlite3_
17700 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
17710 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ndif..  /* If we
17720 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
17730 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
17740 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
17750 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
17760 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66  o-op.  */.#ifdef
17770 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
17780 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
17790 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  ;.#elif HAVE_FUL
177a0 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c  LFSYNC.  if( ful
177b0 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  lSync ){.    rc 
177c0 3d 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55  = fcntl(fd, F_FU
177d0 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d  LLFSYNC, 0);.  }
177e0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31  else{.    rc = 1
177f0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68  ;.  }.  /* If th
17800 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c  e FULLFSYNC fail
17810 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ed, fall back to
17820 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66   attempting an f
17830 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20  sync()..  ** It 
17840 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73  shouldn't be pos
17850 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73  sible for fullfs
17860 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74  ync to fail on t
17870 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66  he local .  ** f
17880 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f  ile system (on O
17890 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20  SX), so failure 
178a0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46  indicates that F
178b0 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73  ULLFSYNC.  ** is
178c0 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f  n't supported fo
178d0 72 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74  r this file syst
178e0 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20  em. So, attempt 
178f0 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61  an fsync .  ** a
17900 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e  nd (for now) ign
17910 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64  ore the overhead
17920 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75   of a superfluou
17930 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a  s fcntl call.  .
17940 20 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74    ** It'd be bet
17950 74 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75  ter to detect fu
17960 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20  llfsync support 
17970 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a  once and avoid .
17980 20 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63    ** the fcntl c
17990 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73  all every time s
179a0 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20  ync is called.. 
179b0 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72   */.  if( rc ) r
179c0 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a  c = fsync(fd);..
179d0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  #elif defined(__
179e0 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64  APPLE__).  /* fd
179f0 61 74 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53  atasync() on HFS
17a00 2b 20 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c  + doesn't yet fl
17a10 75 73 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ush the file siz
17a20 65 20 69 66 20 69 74 20 63 68 61 6e 67 65 64 20  e if it changed 
17a30 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73  correctly.  ** s
17a40 6f 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64  o currently we d
17a50 65 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61  efault to the ma
17a60 63 72 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e  cro that redefin
17a70 65 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20  es fdatasync to 
17a80 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20  fsync.  */.  rc 
17a90 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c  = fsync(fd);.#el
17aa0 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61  se .  rc = fdata
17ab0 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53  sync(fd);.#if OS
17ac0 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72  _VXWORKS.  if( r
17ad0 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d  c==-1 && errno==
17ae0 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72  ENOTSUP ){.    r
17af0 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20  c = fsync(fd);. 
17b00 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f   }.#endif /* OS_
17b10 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69  VXWORKS */.#endi
17b20 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54  f /* ifdef SQLIT
17b30 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48  E_NO_SYNC elif H
17b40 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f  AVE_FULLFSYNC */
17b50 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52  ..  if( OS_VXWOR
17b60 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b  KS && rc!= -1 ){
17b70 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d  .    rc = 0;.  }
17b80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17b90 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
17ba0 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
17bb0 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
17bc0 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
17bd0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  o disk..**.** If
17be0 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65   dataOnly==0 the
17bf0 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20  n both the file 
17c00 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d  itself and its m
17c10 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a  etadata (file.**
17c20 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69   size, access ti
17c30 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e  me, etc) are syn
17c40 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c  ced.  If dataOnl
17c50 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74  y!=0 then only t
17c60 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20  he.** file data 
17c70 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
17c80 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73   Under Unix, als
17c90 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
17ca0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
17cb0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c  ntry for the fil
17cc0 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72  e.** has been cr
17cd0 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69  eated by fsync-i
17ce0 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ng the directory
17cf0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
17d00 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77  he file..** If w
17d10 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  e do not do this
17d20 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65   and we encounte
17d30 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
17d40 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  e, the directory
17d50 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68  .** entry for th
17d60 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
17d70 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20  not exist after 
17d80 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20  we reboot.  The 
17d90 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74  next.** SQLite t
17da0 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  o access the fil
17db0 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20  e will not know 
17dc0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
17dd0 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65   exists (because
17de0 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
17df0 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  y entry for the 
17e00 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65  journal was neve
17e10 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74  r created) and t
17e20 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
17e30 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
17e40 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20  back - possibly 
17e50 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62  leading to datab
17e60 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
17e70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
17e80 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  ixSync(sqlite3_f
17e90 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
17ea0 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
17eb0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
17ec0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
17ed0 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f  ;..  int isDataO
17ee0 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c  nly = (flags&SQL
17ef0 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
17f00 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c  Y);.  int isFull
17f10 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78  sync = (flags&0x
17f20 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
17f30 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65  _FULL;..  /* Che
17f40 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53  ck that one of S
17f50 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
17f60 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61  L or FULL was pa
17f70 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ssed */.  assert
17f80 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53  ((flags&0x0F)==S
17f90 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
17fa0 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67  L.      || (flag
17fb0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
17fc0 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a  SYNC_FULL.  );..
17fd0 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74    /* Unix cannot
17fe0 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65  , but some syste
17ff0 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ms may return SQ
18000 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68  LITE_FULL from h
18010 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c  ere. This.  ** l
18020 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74  ine is to test t
18030 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65  hat doing so doe
18040 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
18050 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
18060 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
18070 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  lError( return S
18080 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20  QLITE_FULL );.. 
18090 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
180a0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  ;.  OSTRACE(("SY
180b0 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  NC    %-3d\n", p
180c0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20  File->h));.  rc 
180d0 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  = full_fsync(pFi
180e0 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e  le->h, isFullsyn
180f0 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a  c, isDataOnly);.
18100 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
18110 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
18120 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
18130 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
18140 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
18150 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
18160 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c  ITE_IOERR_FSYNC,
18170 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70   "full_fsync", p
18180 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
18190 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64  }.  if( pFile->d
181a0 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 69  irfd>=0 ){.    i
181b0 6e 74 20 65 72 72 3b 0a 20 20 20 20 4f 53 54 52  nt err;.    OSTR
181c0 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 2d  ACE(("DIRSYNC %-
181d0 33 64 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79  3d (have_fullfsy
181e0 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25  nc=%d fullsync=%
181f0 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69  d)\n", pFile->di
18200 72 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rfd,.           
18210 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c   HAVE_FULLFSYNC,
18220 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 23   isFullsync));.#
18230 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
18240 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20  SABLE_DIRSYNC.  
18250 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 6f    /* The directo
18260 72 79 20 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20  ry sync is only 
18270 61 74 74 65 6d 70 74 65 64 20 69 66 20 66 75 6c  attempted if ful
18280 6c 5f 66 73 79 6e 63 20 69 73 0a 20 20 20 20 2a  l_fsync is.    *
18290 2a 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20  * turned off or 
182a0 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66  unavailable.  If
182b0 20 61 20 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63   a full_fsync oc
182c0 63 75 72 72 65 64 20 61 62 6f 76 65 2c 0a 20 20  curred above,.  
182d0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 69    ** then the di
182e0 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20  rectory sync is 
182f0 73 75 70 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20  superfluous..   
18300 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 48 41   */.    if( (!HA
18310 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20  VE_FULLFSYNC || 
18320 21 69 73 46 75 6c 6c 73 79 6e 63 29 20 26 26 20  !isFullsync) && 
18330 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65  full_fsync(pFile
18340 2d 3e 64 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a  ->dirfd,0,0) ){.
18350 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20         /*.      
18360 20 2a 2a 20 57 65 20 68 61 76 65 20 72 65 63 65   ** We have rece
18370 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 72 65  ived multiple re
18380 70 6f 72 74 73 20 6f 66 20 66 73 79 6e 63 28 29  ports of fsync()
18390 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20   returning.     
183a0 20 20 2a 2a 20 65 72 72 6f 72 73 20 77 68 65 6e    ** errors when
183b0 20 61 70 70 6c 69 65 64 20 74 6f 20 64 69 72 65   applied to dire
183c0 63 74 6f 72 69 65 73 20 6f 6e 20 63 65 72 74 61  ctories on certa
183d0 69 6e 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  in file systems.
183e0 0a 20 20 20 20 20 20 20 2a 2a 20 41 20 66 61 69  .       ** A fai
183f0 6c 65 64 20 64 69 72 65 63 74 6f 72 79 20 73 79  led directory sy
18400 6e 63 20 69 73 20 6e 6f 74 20 61 20 62 69 67 20  nc is not a big 
18410 64 65 61 6c 2e 20 20 53 6f 20 69 74 20 73 65 65  deal.  So it see
18420 6d 73 0a 20 20 20 20 20 20 20 2a 2a 20 62 65 74  ms.       ** bet
18430 74 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68  ter to ignore th
18440 65 20 65 72 72 6f 72 2e 20 20 54 69 63 6b 65 74  e error.  Ticket
18450 20 23 31 36 35 37 0a 20 20 20 20 20 20 20 2a 2f   #1657.       */
18460 0a 20 20 20 20 20 20 20 2f 2a 20 70 46 69 6c 65  .       /* pFile
18470 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
18480 72 6e 6f 3b 20 2a 2f 0a 20 20 20 20 20 20 20 2f  rno; */.       /
18490 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
184a0 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a  IOERR; */.    }.
184b0 23 65 6e 64 69 66 0a 20 20 20 20 65 72 72 20 3d  #endif.    err =
184c0 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69   close(pFile->di
184d0 72 66 64 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6e 65  rfd); /* Only ne
184e0 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c  ed to sync once,
184f0 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 2a 2f   so close the */
18500 0a 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20  .    if( err==0 
18510 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
18520 2f 2a 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  /* directory whe
18530 6e 20 77 65 20 61 72 65 20 64 6f 6e 65 20 2a 2f  n we are done */
18540 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 69  .      pFile->di
18550 72 66 64 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  rfd = -1;.    }e
18560 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
18570 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
18580 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
18590 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
185a0 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c  ITE_IOERR_DIR_CL
185b0 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 20 70 46  OSE, "close", pF
185c0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
185d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
185e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
185f0 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
18600 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
18610 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
18620 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
18630 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
18640 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  id, i64 nByte){.
18650 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
18660 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
18670 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  id;.  int rc;.  
18680 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
18690 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
186a0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
186b0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
186c0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
186d0 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67   user has config
186e0 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a  ured a chunk-siz
186f0 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  e for this file,
18700 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
18710 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  ** file so that 
18720 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  it consists of a
18730 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
18740 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e   of chunks (i.e.
18750 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
18760 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72   file size after
18770 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d   the operation m
18780 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ay be larger tha
18790 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a  n the requested.
187a0 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f    ** size)..  */
187b0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a  .  if( pFile->sz
187c0 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 6e 42 79  Chunk ){.    nBy
187d0 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70  te = ((nByte + p
187e0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20  File->szChunk - 
187f0 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  1)/pFile->szChun
18800 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68  k) * pFile->szCh
18810 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  unk;.  }..  rc =
18820 20 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65   ftruncate(pFile
18830 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74  ->h, (off_t)nByt
18840 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
18850 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
18860 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
18870 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
18880 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
18890 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74  RR_TRUNCATE, "ft
188a0 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d  runcate", pFile-
188b0 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65  >zPath);.  }else
188c0 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
188d0 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
188e0 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
188f0 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
18900 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
18910 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  posed to.    ** 
18920 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
18930 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
18940 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
18950 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
18960 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  a.    ** normal 
18970 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61  database file) a
18980 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74  nd we truncate t
18990 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
189a0 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74  length,.    ** t
189b0 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20  hat effectively 
189c0 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
189d0 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69  ge counter.  Thi
189e0 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20  s might happen. 
189f0 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f     ** when resto
18a00 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ring a database 
18a10 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70  using the backup
18a20 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f   API from a zero
18a30 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73  -length.    ** s
18a40 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ource..    */.  
18a50 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
18a60 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42  ormalWrite && nB
18a70 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
18a80 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
18a90 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Chng = 1;.    }.
18aa0 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75  #endif..    retu
18ab0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18ac0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  }.}../*.** Deter
18ad0 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74  mine the current
18ae0 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20   size of a file 
18af0 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74  in bytes.*/.stat
18b00 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53  ic int unixFileS
18b10 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
18b20 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65   *id, i64 *pSize
18b30 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
18b40 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
18b50 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
18b60 20 20 72 63 20 3d 20 66 73 74 61 74 28 28 28 75    rc = fstat(((u
18b70 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
18b80 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61   &buf);.  Simula
18b90 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
18ba0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
18bb0 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
18bc0 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
18bd0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65   = errno;.    re
18be0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
18bf0 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a  R_FSTAT;.  }.  *
18c00 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73  pSize = buf.st_s
18c10 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  ize;..  /* When 
18c20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73  opening a zero-s
18c30 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ize database, th
18c40 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  e findInodeInfo(
18c50 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a  ) procedure.  **
18c60 20 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c 65   writes a single
18c70 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74 20   byte into that 
18c80 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  file in order to
18c90 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62   work around a b
18ca0 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f  ug.  ** in the O
18cb0 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79  S-X msdos filesy
18cc0 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20  stem.  In order 
18cd0 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  to avoid problem
18ce0 73 20 77 69 74 68 20 75 70 70 65 72 0a 20 20 2a  s with upper.  *
18cf0 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65  * layers, we nee
18d00 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73  d to report this
18d10 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65   file size as ze
18d20 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  ro even though i
18d30 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79  t is.  ** really
18d40 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32   1.   Ticket #32
18d50 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a  60..  */.  if( *
18d60 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a  pSize==1 ) *pSiz
18d70 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72  e = 0;...  retur
18d80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18d90 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
18da0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
18db0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
18dc0 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64  LE__)./*.** Hand
18dd0 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f  ler for proxy-lo
18de0 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72  cking file-contr
18df0 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69 6e  ol verbs.  Defin
18e00 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a  ed below in the.
18e10 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b  ** proxying lock
18e20 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f  ing division..*/
18e30 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
18e40 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  yFileControl(sql
18e50 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76  ite3_file*,int,v
18e60 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  oid*);.#endif../
18e70 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  * .** This funct
18e80 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
18e90 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51 4c 49   handle the SQLI
18ea0 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
18eb0 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74  NT .** file-cont
18ec0 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  rol operation..*
18ed0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72  *.** If the user
18ee0 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   has configured 
18ef0 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72  a chunk-size for
18f00 20 74 68 69 73 20 66 69 6c 65 2c 20 69 74 20 63   this file, it c
18f10 6f 75 6c 64 20 62 65 0a 2a 2a 20 74 68 61 74 20  ould be.** that 
18f20 74 68 65 20 66 69 6c 65 20 6e 65 65 64 73 20 74  the file needs t
18f30 6f 20 62 65 20 65 78 74 65 6e 64 65 64 20 61 74  o be extended at
18f40 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 4f 74 68   this point. Oth
18f50 65 72 77 69 73 65 2c 20 74 68 65 0a 2a 2a 20 53  erwise, the.** S
18f60 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
18f70 5f 48 49 4e 54 20 6f 70 65 72 61 74 69 6f 6e 20  _HINT operation 
18f80 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 55  is a no-op for U
18f90 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nix..*/.static i
18fa0 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74  nt fcntlSizeHint
18fb0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
18fc0 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
18fd0 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
18fe0 6e 6b 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53  nk ){.    i64 nS
18ff0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
19000 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
19010 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
19020 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
19030 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
19040 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f     /* Used to ho
19050 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ld return values
19060 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20   of fstat() */. 
19070 20 20 0a 20 20 20 20 69 66 28 20 66 73 74 61 74    .    if( fstat
19080 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  (pFile->h, &buf)
19090 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
190a0 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20  _IOERR_FSTAT;.. 
190b0 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79     nSize = ((nBy
190c0 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  te+pFile->szChun
190d0 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a  k-1) / pFile->sz
190e0 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
190f0 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28  szChunk;.    if(
19100 20 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e   nSize>(i64)buf.
19110 73 74 5f 73 69 7a 65 20 29 7b 0a 23 69 66 20 64  st_size ){.#if d
19120 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
19130 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
19140 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
19150 43 41 54 45 0a 20 20 20 20 20 20 69 66 28 20 70  CATE.      if( p
19160 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 70  osix_fallocate(p
19170 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f  File->h, buf.st_
19180 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e  size, nSize-buf.
19190 73 74 5f 73 69 7a 65 29 20 29 7b 0a 20 20 20 20  st_size) ){.    
191a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
191b0 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
191c0 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
191d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53 20     /* If the OS 
191e0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70 6f  does not have po
191f0 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c  six_fallocate(),
19200 20 66 61 6b 65 20 69 74 2e 20 46 69 72 73 74 20   fake it. First 
19210 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 74 72  use.      ** ftr
19220 75 6e 63 61 74 65 28 29 20 74 6f 20 73 65 74 20  uncate() to set 
19230 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 74  the file size, t
19240 68 65 6e 20 77 72 69 74 65 20 61 20 73 69 6e 67  hen write a sing
19250 6c 65 20 62 79 74 65 20 74 6f 0a 20 20 20 20 20  le byte to.     
19260 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 62 79 74   ** the last byt
19270 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20  e in each block 
19280 77 69 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e  within the exten
19290 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 69 73  ded region. This
192a0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65  .      ** is the
192b0 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75 65 20   same technique 
192c0 75 73 65 64 20 62 79 20 67 6c 69 62 63 20 74 6f  used by glibc to
192d0 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73 69 78   implement posix
192e0 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20 20 20  _fallocate().   
192f0 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65 6d 73     ** on systems
19300 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76   that do not hav
19310 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61  e a real falloca
19320 74 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  te() system call
19330 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
19340 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e   int nBlk = buf.
19350 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20  st_blksize;  /* 
19360 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63  File-system bloc
19370 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  k size */.      
19380 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20 20  i64 iWrite;     
19390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
193a0 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72  ext offset to wr
193b0 69 74 65 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  ite to */.      
193c0 69 6e 74 20 6e 57 72 69 74 65 3b 20 20 20 20 20  int nWrite;     
193d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
193e0 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
193f0 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 29 20   seekAndWrite() 
19400 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 66 74  */..      if( ft
19410 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  runcate(pFile->h
19420 2c 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  , nSize) ){.    
19430 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
19440 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
19450 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
19460 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
19470 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
19480 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46   "ftruncate", pF
19490 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
194a0 20 20 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74     }.      iWrit
194b0 65 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a  e = ((buf.st_siz
194c0 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f  e + 2*nBlk - 1)/
194d0 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20  nBlk)*nBlk-1;.  
194e0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
194f0 20 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e   nWrite = seekAn
19500 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57  dWrite(pFile, iW
19510 72 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20  rite, "", 1);.  
19520 20 20 20 20 20 20 69 57 72 69 74 65 20 2b 3d 20        iWrite += 
19530 6e 42 6c 6b 3b 0a 20 20 20 20 20 20 7d 20 77 68  nBlk;.      } wh
19540 69 6c 65 28 20 6e 57 72 69 74 65 3d 3d 31 20 26  ile( nWrite==1 &
19550 26 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 20 29  & iWrite<nSize )
19560 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72 69  ;.      if( nWri
19570 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  te!=1 ) return S
19580 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
19590 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  E;.#endif.    }.
195a0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
195b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
195c0 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e  * Information an
195d0 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20  d control of an 
195e0 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65  open file handle
195f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19600 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  unixFileControl(
19610 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
19620 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
19630 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28  pArg){.  switch(
19640 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
19650 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
19660 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
19670 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28  *(int*)pArg = ((
19680 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 65  unixFile*)id)->e
19690 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  FileLock;.      
196a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
196b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
196c0 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52   SQLITE_LAST_ERR
196d0 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  NO: {.      *(in
196e0 74 2a 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78  t*)pArg = ((unix
196f0 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
19700 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
19710 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19720 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
19730 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f  ITE_FCNTL_CHUNK_
19740 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 28 28  SIZE: {.      ((
19750 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 73  unixFile*)id)->s
19760 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a  zChunk = *(int *
19770 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74  )pArg;.      ret
19780 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
19790 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
197a0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
197b0 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 72 65  HINT: {.      re
197c0 74 75 72 6e 20 66 63 6e 74 6c 53 69 7a 65 48 69  turn fcntlSizeHi
197d0 6e 74 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69  nt((unixFile *)i
197e0 64 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29  d, *(i64 *)pArg)
197f0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
19800 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  NDEBUG.    /* Th
19810 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68  e pager calls th
19820 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67  is method to sig
19830 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61 73 20  nal that it has 
19840 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f  done.    ** a ro
19850 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  llback and that 
19860 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
19870 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e  therefore unchan
19880 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69  ged and.    ** i
19890 74 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b  t hence it is OK
198a0 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63   for the transac
198b0 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e  tion change coun
198c0 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  ter to be.    **
198d0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20   unchanged..    
198e0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
198f0 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
19900 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28  ANGED: {.      (
19910 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
19920 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  dbUpdate = 0;.  
19930 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19940 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  E_OK;.    }.#end
19950 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
19960 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
19970 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
19980 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73  APPLE__).    cas
19990 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  e SQLITE_SET_LOC
199a0 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20  KPROXYFILE:.    
199b0 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f  case SQLITE_GET_
199c0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
199d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72  .      return pr
199e0 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69  oxyFileControl(i
199f0 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20  d,op,pArg);.    
19a00 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
19a10 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
19a20 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
19a30 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f  ed(__APPLE__) */
19a40 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19a50 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54  _FCNTL_SYNC_OMIT
19a60 54 45 44 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  TED: {.      ret
19a70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
19a80 2f 2a 20 41 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20  /* A no-op */.  
19a90 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19aa0 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
19ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19ac0 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  n the sector siz
19ad0 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68  e in bytes of th
19ae0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f  e underlying blo
19af0 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a  ck device for.**
19b00 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
19b10 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d  ile. This is alm
19b20 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62  ost always 512 b
19b30 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65  ytes, but may be
19b40 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73  .** larger for s
19b50 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a  ome devices..**.
19b60 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61  ** SQLite code a
19b70 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63  ssumes this func
19b80 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tion cannot fail
19b90 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65  . It also assume
19ba0 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f  s that.** if two
19bb0 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
19bc0 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66  ed in the same f
19bd0 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63  ile-system direc
19be0 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20  tory (i.e..** a 
19bf0 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73  database and its
19c00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74   journal file) t
19c10 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73  hat the sector s
19c20 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a  ize will be the.
19c30 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68  ** same for both
19c40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19c50 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73  unixSectorSize(s
19c60 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
19c70 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
19c80 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
19c90 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d);.  return SQL
19ca0 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
19cb0 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  OR_SIZE;.}../*.*
19cc0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
19cd0 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
19ce0 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ics for the file
19cf0 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73  . This is always
19d00 20 30 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a   0 for unix..*/.
19d10 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
19d20 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
19d30 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  tics(sqlite3_fil
19d40 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  e *NotUsed){.  U
19d50 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
19d60 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
19d70 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn 0;.}..#ifndef
19d80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
19d90 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  .../*.** Object 
19da0 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
19db0 74 20 61 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  t an shared memo
19dc0 72 79 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a  ry buffer.  .**.
19dd0 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65  ** When multiple
19de0 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66   threads all ref
19df0 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20  erence the same 
19e00 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68 20  wal-index, each 
19e10 74 68 72 65 61 64 0a 2a 2a 20 68 61 73 20 69 74  thread.** has it
19e20 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62  s own unixShm ob
19e30 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61  ject, but they a
19e40 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  ll point to a si
19e50 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a  ngle instance.**
19e60 20 6f 66 20 74 68 69 73 20 75 6e 69 78 53 68 6d   of this unixShm
19e70 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e  Node object.  In
19e80 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61   other words, ea
19e90 63 68 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20  ch wal-index is 
19ea0 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f  opened.** only o
19eb0 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e  nce per process.
19ec0 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78  .**.** Each unix
19ed0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
19ee0 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61  s connected to a
19ef0 20 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64   single unixInod
19f00 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a  eInfo object..**
19f10 20 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73   We could coales
19f20 63 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  ce this object i
19f30 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nto unixInodeInf
19f40 6f 2c 20 62 75 74 20 74 68 61 74 20 77 6f 75 6c  o, but that woul
19f50 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20  d mean.** every 
19f60 6f 70 65 6e 20 66 69 6c 65 20 74 68 61 74 20 64  open file that d
19f70 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 68 61 72  oes not use shar
19f80 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74  ed memory (in ot
19f90 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a  her words, most.
19fa0 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29 20 77  ** open files) w
19fb0 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 63 61 72  ould have to car
19fc0 72 79 20 61 72 6f 75 6e 64 20 74 68 69 73 20 65  ry around this e
19fd0 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
19fe0 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69  .  So.** the uni
19ff0 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
1a000 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
1a010 6e 74 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69  nter to this uni
1a020 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a  xShmNode object.
1a030 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53  ** and the unixS
1a040 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
1a050 20 63 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68   created only wh
1a060 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  en needed..**.**
1a070 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
1a080 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68   must be true wh
1a090 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64  en creating or d
1a0a0 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69  estroying.** thi
1a0b0 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c  s object or whil
1a0c0 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
1a0d0 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ting the followi
1a0e0 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ng fields:.**.**
1a0f0 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a        nRef.**.**
1a100 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
1a110 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f  ields are read-o
1a120 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62  nly after the ob
1a130 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a  ject is created:
1a140 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64  .** .**      fid
1a150 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  .**      zFilena
1a160 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20  me.**.** Either 
1a170 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65  unixShmNode.mute
1a180 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  x must be held o
1a190 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52  r unixShmNode.nR
1a1a0 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69  ef==0 and.** uni
1a1b0 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  xMutexHeld() is 
1a1c0 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e  true when readin
1a1d0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79  g or writing any
1a1e0 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20   other field.** 
1a1f0 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
1a200 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  e..*/.struct uni
1a210 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69  xShmNode {.  uni
1a220 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
1a230 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49  de;     /* unixI
1a240 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77  nodeInfo that ow
1a250 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65  ns this SHM node
1a260 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1a270 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20  tex *mutex;     
1a280 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63   /* Mutex to acc
1a290 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ess this object 
1a2a0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
1a2b0 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
1a2c0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d  /* Name of the m
1a2d0 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
1a2e0 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20   int h;         
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1a300 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
1a310 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52  tor */.  int szR
1a320 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
1a330 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
1a340 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1a350 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ions */.  int nR
1a360 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
1a370 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1a380 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a  array apRegion *
1a390 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67  /.  char **apReg
1a3a0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ion;           /
1a3b0 2a 20 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65  * Array of mappe
1a3c0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
1a3d0 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
1a3e0 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
1a3f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a400 72 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a  r of unixShm obj
1a410 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
1a420 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53   this */.  unixS
1a430 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  hm *pFirst;     
1a440 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69        /* All uni
1a450 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  xShm objects poi
1a460 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
1a470 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1a480 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61  EBUG.  u8 exclMa
1a490 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1a4a0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
1a4b0 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
1a4c0 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64  d */.  u8 shared
1a4d0 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
1a4e0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
1a4f0 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
1a500 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64  /.  u8 nextShmId
1a510 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1a520 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  * Next available
1a530 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75   unixShm.id valu
1a540 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
1a550 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20  /*.** Structure 
1a560 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  used internally 
1a570 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72  by this VFS to r
1a580 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20  ecord the state 
1a590 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68  of an.** open sh
1a5a0 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e  ared memory conn
1a5b0 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ection..**.** Th
1a5c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
1a5d0 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ds are initializ
1a5e0 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a  ed when this obj
1a5f0 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61  ect is created a
1a600 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f  nd.** are read-o
1a610 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a  nly thereafter:.
1a620 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d  **.**    unixShm
1a630 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69  .pFile.**    uni
1a640 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c  xShm.id.**.** Al
1a650 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  l other fields a
1a660 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  re read/write.  
1a670 54 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c  The unixShm.pFil
1a680 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  e->mutex must be
1a690 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61   held.** while a
1a6a0 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61  ccessing any rea
1a6b0 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a  d/write fields..
1a6c0 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68  */.struct unixSh
1a6d0 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  m {.  unixShmNod
1a6e0 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
1a6f0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1a700 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  ng unixShmNode o
1a710 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53  bject */.  unixS
1a720 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  hm *pNext;      
1a730 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
1a740 69 78 53 68 6d 20 77 69 74 68 20 74 68 65 20 73  ixShm with the s
1a750 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ame unixShmNode 
1a760 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78  */.  u8 hasMutex
1a770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a780 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69  /* True if holdi
1a790 6e 67 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  ng the unixShmNo
1a7a0 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31  de mutex */.  u1
1a7b0 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  6 sharedMask;   
1a7c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1a7d0 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73   of shared locks
1a7e0 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65   held */.  u16 e
1a7f0 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
1a800 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1a810 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
1a820 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20   held */.#ifdef 
1a830 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
1a840 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  8 id;           
1a850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20            /* Id 
1a860 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
1a870 6f 6e 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e  on within its un
1a880 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e  ixShmNode */.#en
1a890 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f  dif.};../*.** Co
1a8a0 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72  nstants used for
1a8b0 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66   locking.*/.#def
1a8c0 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53  ine UNIX_SHM_BAS
1a8d0 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f  E   ((22+SQLITE_
1a8e0 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20  SHM_NLOCK)*4)   
1a8f0 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c        /* first l
1a900 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66  ock byte */.#def
1a910 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  ine UNIX_SHM_DMS
1a920 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41      (UNIX_SHM_BA
1a930 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  SE+SQLITE_SHM_NL
1a940 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e  OCK)  /* deadman
1a950 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a   switch */../*.*
1a960 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64  * Apply posix ad
1a970 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72  visory locks for
1a980 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20   all bytes from 
1a990 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73  ofst through ofs
1a9a0 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63  t+n-1..**.** Loc
1a9b0 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20  ks block if the 
1a9c0 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20  mask is exactly 
1a9d0 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61  UNIX_SHM_C and a
1a9e0 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a  re non-blocking.
1a9f0 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ** otherwise..*/
1aa00 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1aa10 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20  ShmSystemLock(. 
1aa20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
1aa30 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79  hmNode, /* Apply
1aa40 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f   locks to this o
1aa50 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  pen shared-memor
1aa60 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69  y segment */.  i
1aa70 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20  nt lockType,    
1aa80 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b        /* F_UNLCK
1aa90 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f  , F_RDLCK, or F_
1aaa0 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f  WRLCK */.  int o
1aab0 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  fst,            
1aac0 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
1aad0 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  of the locking r
1aae0 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20  ange */.  int n 
1aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1ab10 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29  tes to lock */.)
1ab20 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  {.  struct flock
1ab30 20 66 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65   f;       /* The
1ab40 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
1ab50 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
1ab60 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
1ab70 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
1ab80 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d  Result code form
1ab90 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f   fcntl() */..  /
1aba0 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20  * Access to the 
1abb0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1abc0 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64  ct is serialized
1abd0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a   by the caller *
1abe0 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
1abf0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1ac00 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20  ShmNode->mutex) 
1ac10 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
1ac20 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68  f==0 );..  /* Sh
1ac30 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72  ared locks never
1ac40 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20   span more than 
1ac50 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73  one byte */.  as
1ac60 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f  sert( n==1 || lo
1ac70 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20  ckType!=F_RDLCK 
1ac80 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61  );..  /* Locks a
1ac90 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20  re within range 
1aca0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  */.  assert( n>=
1acb0 31 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48  1 && n<SQLITE_SH
1acc0 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  M_NLOCK );..  /*
1acd0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1ace0 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65  locking paramete
1acf0 72 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  rs */.  memset(&
1ad00 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29  f, 0, sizeof(f))
1ad10 3b 0a 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c  ;.  f.l_type = l
1ad20 6f 63 6b 54 79 70 65 3b 0a 20 20 66 2e 6c 5f 77  ockType;.  f.l_w
1ad30 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
1ad40 3b 0a 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20  ;.  f.l_start = 
1ad50 6f 66 73 74 3b 0a 20 20 66 2e 6c 5f 6c 65 6e 20  ofst;.  f.l_len 
1ad60 3d 20 6e 3b 0a 0a 20 20 72 63 20 3d 20 66 63 6e  = n;..  rc = fcn
1ad70 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  tl(pShmNode->h, 
1ad80 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20  F_SETLK, &f);.  
1ad90 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20  rc = (rc!=(-1)) 
1ada0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
1adb0 4c 49 54 45 5f 42 55 53 59 3b 0a 0a 20 20 2f 2a  LITE_BUSY;..  /*
1adc0 20 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62   Update the glob
1add0 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e  al lock state an
1ade0 64 20 64 6f 20 64 65 62 75 67 20 74 72 61 63 69  d do debug traci
1adf0 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
1ae00 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31  ITE_DEBUG.  { u1
1ae10 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43  6 mask;.  OSTRAC
1ae20 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29  E(("SHM-LOCK "))
1ae30 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28  ;.  mask = (1<<(
1ae40 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f  ofst+n)) - (1<<o
1ae50 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  fst);.  if( rc==
1ae60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ae70 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
1ae80 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
1ae90 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b  OSTRACE(("unlock
1aea0 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b   %d ok", ofst));
1aeb0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1aec0 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
1aed0 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  sk;.      pShmNo
1aee0 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  de->sharedMask &
1aef0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c  = ~mask;.    }el
1af00 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d  se if( lockType=
1af10 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
1af20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64    OSTRACE(("read
1af30 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66  -lock %d ok", of
1af40 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d  st));.      pShm
1af50 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26  Node->exclMask &
1af60 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
1af70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
1af80 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
1af90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1afa0 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  sert( lockType==
1afb0 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20  F_WRLCK );.     
1afc0 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65   OSTRACE(("write
1afd0 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66  -lock %d ok", of
1afe0 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d  st));.      pShm
1aff0 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c  Node->exclMask |
1b000 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53  = mask;.      pS
1b010 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
1b020 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
1b030 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1b040 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
1b050 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  UNLCK ){.      O
1b060 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20  STRACE(("unlock 
1b070 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74  %d failed", ofst
1b080 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ));.    }else if
1b090 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44  ( lockType==F_RD
1b0a0 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
1b0b0 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b  RACE(("read-lock
1b0c0 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20   failed"));.    
1b0d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1b0e0 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46  ert( lockType==F
1b0f0 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20  _WRLCK );.      
1b100 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d  OSTRACE(("write-
1b110 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c  lock %d failed",
1b120 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20   ofst));.    }. 
1b130 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20   }.  OSTRACE((" 
1b140 2d 20 61 66 74 65 72 77 61 72 64 73 20 25 30 33  - afterwards %03
1b150 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20  x,%03x\n",.     
1b160 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1b170 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d  sharedMask, pShm
1b180 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29  Node->exclMask))
1b190 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1b1a0 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20  return rc;      
1b1b0 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75 72    .}.../*.** Pur
1b1c0 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  ge the unixShmNo
1b1d0 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61  deList list of a
1b1e0 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68 20  ll entries with 
1b1f0 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66  unixShmNode.nRef
1b200 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ==0..**.** This 
1b210 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61  is not a VFS sha
1b220 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
1b230 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69  d; it is a utili
1b240 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ty function call
1b250 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61  ed.** by VFS sha
1b260 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
1b270 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
1b280 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28  id unixShmPurge(
1b290 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a  unixFile *pFd){.
1b2a0 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
1b2b0 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   = pFd->pInode->
1b2c0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65  pShmNode;.  asse
1b2d0 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
1b2e0 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20 26  d() );.  if( p &
1b2f0 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  & p->nRef==0 ){.
1b300 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61      int i;.    a
1b310 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65  ssert( p->pInode
1b320 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  ==pFd->pInode );
1b330 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65  .    if( p->mute
1b340 78 20 29 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x ) sqlite3_mute
1b350 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29  x_free(p->mutex)
1b360 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1b370 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b  <p->nRegion; i++
1b380 29 7b 0a 20 20 20 20 20 20 6d 75 6e 6d 61 70 28  ){.      munmap(
1b390 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20  p->apRegion[i], 
1b3a0 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  p->szRegion);.  
1b3b0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
1b3c0 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e  free(p->apRegion
1b3d0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e  );.    if( p->h>
1b3e0 3d 30 20 29 20 63 6c 6f 73 65 28 70 2d 3e 68 29  =0 ) close(p->h)
1b3f0 3b 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d  ;.    p->pInode-
1b400 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20  >pShmNode = 0;. 
1b410 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1b420 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
1b430 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d   Open a shared-m
1b440 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63  emory area assoc
1b450 69 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20  iated with open 
1b460 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44  database file pD
1b470 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70  bFd.  .** This p
1b480 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d  articular implem
1b490 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d  entation uses mm
1b4a0 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a  apped files..**.
1b4b0 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65 64  ** The file used
1b4c0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68   to implement sh
1b4d0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69  ared-memory is i
1b4e0 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
1b4f0 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f  tory.** as the o
1b500 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
1b510 65 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61  e and has the sa
1b520 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f  me name as the o
1b530 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  pen database.** 
1b540 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d  file with the "-
1b550 73 68 6d 22 20 73 75 66 66 69 78 20 61 64 64 65  shm" suffix adde
1b560 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  d.  For example,
1b570 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1b580 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f   file.** is "/ho
1b590 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e  me/user1/config.
1b5a0 64 62 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c  db" then the fil
1b5b0 65 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  e that is create
1b5c0 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a  d and mmapped.**
1b5d0 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f   for shared memo
1b5e0 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ry will be calle
1b5f0 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63  d "/home/user1/c
1b600 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20  onfig.db-shm".  
1b610 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61  .**.** Another a
1b620 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f  pproach to is to
1b630 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64   use files in /d
1b640 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74  ev/shm or /dev/t
1b650 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65  mp or an.** some
1b660 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75   other tmpfs mou
1b670 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c  nt. But if a fil
1b680 65 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  e in a different
1b690 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72   directory.** fr
1b6a0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1b6b0 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68  file is used, th
1b6c0 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63 63  en differing acc
1b6d0 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a  ess permissions.
1b6e0 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29  ** or a chroot()
1b6f0 20 6d 69 67 68 74 20 63 61 75 73 65 20 74 77 6f   might cause two
1b700 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65   different proce
1b710 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  sses on the same
1b720 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20  .** database to 
1b730 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64 69 66  end up using dif
1b740 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72  ferent files for
1b750 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d   shared memory -
1b760 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61   .** meaning tha
1b770 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77  t their memory w
1b780 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20  ould not really 
1b790 62 65 20 73 68 61 72 65 64 20 2d 20 72 65 73 75  be shared - resu
1b7a0 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61  lting.** in data
1b7b0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1b7c0 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
1b7d0 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20  this tmpfs file 
1b7e0 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20  usage.** can be 
1b7f0 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
1b800 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44  le-time using -D
1b810 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
1b820 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a  TORY="/dev/shm".
1b830 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69 76 61  ** or the equiva
1b840 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f  lent.  The use o
1b850 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d  f the SQLITE_SHM
1b860 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69  _DIRECTORY compi
1b870 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f  le-time.** optio
1b880 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20  n results in an 
1b890 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69  incompatible bui
1b8a0 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62  ld of SQLite;  b
1b8b0 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a  uilds of SQLite.
1b8c0 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64 69 66  ** that with dif
1b8d0 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48  fering SQLITE_SH
1b8e0 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65 74 74  M_DIRECTORY sett
1b8f0 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20  ings attempt to 
1b900 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  use the.** same 
1b910 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
1b920 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20   the same time, 
1b930 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1b940 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  ion will likely.
1b950 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53  ** result. The S
1b960 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
1b970 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ORY compile-time
1b980 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69   option is consi
1b990 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70  dered.** "unsupp
1b9a0 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67  orted" and may g
1b9b0 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75 74 75  o away in a futu
1b9c0 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73  re SQLite releas
1b9d0 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  e..**.** When op
1b9e0 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
1b9f0 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
1ba00 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
1ba10 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
1ba20 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
1ba30 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
1ba40 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
1ba50 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
1ba60 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
1ba70 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
1ba80 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
1ba90 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
1baa0 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
1bab0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1bac0 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  xOpenSharedMemor
1bad0 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46  y(unixFile *pDbF
1bae0 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  d){.  struct uni
1baf0 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20  xShm *p = 0;    
1bb00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
1bb10 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70  nection to be op
1bb20 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ened */.  struct
1bb30 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
1bb40 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65  hmNode;   /* The
1bb50 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70   underlying mmap
1bb60 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ped file */.  in
1bb70 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bb90 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
1bba0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
1bbb0 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20  *pInode;        
1bbc0 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f    /* The inode o
1bbd0 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  f fd */.  char *
1bbe0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20  zShmFilename;   
1bbf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1bc00 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73  e of the file us
1bc10 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20  ed for SHM */.  
1bc20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  int nShmFilename
1bc30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bc40 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53  /* Size of the S
1bc50 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62  HM filename in b
1bc60 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  ytes */..  /* Al
1bc70 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
1bc80 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d   the new unixShm
1bc90 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20   object. */.  p 
1bca0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1bcb0 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
1bcc0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1bcd0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1bce0 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
1bcf0 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
1bd00 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70  assert( pDbFd->p
1bd10 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Shm==0 );..  /* 
1bd20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1bd30 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  a unixShmNode ob
1bd40 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65 78 69  ject already exi
1bd50 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78  sts. Reuse an ex
1bd60 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20  isting.  ** one 
1bd70 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61  if present. Crea
1bd80 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
1bd90 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
1bda0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
1bdb0 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
1bdc0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  DbFd->pInode;.  
1bdd0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64  pShmNode = pInod
1bde0 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e->pShmNode;.  i
1bdf0 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  f( pShmNode==0 )
1be00 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
1be10 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
1be20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61           /* fsta
1be30 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74  t() info for dat
1be40 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
1be50 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74     /* Call fstat
1be60 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  () to figure out
1be70 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
1be80 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1be90 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a   file. If.    **
1bea0 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c   a new *-shm fil
1beb0 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e  e is created, an
1bec0 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65   attempt will be
1bed0 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65 20   made to create 
1bee0 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  it.    ** with t
1bef0 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69  he same permissi
1bf00 6f 6e 73 2e 20 54 68 65 20 61 63 74 75 61 6c 20  ons. The actual 
1bf10 70 65 72 6d 69 73 73 69 6f 6e 73 20 74 68 65 20  permissions the 
1bf20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
1bf30 20 20 20 20 2a 2a 20 77 69 74 68 20 61 72 65 20      ** with are 
1bf40 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 63  subject to the c
1bf50 75 72 72 65 6e 74 20 75 6d 61 73 6b 20 73 65 74  urrent umask set
1bf60 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ting..    */.   
1bf70 20 69 66 28 20 66 73 74 61 74 28 70 44 62 46 64   if( fstat(pDbFd
1bf80 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  ->h, &sStat) ){.
1bf90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1bfa0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1bfb0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
1bfc0 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23  en_err;.    }..#
1bfd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  ifdef SQLITE_SHM
1bfe0 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e  _DIRECTORY.    n
1bff0 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69  ShmFilename = si
1c000 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f  zeof(SQLITE_SHM_
1c010 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33 30 3b  DIRECTORY) + 30;
1c020 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46  .#else.    nShmF
1c030 69 6c 65 6e 61 6d 65 20 3d 20 35 20 2b 20 28 69  ilename = 5 + (i
1c040 6e 74 29 73 74 72 6c 65 6e 28 70 44 62 46 64 2d  nt)strlen(pDbFd-
1c050 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a  >zPath);.#endif.
1c060 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73      pShmNode = s
1c070 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
1c080 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
1c090 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20   + nShmFilename 
1c0a0 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
1c0b0 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
1c0c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1c0d0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
1c0e0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1c0f0 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68  }.    memset(pSh
1c100 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66  mNode, 0, sizeof
1c110 28 2a 70 53 68 6d 4e 6f 64 65 29 29 3b 0a 20 20  (*pShmNode));.  
1c120 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d    zShmFilename =
1c130 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
1c140 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
1c150 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64  ShmNode[1];.#ifd
1c160 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ef SQLITE_SHM_DI
1c170 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69  RECTORY.    sqli
1c180 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68  te3_snprintf(nSh
1c190 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46  mFilename, zShmF
1c1a0 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ilename, .      
1c1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1c1c0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
1c1d0 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d  ORY "/sqlite-shm
1c1e0 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20  -%x-%x",.       
1c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
1c200 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c  32)sStat.st_ino,
1c210 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64   (u32)sStat.st_d
1c220 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73  ev);.#else.    s
1c230 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1c240 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53  nShmFilename, zS
1c250 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d  hmFilename, "%s-
1c260 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  shm", pDbFd->zPa
1c270 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  th);.#endif.    
1c280 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31  pShmNode->h = -1
1c290 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49 6e  ;.    pDbFd->pIn
1c2a0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20  ode->pShmNode = 
1c2b0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53  pShmNode;.    pS
1c2c0 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d  hmNode->pInode =
1c2d0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a   pDbFd->pInode;.
1c2e0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75      pShmNode->mu
1c2f0 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
1c300 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
1c310 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
1c320 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1c330 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
1c340 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1c350 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
1c360 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1c370 20 20 7d 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64    }..    pShmNod
1c380 65 2d 3e 68 20 3d 20 6f 70 65 6e 28 7a 53 68 6d  e->h = open(zShm
1c390 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 57 52  Filename, O_RDWR
1c3a0 7c 4f 5f 43 52 45 41 54 2c 20 28 73 53 74 61 74  |O_CREAT, (sStat
1c3b0 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 29  .st_mode & 0777)
1c3c0 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
1c3d0 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20  ode->h<0 ){.    
1c3e0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
1c3f0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
1c400 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
1c410 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
1c420 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
1c430 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
1c440 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
1c450 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
1c460 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
1c470 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
1c480 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49  switch..    ** I
1c490 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
1c4a0 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
1c4b0 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f   length. .    */
1c4c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1c4d0 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  _OK;.    if( uni
1c4e0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
1c4f0 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b  ShmNode, F_WRLCK
1c500 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20  , UNIX_SHM_DMS, 
1c510 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  1)==SQLITE_OK ){
1c520 0a 20 20 20 20 20 20 69 66 28 20 66 74 72 75 6e  .      if( ftrun
1c530 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cate(pShmNode->h
1c540 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
1c550 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
1c560 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
1c570 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63 61  HMOPEN, "ftrunca
1c580 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  te", zShmFilenam
1c590 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1c5a0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1c5b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c5c0 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
1c5d0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1c5e0 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f  , F_RDLCK, UNIX_
1c5f0 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20  SHM_DMS, 1);.   
1c600 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
1c610 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
1c620 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  r;.  }..  /* Mak
1c630 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
1c640 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
1c650 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
1c660 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  */.  p->pShmNode
1c670 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66   = pShmNode;.#if
1c680 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1c690 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
1c6a0 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
1c6b0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
1c6c0 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
1c6d0 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
1c6e0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1c6f0 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
1c700 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
1c710 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
1c720 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
1c730 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
1c740 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
1c750 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
1c760 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
1c770 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
1c780 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
1c790 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a  uct unixShm) obj
1c7a0 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
1c7b0 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
1c7c0 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
1c7d0 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
1c7e0 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
1c7f0 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
1c800 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
1c810 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
1c820 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
1c830 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
1c840 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
1c850 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
1c860 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  tex .  ** mutex.
1c870 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
1c880 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1c890 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1c8a0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
1c8b0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
1c8c0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
1c8d0 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
1c8e0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1c8f0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
1c900 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c910 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
1c920 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
1c930 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
1c940 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
1c950 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54  bFd);       /* T
1c960 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
1c970 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
1c980 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
1c990 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78  _free(p);.  unix
1c9a0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
1c9b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c9c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1c9d0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
1c9e0 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
1c9f0 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
1ca00 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61  n of the .** sha
1ca10 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
1ca20 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
1ca30 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
1ca40 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
1ca50 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e  egions .** are n
1ca60 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
1ca70 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
1ca80 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
1ca90 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
1caa0 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  n .** bytes in s
1cab0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
1cac0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
1cad0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1cae0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
1caf0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
1cb00 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1cb10 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64  , if the bExtend
1cb20 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
1cb30 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
1cb40 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
1cb50 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
1cb60 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
1cb70 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
1cb80 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
1cb90 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
1cba0 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
1cbb0 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
1cbc0 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
1cbd0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1cbe0 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64  . If .** bExtend
1cbf0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
1cc00 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
1cc10 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1cc20 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
1cc30 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
1cc40 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
1cc50 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
1cc60 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
1cc70 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
1cc80 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
1cc90 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
1cca0 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
1ccb0 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
1ccc0 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
1ccd0 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
1cce0 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
1ccf0 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a  is processes .**
1cd00 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
1cd10 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
1cd20 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
1cd30 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
1cd40 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d  e mapped .** mem
1cd50 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
1cd60 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
1cd70 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
1cd80 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
1cd90 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
1cda0 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
1cdb0 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
1cdc0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
1cdd0 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
1cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cdf0 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
1ce00 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
1ce10 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
1ce20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1ce30 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
1ce40 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20  int bExtend,    
1ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce60 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
1ce70 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
1ce80 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
1ce90 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
1cea0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1ceb0 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
1cec0 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
1ced0 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
1cee0 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68  le*)fd;.  unixSh
1cef0 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e  m *p;.  unixShmN
1cf00 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
1cf10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1cf20 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  _OK;..  /* If th
1cf30 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
1cf40 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
1cf50 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
1cf60 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  en it now. */.  
1cf70 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  if( pDbFd->pShm=
1cf80 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75  =0 ){.    rc = u
1cf90 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
1cfa0 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
1cfb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1cfc0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1cfd0 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d   }..  p = pDbFd-
1cfe0 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64  >pShm;.  pShmNod
1cff0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
1d000 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1d010 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
1d020 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
1d030 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68  t( szRegion==pSh
1d040 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
1d050 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
1d060 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  gion==0 );..  if
1d070 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
1d080 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
1d090 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77      char **apNew
1d0a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d0b0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 70         /* New ap
1d0c0 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a  Region[] array *
1d0d0 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  /.    int nByte 
1d0e0 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a  = (iRegion+1)*sz
1d0f0 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69  Region;  /* Mini
1d100 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c  mum required fil
1d110 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74  e size */.    st
1d120 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
1d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d140 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74 61   /* Used by fsta
1d150 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d  t() */..    pShm
1d160 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d  Node->szRegion =
1d170 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20   szRegion;..    
1d180 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
1d190 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d   region is not m
1d1a0 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
1d1b0 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
1d1c0 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  s space..    ** 
1d1d0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1d1e0 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  it has been allo
1d1f0 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74  cated (i.e. if t
1d200 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c  he wal-index fil
1d210 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67  e is.    ** larg
1d220 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74  e enough to cont
1d230 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  ain the requeste
1d240 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a  d region)..    *
1d250 2f 0a 20 20 20 20 69 66 28 20 66 73 74 61 74 28  /.    if( fstat(
1d260 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53  pShmNode->h, &sS
1d270 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  tat) ){.      rc
1d280 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1d290 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 67  SHMSIZE;.      g
1d2a0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
1d2b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1d2c0 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42  sStat.st_size<nB
1d2d0 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  yte ){.      /* 
1d2e0 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
1d2f0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
1d300 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62   not exist. If b
1d310 45 78 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f  Extend is set to
1d320 0a 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c  .      ** false,
1d330 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70   exit early. *pp
1d340 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
1d350 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
1d360 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20  OK returned..   
1d370 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41     **.      ** A
1d380 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66  lternatively, if
1d390 20 62 45 78 74 65 6e 64 20 69 73 20 74 72 75 65   bExtend is true
1d3a0 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28  , use ftruncate(
1d3b0 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  ) to allocate.  
1d3c0 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65      ** the reque
1d3d0 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
1d3e0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1d3f0 20 20 20 69 66 28 20 21 62 45 78 74 65 6e 64 20     if( !bExtend 
1d400 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f  ) goto shmpage_o
1d410 75 74 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74  ut;.      if( ft
1d420 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65  runcate(pShmNode
1d430 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20  ->h, nByte) ){. 
1d440 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
1d450 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1d460 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 22 66  IOERR_SHMSIZE,"f
1d470 74 72 75 6e 63 61 74 65 22 2c 70 53 68 6d 4e 6f  truncate",pShmNo
1d480 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
1d490 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
1d4a0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
1d4b0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1d4c0 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65  Map the requeste
1d4d0 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
1d4e0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
1d4f0 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
1d500 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20  e. */.    apNew 
1d510 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74  = (char **)sqlit
1d520 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20  e3_realloc(.    
1d530 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
1d540 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e  Region, (iRegion
1d550 2b 31 29 2a 73 69 7a 65 6f 66 28 63 68 61 72 20  +1)*sizeof(char 
1d560 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  *).    );.    if
1d570 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
1d580 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1d590 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
1d5a0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1d5b0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68  t;.    }.    pSh
1d5c0 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20  mNode->apRegion 
1d5d0 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69  = apNew;.    whi
1d5e0 6c 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  le(pShmNode->nRe
1d5f0 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a  gion<=iRegion){.
1d600 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d        void *pMem
1d610 20 3d 20 6d 6d 61 70 28 30 2c 20 73 7a 52 65 67   = mmap(0, szReg
1d620 69 6f 6e 2c 20 50 52 4f 54 5f 52 45 41 44 7c 50  ion, PROT_READ|P
1d630 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20  ROT_WRITE, .    
1d640 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44        MAP_SHARED
1d650 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 70  , pShmNode->h, p
1d660 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1d670 2a 73 7a 52 65 67 69 6f 6e 0a 20 20 20 20 20 20  *szRegion.      
1d680 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  );.      if( pMe
1d690 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  m==MAP_FAILED ){
1d6a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1d6b0 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
1d6c0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1d6d0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
1d6e0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
1d6f0 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d  Region[pShmNode-
1d700 3e 6e 52 65 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d  >nRegion] = pMem
1d710 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1d720 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20  ->nRegion++;.   
1d730 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f   }.  }..shmpage_
1d740 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e  out:.  if( pShmN
1d750 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65  ode->nRegion>iRe
1d760 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20  gion ){.    *pp 
1d770 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65  = pShmNode->apRe
1d780 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20  gion[iRegion];. 
1d790 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20   }else{.    *pp 
1d7a0 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
1d7b0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1d7c0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1d7d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d7e0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
1d7f0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72  e lock state for
1d800 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
1d810 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   segment..**.** 
1d820 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72 65  Note that the re
1d830 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65  lationship betwe
1d840 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45 58  en SHAREd and EX
1d850 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73  CLUSIVE locks is
1d860 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66   a little.** dif
1d870 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e  ferent here than
1d880 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78   in posix.  In x
1d890 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63  ShmLock(), one c
1d8a0 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63  an go from unloc
1d8b0 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64  ked.** to shared
1d8c0 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f   and back or fro
1d8d0 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78  m unlocked to ex
1d8e0 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b  clusive and back
1d8f0 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a  .  But one may.*
1d900 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68  * not go from sh
1d910 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  ared to exclusiv
1d920 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73  e or from exclus
1d930 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a  ive to shared..*
1d940 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1d950 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  xShmLock(.  sqli
1d960 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
1d970 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1d980 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
1d990 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
1d9a0 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9c0 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
1d9d0 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
1d9e0 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
1d9f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1da00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1da10 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
1da20 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
1da30 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
1da40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1da50 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
1da60 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
1da70 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
1da80 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
1da90 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  fd;      /* Conn
1daa0 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
1dab0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1dac0 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70    unixShm *p = p
1dad0 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20  DbFd->pShm;     
1dae0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
1daf0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
1db00 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  ng locked */.  u
1db10 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20  nixShm *pX;     
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db30 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
1db40 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
1db50 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53  lings */.  unixS
1db60 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1db70 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20   = p->pShmNode; 
1db80 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1db90 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f  ng file iNode */
1dba0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1dbb0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
1dbc0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1dbd0 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  lt code */.  u16
1dbe0 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc00 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f     /* Mask of lo
1dc10 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72  cks to take or r
1dc20 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  elease */..  ass
1dc30 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70  ert( pShmNode==p
1dc40 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
1dc50 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  hmNode );.  asse
1dc60 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
1dc70 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
1dc80 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
1dc90 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74   ofst>=0 && ofst
1dca0 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  +n<=SQLITE_SHM_N
1dcb0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
1dcc0 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ( n>=1 );.  asse
1dcd0 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49  rt( flags==(SQLI
1dce0 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
1dcf0 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
1dd00 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
1dd10 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
1dd20 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
1dd30 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20  EXCLUSIVE).     
1dd40 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
1dd50 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
1dd60 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
1dd70 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
1dd80 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1dd90 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
1dda0 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20  _SHM_EXCLUSIVE) 
1ddb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  );.  assert( n==
1ddc0 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  1 || (flags & SQ
1ddd0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
1dde0 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73  VE)!=0 );..  mas
1ddf0 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29  k = (1<<(ofst+n)
1de00 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20  ) - (1<<ofst);. 
1de10 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20   assert( n>1 || 
1de20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20  mask==(1<<ofst) 
1de30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
1de40 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
1de50 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  e->mutex);.  if(
1de60 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
1de70 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  SHM_UNLOCK ){.  
1de80 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20    u16 allMask = 
1de90 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f  0; /* Mask of lo
1dea0 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c  cks held by sibl
1deb0 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ings */..    /* 
1dec0 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69  See if any sibli
1ded0 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61  ngs hold this sa
1dee0 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66  me lock */.    f
1def0 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
1df00 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
1df10 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
1df20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e   if( pX==p ) con
1df30 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73  tinue;.      ass
1df40 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61  ert( (pX->exclMa
1df50 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73  sk & (p->exclMas
1df60 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29  k|p->sharedMask)
1df70 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c  )==0 );.      al
1df80 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61  lMask |= pX->sha
1df90 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
1dfa0 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68      /* Unlock th
1dfb0 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
1dfc0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
1dfd0 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29  (mask & allMask)
1dfe0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1dff0 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
1e000 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
1e010 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58  UNLCK, ofst+UNIX
1e020 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
1e030 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e040 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e050 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
1e060 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  do the local loc
1e070 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
1e080 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e090 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
1e0a0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
1e0b0 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26   p->sharedMask &
1e0c0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a  = ~mask;.    } .
1e0d0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
1e0e0 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  s & SQLITE_SHM_S
1e0f0 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36  HARED ){.    u16
1e100 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20   allShared = 0; 
1e110 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63   /* Union of loc
1e120 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65  ks held by conne
1e130 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61  ctions other tha
1e140 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a  n "p" */..    /*
1e150 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20   Find out which 
1e160 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65  shared locks are
1e170 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79   already held by
1e180 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
1e190 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20  ions..    ** If 
1e1a0 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65  any sibling alre
1e1b0 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63  ady holds an exc
1e1c0 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20  lusive lock, go 
1e1d0 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e  ahead and return
1e1e0 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42  .    ** SQLITE_B
1e1f0 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  USY..    */.    
1e200 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
1e210 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
1e220 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
1e230 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
1e240 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
1e250 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1e260 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1e270 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1e280 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72   }.      allShar
1e290 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  ed |= pX->shared
1e2a0 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
1e2b0 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c   /* Get shared l
1e2c0 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
1e2d0 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63  em level, if nec
1e2e0 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66  essary */.    if
1e2f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e300 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c  ){.      if( (al
1e310 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d  lShared & mask)=
1e320 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1e330 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
1e340 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
1e350 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _RDLCK, ofst+UNI
1e360 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
1e370 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e380 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e390 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1e3a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
1e3b0 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20  he local shared 
1e3c0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
1e3d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e3e0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  {.      p->share
1e3f0 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
1e400 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1e410 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e    /* Make sure n
1e420 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  o sibling connec
1e430 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73  tions hold locks
1e440 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b   that will block
1e450 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63   this.    ** loc
1e460 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72  k.  If any do, r
1e470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
1e480 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  Y right away..  
1e490 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
1e4a0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1e4b0 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
1e4c0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
1e4d0 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
1e4e0 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e  ask)!=0 || (pX->
1e4f0 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
1e500 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
1e510 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1e520 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
1e530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e540 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68    .    /* Get th
1e550 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
1e560 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
1e570 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20  level.  Then if 
1e580 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a  successful.    *
1e590 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20  * also mark the 
1e5a0 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
1e5b0 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64   as being locked
1e5c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1e5d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e5e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
1e5f0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
1e600 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b  ShmNode, F_WRLCK
1e610 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
1e620 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
1e630 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e640 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
1e650 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
1e660 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
1e670 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
1e680 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
1e690 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e6a0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1e6b0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1e6c0 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
1e6d0 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
1e6e0 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67  mid-%d, pid-%d g
1e6f0 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ot %03x,%03x\n",
1e700 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  .           p->i
1e710 64 2c 20 67 65 74 70 69 64 28 29 2c 20 70 2d 3e  d, getpid(), p->
1e720 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65  sharedMask, p->e
1e730 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74  xclMask));.  ret
1e740 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1e750 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d   Implement a mem
1e760 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d  ory barrier or m
1e770 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73  emory fence on s
1e780 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a  hared memory.  .
1e790 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20  **.** All loads 
1e7a0 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e  and stores begun
1e7b0 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72   before the barr
1e7c0 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  ier must complet
1e7d0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20  e before.** any 
1e7e0 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65  load or store be
1e7f0 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61  gun after the ba
1e800 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrier..*/.static
1e810 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72   void unixShmBar
1e820 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  rier(.  sqlite3_
1e830 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20  file *fd        
1e840 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1e850 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
1e860 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
1e870 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  ry */.){.  UNUSE
1e880 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
1e890 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
1e8a0 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  x();.  unixLeave
1e8b0 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Mutex();.}../*.*
1e8c0 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63  * Close a connec
1e8d0 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d  tion to shared-m
1e8e0 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74  emory.  Delete t
1e8f0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a  he underlying .*
1e900 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c  * storage if del
1e910 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e  eteFlag is true.
1e920 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
1e930 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d  is no shared mem
1e940 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
1e950 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ith the connecti
1e960 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  on then this.** 
1e970 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
1e980 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mless no-op..*/.
1e990 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
1e9a0 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
1e9b0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
1e9c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e9d0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
1e9e0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1e9f0 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20  int deleteFlag  
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea10 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65 64  /* Delete shared
1ea20 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20  -memory if true 
1ea30 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20  */.){.  unixShm 
1ea40 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1ea50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1ea60 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
1ea70 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78  closed */.  unix
1ea80 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1ea90 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
1eaa0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68  he underlying sh
1eab0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1eac0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a   */.  unixShm **
1ead0 70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pp;             
1eae0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1eaf0 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
1eb00 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
1eb10 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
1eb20 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Fd;             
1eb30 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
1eb40 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
1eb50 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d  le */..  pDbFd =
1eb60 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a   (unixFile*)fd;.
1eb70 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
1eb80 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  m;.  if( p==0 ) 
1eb90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1eba0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
1ebb0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61  ->pShmNode;..  a
1ebc0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d  ssert( pShmNode=
1ebd0 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e  =pDbFd->pInode->
1ebe0 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73  pShmNode );.  as
1ebf0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
1ec00 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
1ec10 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52  Inode );..  /* R
1ec20 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
1ec30 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
1ec40 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
1ec50 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
1ec60 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
1ec70 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1ec80 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1ec90 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
1eca0 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  =&pShmNode->pFir
1ecb0 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
1ecc0 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
1ecd0 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
1ece0 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
1ecf0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1ed00 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
1ed10 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d  ree(p);.  pDbFd-
1ed20 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  >pShm = 0;.  sql
1ed30 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1ed40 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1ed50 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d  );..  /* If pShm
1ed60 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  Node->nRef has r
1ed70 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
1ed80 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
1ed90 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
1eda0 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
1edb0 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
1edc0 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
1edd0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
1ede0 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  >0 );.  pShmNode
1edf0 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
1ee00 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
1ee10 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c  0 ){.    if( del
1ee20 65 74 65 46 6c 61 67 20 29 20 75 6e 6c 69 6e 6b  eteFlag ) unlink
1ee30 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65  (pShmNode->zFile
1ee40 6e 61 6d 65 29 3b 0a 20 20 20 20 75 6e 69 78 53  name);.    unixS
1ee50 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a  hmPurge(pDbFd);.
1ee60 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
1ee70 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
1ee80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ee90 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1eea0 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30  unixShmMap     0
1eeb0 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
1eec0 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66  mLock    0.# def
1eed0 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69  ine unixShmBarri
1eee0 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e  er 0.# define un
1eef0 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23  ixShmUnmap   0.#
1ef00 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
1ef10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1ef20 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20   */../*.** Here 
1ef30 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ends the impleme
1ef40 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73  ntation of all s
1ef50 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
1ef60 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ods..**.********
1ef70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
1ef80 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nd sqlite3_file 
1ef90 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  Methods ********
1efa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1efb0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
1efc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1efd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1efe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1eff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f000 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ******/../*.** T
1f010 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
1f020 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
1f030 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f  s of sqlite3_io_
1f040 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20  methods objects 
1f050 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  that.** implemen
1f060 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c  t various file l
1f070 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
1f080 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74  s.  It also cont
1f090 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
1f0a0 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20  .** of "finder" 
1f0b0 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69  functions.  A fi
1f0c0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73  nder-function is
1f0d0 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20   used to locate 
1f0e0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  the appropriate.
1f0f0 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ** sqlite3_io_me
1f100 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72  thods object for
1f110 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
1f120 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
1f130 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69  e pAppData.** fi
1f140 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74  eld of the sqlit
1f150 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63  e3_vfs VFS objec
1f160 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ts are initializ
1f170 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72  ed to be pointer
1f180 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72  s to.** the corr
1f190 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  ect finder-funct
1f1a0 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53  ion for that VFS
1f1b0 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e  ..**.** Most fin
1f1c0 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  der functions re
1f1d0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1f1e0 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65  o a fixed sqlite
1f1f0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20  3_io_methods.** 
1f200 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c  object.  The onl
1f210 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69  y interesting fi
1f220 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73  nder-function is
1f230 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
1f240 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b  r, which.** look
1f250 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73  s at the filesys
1f260 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69  tem type and tri
1f270 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20  es to guess the 
1f280 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  best locking.** 
1f290 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68  strategy from th
1f2a0 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69  at..**.** For fi
1f2b0 6e 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20  nder-funtion F, 
1f2c0 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20  two objects are 
1f2d0 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  created:.**.**  
1f2e0 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66    (1) The real f
1f2f0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e  inder-function n
1f300 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a  amed "FImpt()"..
1f310 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63  **.**    (2) A c
1f320 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20  onstant pointer 
1f330 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1f340 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e   named just "F".
1f350 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e  .**.**.** A poin
1f360 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69  ter to the F poi
1f370 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20  nter is used as 
1f380 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c  the pAppData val
1f390 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62  ue for VFS.** ob
1f3a0 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20  jects.  We have 
1f3b0 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65  to do this inste
1f3c0 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41  ad of letting pA
1f3d0 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20  ppData point.** 
1f3e0 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20  directly at the 
1f3f0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
1f400 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20  since C90 rules 
1f410 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a  prevent a void*.
1f420 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20  ** from be cast 
1f430 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  into a function 
1f440 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a  pointer..**.**.*
1f450 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20  * Each instance 
1f460 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65  of this macro ge
1f470 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65  nerates two obje
1f480 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  cts:.**.**   *  
1f490 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74  A constant sqlit
1f4a0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
1f4b0 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44  ject call METHOD
1f4c0 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e   that has lockin
1f4d0 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64  g.**      method
1f4e0 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  s CLOSE, LOCK, U
1f4f0 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b  NLOCK, CKRESLOCK
1f500 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20  ..**.**   *  An 
1f510 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65  I/O method finde
1f520 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  r function calle
1f530 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65  d FINDER that re
1f540 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  turns a pointer.
1f550 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d  **      to the M
1f560 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20  ETHOD object in 
1f570 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c  the previous bul
1f580 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  let..*/.#define 
1f590 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52  IOMETHODS(FINDER
1f5a0 2c 20 4d 45 54 48 4f 44 2c 20 56 45 52 53 49 4f  , METHOD, VERSIO
1f5b0 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  N, CLOSE, LOCK, 
1f5c0 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20  UNLOCK, CKLOCK) 
1f5d0 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
1f5e0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
1f5f0 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20  ethods METHOD = 
1f600 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f620 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e      \.   VERSION
1f630 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f640 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
1f650 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1f660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f670 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20     \.   CLOSE,  
1f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f690 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
1f6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6c0 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c    \.   unixRead,
1f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6e0 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20     /* xRead */  
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f710 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c   \.   unixWrite,
1f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f730 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20    /* xWrite */  
1f740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f760 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74  \.   unixTruncat
1f770 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1f780 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
1f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1f7b0 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20  .   unixSync,   
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7d0 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20  /* xSync */     
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1f800 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c     unixFileSize,
1f810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f820 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20  * xFileSize */  
1f830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f840 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1f850 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20    LOCK,         
1f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f870 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20   xLock */       
1f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f890 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1f8a0 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   UNLOCK,        
1f8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f8c0 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  xUnlock */      
1f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8e0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1f8f0 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  CKLOCK,         
1f900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1f910 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1f920 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
1f930 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
1f940 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  nixFileControl, 
1f950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
1f960 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20  ileControl */   
1f970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f980 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
1f990 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  ixSectorSize,   
1f9a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
1f9b0 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20  ctorSize */     
1f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9d0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
1f9e0 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
1f9f0 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76  istics,  /* xDev
1fa00 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20  iceCapabilities 
1fa10 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1fa20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
1fa30 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20  ShmMap,         
1fa40 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
1fa50 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ap */           
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa70 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
1fa80 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
1fa90 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
1faa0 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fac0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
1fad0 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
1fae0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
1faf0 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20  rier */         
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb10 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
1fb20 55 6e 6d 61 70 20 20 20 20 20 20 20 20 20 20 20  Unmap           
1fb30 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61       /* xShmUnma
1fb40 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  p */            
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb60 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20     \.};         
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbb0 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
1fbc0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1fbd0 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70  ods *FINDER##Imp
1fbe0 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  l(const char *z,
1fbf0 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20   unixFile *p){  
1fc00 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41   \.  UNUSED_PARA
1fc10 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44  METER(z); UNUSED
1fc20 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20  _PARAMETER(p);  
1fc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc50 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48  \.  return &METH
1fc60 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OD;             
1fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1fca0 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .}              
1fcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1fcf0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1fd00 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1fd10 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29  *(*const FINDER)
1fd20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
1fd30 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20  xFile *p)    \. 
1fd40 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70     = FINDER##Imp
1fd50 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61  l;../*.** Here a
1fd60 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71  re all of the sq
1fd70 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1fd80 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63   objects for eac
1fd90 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  h of the.** lock
1fda0 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
1fdb0 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   Functions that 
1fdc0 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20  return pointers 
1fdd0 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73  to these methods
1fde0 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65  .** are also cre
1fdf0 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f  ated..*/.IOMETHO
1fe00 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e  DS(.  posixIoFin
1fe10 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
1fe20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
1fe30 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73  on name */.  pos
1fe40 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ixIoMethods,    
1fe50 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
1fe60 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
1fe70 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c  ect name */.  2,
1fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe90 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
1fea0 64 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61 62  d memory is enab
1feb0 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  led */.  unixClo
1fec0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
1fed0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
1fee0 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63  hod */.  unixLoc
1fef0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1ff00 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
1ff10 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f  od */.  unixUnlo
1ff20 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1ff30 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
1ff40 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65  hod */.  unixChe
1ff50 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
1ff60 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
1ff70 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
1ff80 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  */.).IOMETHODS(.
1ff90 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72    nolockIoFinder
1ffa0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ,           /* F
1ffb0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
1ffc0 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49  ame */.  nolockI
1ffd0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
1ffe0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
1fff0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
20000 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
20010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20020 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
20030 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
20040 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73   */.  nolockClos
20050 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
20060 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
20070 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b   */.  nolockLock
20080 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20090 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
200a0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63  */.  nolockUnloc
200b0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
200c0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
200d0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63   */.  nolockChec
200e0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
200f0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
20100 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
20110 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64  ).IOMETHODS(.  d
20120 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  otlockIoFinder, 
20130 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
20140 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
20150 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d   */.  dotlockIoM
20160 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
20170 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
20180 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
20190 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201b0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
201c0 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
201d0 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c  .  dotlockClose,
201e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
201f0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
20200 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20  .  dotlockLock, 
20210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20220 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
20230 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c    dotlockUnlock,
20240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20250 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
20260 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  .  dotlockCheckR
20270 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20  eservedLock  /* 
20280 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
20290 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a  ck method */.)..
202a0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
202b0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
202c0 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49  && !OS_VXWORKS.I
202d0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63  OMETHODS(.  floc
202e0 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
202f0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
20300 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
20310 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  .  flockIoMethod
20320 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
20330 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
20340 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
20350 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
20360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20370 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
20380 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
20390 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  flockClose,     
203a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
203b0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
203c0 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  flockLock,      
203d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
203e0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  ck method */.  f
203f0 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
20400 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
20410 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
20420 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  flockCheckReserv
20430 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68  edLock    /* xCh
20440 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
20450 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
20460 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  if..#if OS_VXWOR
20470 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  KS.IOMETHODS(.  
20480 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  semIoFinder,    
20490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
204a0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
204b0 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68  e */.  semIoMeth
204c0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
204d0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
204e0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
204f0 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
20500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20510 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
20520 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
20530 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20  /.  semClose,   
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20550 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
20560 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20  /.  semLock,    
20570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20580 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
20590 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20  .  semUnlock,   
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
205b0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
205c0 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65 73 65  /.  semCheckRese
205d0 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
205e0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
205f0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
20600 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
20610 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
20620 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
20630 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
20640 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f  METHODS(.  afpIo
20650 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
20660 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
20670 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
20680 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20    afpIoMethods, 
20690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
206a0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
206b0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
206c0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
206d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
206e0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
206f0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61   disabled */.  a
20700 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  fpClose,        
20710 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
20720 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  se method */.  a
20730 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  fpLock,         
20740 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
20750 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  k method */.  af
20760 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  pUnlock,        
20770 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
20780 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  ck method */.  a
20790 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fpCheckReservedL
207a0 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
207b0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
207c0 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
207d0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  f../*.** The pro
207e0 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  xy locking metho
207f0 64 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65  d is a "super-me
20800 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e  thod" in the sen
20810 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70  se that it.** op
20820 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69  ens secondary fi
20830 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
20840 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64  or the conch and
20850 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a   lock files and.
20860 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78 79  ** it uses proxy
20870 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c  , dot-file, AFP,
20880 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63   and flock() loc
20890 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
208a0 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61  those.** seconda
208b0 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74  ry files.  For t
208c0 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  his reason, the 
208d0 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d  division that im
208e0 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78  plements.** prox
208f0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63  y locking is loc
20900 61 74 65 64 20 6d 75 63 68 20 66 75 72 74 68 65  ated much furthe
20910 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69  r down in the fi
20920 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  le.  But we need
20930 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20  .** to go ahead 
20940 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20 73  and define the s
20950 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
20960 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e  s and finder fun
20970 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f  ction.** for pro
20980 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e  xy locking here.
20990 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20    So we forward 
209a0 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20  declare the I/O 
209b0 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20  methods..*/.#if 
209c0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
209d0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
209e0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
209f0 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  E.static int pro
20a00 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
20a10 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69  file*);.static i
20a20 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c  nt proxyLock(sql
20a30 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
20a40 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
20a50 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  xyUnlock(sqlite3
20a60 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74  _file*, int);.st
20a70 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68  atic int proxyCh
20a80 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
20a90 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
20aa0 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28  nt*);.IOMETHODS(
20ab0 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72  .  proxyIoFinder
20ac0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
20ad0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
20ae0 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49  name */.  proxyI
20af0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
20b00 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
20b10 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
20b20 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
20b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b40 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
20b50 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
20b60 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73  d */.  proxyClos
20b70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
20b80 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
20b90 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  d */.  proxyLock
20ba0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20bb0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
20bc0 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63   */.  proxyUnloc
20bd0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
20be0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
20bf0 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63  d */.  proxyChec
20c00 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
20c10 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
20c20 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
20c30 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66  .).#endif../* nf
20c40 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31  s lockd on OSX 1
20c50 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65  0.3+ doesn't cle
20c60 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77  ar write locks w
20c70 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  hen a read lock 
20c80 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65  is set */.#if de
20c90 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
20ca0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
20cb0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
20cc0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73  IOMETHODS(.  nfs
20cd0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
20ce0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
20cf0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
20d00 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64  */.  nfsIoMethod
20d10 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
20d20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
20d30 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
20d40 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d60 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
20d70 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
20d80 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
20d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20da0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
20db0 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20  */.  unixLock,  
20dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20dd0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
20de0 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20  */.  nfsUnlock, 
20df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e00 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
20e10 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b  d */.  unixCheck
20e20 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
20e30 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
20e40 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
20e50 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
20e60 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
20e70 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
20e80 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
20e90 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66  E./* .** This "f
20ea0 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20  inder" function 
20eb0 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65  attempts to dete
20ec0 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c  rmine the best l
20ed0 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
20ee0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61  .** for the data
20ef0 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50  base file "fileP
20f00 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72  ath".  It then r
20f10 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74  eturns the sqlit
20f20 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
20f30 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
20f40 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72  lements that str
20f50 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ategy..**.** Thi
20f60 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20  s is for MacOSX 
20f70 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
20f80 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
20f90 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f  _methods *autolo
20fa0 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a  ckIoFinderImpl(.
20fb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
20fc0 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61  lePath,    /* na
20fd0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
20fe0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  se file */.  uni
20ff0 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20  xFile *pNew     
21000 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69        /* open fi
21010 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  le object for th
21020 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
21030 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63  */.){.  static c
21040 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70 70  onst struct Mapp
21050 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ing {.    const 
21060 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65  char *zFilesyste
21070 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
21080 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79  /* Filesystem ty
21090 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63  pe name */.    c
210a0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
210b0 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64  methods *pMethod
210c0 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69  s;   /* Appropri
210d0 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ate locking meth
210e0 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d  od */.  } aMap[]
210f0 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22   = {.    { "hfs"
21100 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74  ,    &posixIoMet
21110 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75  hods },.    { "u
21120 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f  fs",    &posixIo
21130 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
21140 20 22 61 66 70 66 73 22 2c 20 20 26 61 66 70 49   "afpfs",  &afpI
21150 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
21160 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70  { "smbfs",  &afp
21170 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
21180 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f   { "webdav", &no
21190 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  lockIoMethods },
211a0 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20  .    { 0, 0 }.  
211b0 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  };.  int i;.  st
211c0 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
211d0 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  fo;.  struct flo
211e0 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20  ck lockInfo;..  
211f0 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b  if( !filePath ){
21200 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50  .    /* If fileP
21210 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  ath==NULL that m
21220 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c  eans we are deal
21230 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73  ing with a trans
21240 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a  ient file.    **
21250 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
21260 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
21270 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
21280 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
21290 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74  ;.  }.  if( stat
212a0 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73  fs(filePath, &fs
212b0 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20  Info) != -1 ){. 
212c0 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f     if( fsInfo.f_
212d0 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e  flags & MNT_RDON
212e0 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LY ){.      retu
212f0 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
21300 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ods;.    }.    f
21310 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e  or(i=0; aMap[i].
21320 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b  zFilesystem; i++
21330 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
21340 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
21350 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d  ypename, aMap[i]
21360 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30  .zFilesystem)==0
21370 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
21380 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68  rn aMap[i].pMeth
21390 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ods;.      }.   
213a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66   }.  }..  /* Def
213b0 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c  ault case. Handl
213c0 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65  es, amongst othe
213d0 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20  rs, "nfs"..  ** 
213e0 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20  Test byte-range 
213f0 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c  lock using fcntl
21400 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20  (). If the call 
21410 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20  succeeds, .  ** 
21420 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
21430 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
21440 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65  orts POSIX style
21450 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20   locks. .  */.  
21460 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
21470 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
21480 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
21490 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
214a0 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
214b0 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
214c0 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66  F_RDLCK;.  if( f
214d0 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f  cntl(pNew->h, F_
214e0 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f  GETLK, &lockInfo
214f0 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66  )!=-1 ) {.    if
21500 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
21510 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e  f_fstypename, "n
21520 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fs")==0 ){.     
21530 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65   return &nfsIoMe
21540 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73  thods;.    } els
21550 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e {.      return
21560 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
21570 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
21580 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74  .    return &dot
21590 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
215a0 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73   }.}.static cons
215b0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
215c0 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74  hods .  *(*const
215d0 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
215e0 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  r)(const char*,u
215f0 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f  nixFile*) = auto
21600 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
21610 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  ;..#endif /* def
21620 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
21630 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
21640 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
21650 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  /..#if OS_VXWORK
21660 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  S && SQLITE_ENAB
21670 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
21680 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69  ./* .** This "fi
21690 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61  nder" function a
216a0 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72  ttempts to deter
216b0 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f  mine the best lo
216c0 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a  cking strategy .
216d0 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  ** for the datab
216e0 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61  ase file "filePa
216f0 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65  th".  It then re
21700 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65  turns the sqlite
21710 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20  3_io_methods.** 
21720 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c  object that impl
21730 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61  ements that stra
21740 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tegy..**.** This
21750 20 69 73 20 66 6f 72 20 56 58 57 6f 72 6b 73 20   is for VXWorks 
21760 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
21770 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
21780 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f  _methods *autolo
21790 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a  ckIoFinderImpl(.
217a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
217b0 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61  lePath,    /* na
217c0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
217d0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  se file */.  uni
217e0 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20  xFile *pNew     
217f0 20 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65        /* the ope
21800 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f  n file object */
21810 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  .){.  struct flo
21820 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20  ck lockInfo;..  
21830 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b  if( !filePath ){
21840 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50  .    /* If fileP
21850 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  ath==NULL that m
21860 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c  eans we are deal
21870 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73  ing with a trans
21880 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a  ient file.    **
21890 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
218a0 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
218b0 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
218c0 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
218d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74  ;.  }..  /* Test
218e0 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73   if fcntl() is s
218f0 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65  upported and use
21900 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63   POSIX style loc
21910 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  ks..  ** Otherwi
21920 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  se fall back to 
21930 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68  the named semaph
21940 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f  ore method..  */
21950 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65  .  lockInfo.l_le
21960 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66  n = 1;.  lockInf
21970 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  o.l_start = 0;. 
21980 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e   lockInfo.l_when
21990 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
219a0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65   lockInfo.l_type
219b0 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66   = F_RDLCK;.  if
219c0 28 20 66 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c  ( fcntl(pNew->h,
219d0 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49   F_GETLK, &lockI
219e0 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20  nfo)!=-1 ) {.   
219f0 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
21a00 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
21a10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73 65  {.    return &se
21a20 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  mIoMethods;.  }.
21a30 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
21a40 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
21a50 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75  s .  *(*const au
21a60 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28  tolockIoFinder)(
21a70 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
21a80 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63  File*) = autoloc
21a90 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a  kIoFinderImpl;..
21aa0 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
21ab0 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45  ORKS && SQLITE_E
21ac0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
21ad0 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  YLE */../*.** An
21ae0 20 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66   abstract type f
21af0 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  or a pointer to 
21b00 61 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64  a IO method find
21b10 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a  er function:.*/.
21b20 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71  typedef const sq
21b30 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
21b40 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29   *(*finder_type)
21b50 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
21b60 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a  xFile*);.../****
21b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21bb0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
21bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21bd0 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  ***** sqlite3_vf
21be0 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
21bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c00 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  ******.**.** Thi
21c10 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
21c20 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ins the implemen
21c30 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64  tation of method
21c40 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  s on the.** sqli
21c50 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
21c60 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  */../*.** Initia
21c70 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lize the content
21c80 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
21c90 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
21ca0 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a  ted to by pId..*
21cb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
21cc0 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73  lInUnixFile(.  s
21cd0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
21ce0 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
21cf0 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
21d00 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20  */.  int h,     
21d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21d20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
21d30 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69  ptor of file bei
21d40 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69  ng opened */.  i
21d50 6e 74 20 64 69 72 66 64 2c 20 20 20 20 20 20 20  nt dirfd,       
21d60 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74         /* Direct
21d70 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
21d80 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  tor */.  sqlite3
21d90 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20  _file *pId,     
21da0 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65   /* Write to the
21db0 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
21dc0 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
21dd0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
21de0 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
21df0 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
21e00 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
21e10 6e 6f 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  noLock,         
21e20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b      /* Omit lock
21e30 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ing if true */. 
21e40 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20   int isDelete   
21e50 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
21e60 74 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74  te on close if t
21e70 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  rue */.){.  cons
21e80 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
21e90 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74  hods *pLockingSt
21ea0 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  yle;.  unixFile 
21eb0 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c  *pNew = (unixFil
21ec0 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72  e *)pId;.  int r
21ed0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
21ee0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
21ef0 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a  pInode==NULL );.
21f00 0a 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20  .  /* Parameter 
21f10 69 73 44 65 6c 65 74 65 20 69 73 20 6f 6e 6c 79  isDelete is only
21f20 20 75 73 65 64 20 6f 6e 20 76 78 77 6f 72 6b 73   used on vxworks
21f30 2e 20 45 78 70 72 65 73 73 20 74 68 69 73 20 65  . Express this e
21f40 78 70 6c 69 63 69 74 6c 79 20 0a 20 20 2a 2a 20  xplicitly .  ** 
21f50 68 65 72 65 20 74 6f 20 70 72 65 76 65 6e 74 20  here to prevent 
21f60 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
21f70 73 20 61 62 6f 75 74 20 75 6e 75 73 65 64 20 70  s about unused p
21f80 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a  arameters..  */.
21f90 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
21fa0 45 52 28 69 73 44 65 6c 65 74 65 29 3b 0a 0a 20  ER(isDelete);.. 
21fb0 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20   /* Usually the 
21fc0 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73  path zFilename s
21fd0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 72  hould not be a r
21fe0 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
21ff0 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65 70  . The.  ** excep
22000 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65  tion is when ope
22010 6e 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22  ning the proxy "
22020 63 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62  conch" file in b
22030 75 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a 20  uilds that.  ** 
22040 69 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65 63  include the spec
22050 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e  ial Apple lockin
22060 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23  g styles..  */.#
22070 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
22080 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
22090 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
220a0 54 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20 7a  TYLE.  assert( z
220b0 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
220c0 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  Filename[0]=='/'
220d0 20 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70   .    || pVfs->p
220e0 41 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29  AppData==(void*)
220f0 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  &autolockIoFinde
22100 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73  r );.#else.  ass
22110 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ert( zFilename==
22120 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
22130 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66  ]=='/' );.#endif
22140 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
22150 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22  EN    %-3d %s\n"
22160 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29  , h, zFilename))
22170 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b  ;.  pNew->h = h;
22180 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d  .  pNew->dirfd =
22190 20 64 69 72 66 64 3b 0a 20 20 70 4e 65 77 2d 3e   dirfd;.  pNew->
221a0 66 69 6c 65 46 6c 61 67 73 20 3d 20 30 3b 0a 20  fileFlags = 0;. 
221b0 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a   pNew->zPath = z
221c0 46 69 6c 65 6e 61 6d 65 3b 0a 0a 23 69 66 20 4f  Filename;..#if O
221d0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77  S_VXWORKS.  pNew
221e0 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46  ->pId = vxworksF
221f0 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e  indFileId(zFilen
22200 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ame);.  if( pNew
22210 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pId==0 ){.    
22220 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20  noLock = 1;.    
22230 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
22240 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  M;.  }.#endif.. 
22250 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20   if( noLock ){. 
22260 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
22270 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68   = &nolockIoMeth
22280 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
22290 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
222a0 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70  = (**(finder_typ
222b0 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74  e*)pVfs->pAppDat
222c0 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e  a)(zFilename, pN
222d0 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ew);.#if SQLITE_
222e0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
222f0 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68  TYLE.    /* Cach
22300 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74  e zFilename in t
22310 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
22320 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c  xt (AFP and dotl
22330 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f  ock override) fo
22340 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f  r.    ** proxyLo
22350 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73  ck activation is
22360 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74   possible (remot
22370 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64  e proxy is based
22380 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20   on db name).   
22390 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65   ** zFilename re
223a0 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
223b0 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
223c0 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a  , to support */.
223d0 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
223e0 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64  gContext = (void
223f0 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e  *)zFilename;.#en
22400 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
22410 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
22420 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a  &posixIoMethods.
22430 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
22440 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
22450 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
22460 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f  STYLE.    || pLo
22470 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e  ckingStyle == &n
22480 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64  fsIoMethods.#end
22490 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78  if.  ){.    unix
224a0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
224b0 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
224c0 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
224d0 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
224e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
224f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
22500 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
22510 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   in findInodeInf
22520 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66  o(), close the f
22530 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20  ile descriptor. 
22540 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74       ** immediat
22550 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65  ely, before rele
22560 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e  asing the mutex.
22570 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
22580 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20   may fail.      
22590 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ** in two scenar
225a0 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ios:.      **.  
225b0 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63      **   (a) A c
225c0 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66  all to fstat() f
225d0 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  ailed..      ** 
225e0 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66    (b) A malloc f
225f0 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ailed..      **.
22600 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69        ** Scenari
22610 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f  o (b) may only o
22620 63 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63  ccur if the proc
22630 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e  ess is holding n
22640 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  o other.      **
22650 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
22660 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  s open on the sa
22670 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  me file. If ther
22680 65 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c  e were other fil
22690 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
226a0 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66  iptors on this f
226b0 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c  ile, then no mal
226c0 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71  loc would be req
226d0 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
226e0 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  * findInodeInfo(
226f0 29 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ). If this is th
22700 65 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75  e case, it is qu
22710 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73  ite safe to clos
22720 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c  e.      ** handl
22730 65 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67  e h - as it is g
22740 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e  uaranteed that n
22750 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69  o posix locks wi
22760 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20  ll be released. 
22770 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67       ** by doing
22780 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20   so..      **.  
22790 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72      ** If scenar
227a0 69 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68  io (a) caused th
227b0 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69  e error then thi
227c0 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73  ngs are not so s
227d0 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  afe. The.      *
227e0 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d  * implicit assum
227f0 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68  ption here is th
22800 61 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61  at if fstat() fa
22810 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20  ils, things are 
22820 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68  in.      ** such
22830 20 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20   bad shape that 
22840 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20  dropping a lock 
22850 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d  or two doesn't m
22860 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20  atter much..    
22870 20 20 2a 2f 0a 20 20 20 20 20 20 63 6c 6f 73 65    */.      close
22880 28 68 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d  (h);.      h = -
22890 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69  1;.    }.    uni
228a0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
228b0 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   }..#if SQLITE_E
228c0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
228d0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
228e0 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65  _APPLE__).  else
228f0 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
22900 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68  le == &afpIoMeth
22910 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46  ods ){.    /* AF
22920 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  P locking uses t
22930 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
22940 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69  it needs to be i
22950 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a  ncluded in.    *
22960 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67  * the afpLocking
22970 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a  Context..    */.
22980 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f      afpLockingCo
22990 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20  ntext *pCtx;.   
229a0 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
229b0 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73  ntext = pCtx = s
229c0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
229d0 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a  izeof(*pCtx) );.
229e0 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20      if( pCtx==0 
229f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
22a00 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
22a10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
22a20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78  NB: zFilename ex
22a30 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73  ists and remains
22a40 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65   valid until the
22a50 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a   file is closed.
22a60 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69        ** accordi
22a70 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e  ng to requiremen
22a80 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65  t F11141.  So we
22a90 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
22aa0 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  make a.      ** 
22ab0 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65  copy of the file
22ac0 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70  name. */.      p
22ad0 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46  Ctx->dbPath = zF
22ae0 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70  ilename;.      p
22af0 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  Ctx->reserved = 
22b00 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d  0;.      srandom
22b10 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69  dev();.      uni
22b20 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
22b30 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e       rc = findIn
22b40 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
22b50 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
22b60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22b70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
22b80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
22b90 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
22ba0 78 74 29 3b 0a 20 20 20 20 20 20 20 20 63 6c 6f  xt);.        clo
22bb0 73 65 28 68 29 3b 0a 20 20 20 20 20 20 20 20 68  se(h);.        h
22bc0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
22bd0 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75       unixLeaveMu
22be0 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20  tex();        . 
22bf0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
22c00 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
22c10 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f  kingStyle == &do
22c20 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29  tlockIoMethods )
22c30 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65  {.    /* Dotfile
22c40 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
22c50 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
22c60 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
22c70 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
22c80 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b   the dotlockLock
22c90 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20  ingContext .    
22ca0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f  */.    char *zLo
22cb0 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20  ckFile;.    int 
22cc0 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 6e  nFilename;.    n
22cd0 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29  Filename = (int)
22ce0 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  strlen(zFilename
22cf0 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b  ) + 6;.    zLock
22d00 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73  File = (char *)s
22d10 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46  qlite3_malloc(nF
22d20 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ilename);.    if
22d30 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29  ( zLockFile==0 )
22d40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
22d50 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
22d60 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
22d70 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69  te3_snprintf(nFi
22d80 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c  lename, zLockFil
22d90 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f  e, "%s" DOTLOCK_
22da0 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d  SUFFIX, zFilenam
22db0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  e);.    }.    pN
22dc0 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
22dd0 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a  xt = zLockFile;.
22de0 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f    }..#if OS_VXWO
22df0 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70  RKS.  else if( p
22e00 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
22e10 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &semIoMethods ){
22e20 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65  .    /* Named se
22e30 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
22e40 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
22e50 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
22e60 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c  o be.    ** incl
22e70 75 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c  uded in the semL
22e80 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20  ockingContext.  
22e90 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74    */.    unixEnt
22ea0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
22eb0 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
22ec0 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
22ed0 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20  Inode);.    if( 
22ee0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc==SQLITE_OK) 
22ef0 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  && (pNew->pInode
22f00 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b  ->pSem==NULL) ){
22f10 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65  .      char *zSe
22f20 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49  mName = pNew->pI
22f30 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a  node->aSemName;.
22f40 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
22f50 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
22f60 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ntf(MAX_PATHNAME
22f70 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73  , zSemName, "/%s
22f80 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20  .sem",.         
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
22fa0 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69  ew->pId->zCanoni
22fb0 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  calName);.      
22fc0 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61  for( n=1; zSemNa
22fd0 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20  me[n]; n++ ).   
22fe0 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d       if( zSemNam
22ff0 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d  e[n]=='/' ) zSem
23000 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20  Name[n] = '_';. 
23010 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64       pNew->pInod
23020 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70  e->pSem = sem_op
23030 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43  en(zSemName, O_C
23040 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a  REAT, 0666, 1);.
23050 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
23060 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20  pInode->pSem == 
23070 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20  SEM_FAILED ){.  
23080 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23090 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
230a0 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61   pNew->pInode->a
230b0 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30  SemName[0] = '\0
230c0 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ';.      }.    }
230d0 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
230e0 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  tex();.  }.#endi
230f0 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73  f.  .  pNew->las
23100 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20  tErrno = 0;.#if 
23110 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
23120 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23130 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  {.    if( h>=0 )
23140 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 68   close(h);.    h
23150 20 3d 20 2d 31 3b 0a 20 20 20 20 75 6e 6c 69 6e   = -1;.    unlin
23160 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  k(zFilename);.  
23170 20 20 69 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a    isDelete = 0;.
23180 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 73 44 65    }.  pNew->isDe
23190 6c 65 74 65 20 3d 20 69 73 44 65 6c 65 74 65 3b  lete = isDelete;
231a0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63  .#endif.  if( rc
231b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
231c0 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20     if( dirfd>=0 
231d0 29 20 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20  ) close(dirfd); 
231e0 2f 2a 20 73 69 6c 65 6e 74 20 6c 65 61 6b 20 69  /* silent leak i
231f0 66 20 66 61 69 6c 2c 20 61 6c 72 65 61 64 79 20  f fail, already 
23200 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  in error */.    
23210 69 66 28 20 68 3e 3d 30 20 29 20 63 6c 6f 73 65  if( h>=0 ) close
23220 28 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (h);.  }else{.  
23230 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20    pNew->pMethod 
23240 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  = pLockingStyle;
23250 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  .    OpenCounter
23260 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (+1);.  }.  retu
23270 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23280 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  Open a file desc
23290 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69  riptor to the di
232a0 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
232b0 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d  ng file zFilenam
232c0 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  e..** If success
232d0 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74  ful, *pFd is set
232e0 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66   to the opened f
232f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
23300 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
23310 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
23320 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
23330 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e   either SQLITE_N
23340 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  OMEM.** or SQLIT
23350 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65  E_CANTOPEN is re
23360 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20  turned and *pFd 
23370 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64  is set to an und
23380 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e  efined.** value.
23390 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
233a0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
233b0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
233c0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
233d0 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69  losing.** the fi
233e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70  le descriptor *p
233f0 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29  Fd using close()
23400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23410 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f  openDirectory(co
23420 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
23430 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a  ame, int *pFd){.
23440 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
23450 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20  fd = -1;.  char 
23460 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zDirname[MAX_PAT
23470 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c  HNAME+1];..  sql
23480 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
23490 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72  X_PATHNAME, zDir
234a0 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c  name, "%s", zFil
234b0 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69  ename);.  for(ii
234c0 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69  =(int)strlen(zDi
234d0 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26 20  rname); ii>1 && 
234e0 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f  zDirname[ii]!='/
234f0 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20  '; ii--);.  if( 
23500 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72  ii>0 ){.    zDir
23510 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b  name[ii] = '\0';
23520 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a  .    fd = open(z
23530 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  Dirname, O_RDONL
23540 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a  Y|O_BINARY, 0);.
23550 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
23560 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58  .#ifdef FD_CLOEX
23570 45 43 0a 20 20 20 20 20 20 66 63 6e 74 6c 28 66  EC.      fcntl(f
23580 64 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74  d, F_SETFD, fcnt
23590 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30  l(fd, F_GETFD, 0
235a0 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b  ) | FD_CLOEXEC);
235b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53  .#endif.      OS
235c0 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49 52 20  TRACE(("OPENDIR 
235d0 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20  %-3d %s\n", fd, 
235e0 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20 20  zDirname));.    
235f0 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66  }.  }.  *pFd = f
23600 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e  d;.  return (fd>
23610 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e 69  =0?SQLITE_OK:uni
23620 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
23630 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
23640 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d 65  "open", zDirname
23650 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ));.}../*.** Ret
23660 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
23670 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77  a directory in w
23680 68 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70  hich to put temp
23690 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20  orary files..** 
236a0 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74  If no suitable t
236b0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69  emporary file di
236c0 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66  rectory can be f
236d0 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ound, return NUL
236e0 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
236f0 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d  st char *unixTem
23700 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a  pFileDir(void){.
23710 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
23720 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
23730 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30  {.     0,.     0
23740 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70  ,.     "/var/tmp
23750 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  ",.     "/usr/tm
23760 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c  p",.     "/tmp",
23770 0a 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f  .     0        /
23780 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f  * List terminato
23790 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73 69  r */.  };.  unsi
237a0 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73 74  gned int i;.  st
237b0 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
237c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
237d0 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72 73  r = 0;..  azDirs
237e0 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  [0] = sqlite3_te
237f0 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20  mp_directory;.  
23800 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29  if( !azDirs[1] )
23810 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74   azDirs[1] = get
23820 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
23830 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
23840 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
23850 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44  f(azDirs[0]); zD
23860 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b  ir=azDirs[i++]){
23870 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  .    if( zDir==0
23880 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23890 20 69 66 28 20 73 74 61 74 28 7a 44 69 72 2c 20   if( stat(zDir, 
238a0 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65  &buf) ) continue
238b0 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53 44  ;.    if( !S_ISD
238c0 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20  IR(buf.st_mode) 
238d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
238e0 69 66 28 20 61 63 63 65 73 73 28 7a 44 69 72 2c  if( access(zDir,
238f0 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b   07) ) continue;
23900 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
23910 20 20 72 65 74 75 72 6e 20 7a 44 69 72 3b 0a 7d    return zDir;.}
23920 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
23930 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
23940 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a  name in zBuf.  z
23950 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  Buf must be allo
23960 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  cated.** by the 
23970 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20  calling process 
23980 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69 67 20  and must be big 
23990 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61  enough to hold a
239a0 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d  t least.** pVfs-
239b0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65  >mxPathname byte
239c0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
239d0 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
239e0 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
239f0 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63  *zBuf){.  static
23a00 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
23a10 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
23a20 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
23a30 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
23a40 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
23a50 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
23a60 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
23a70 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  9";.  unsigned i
23a80 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74  nt i, j;.  const
23a90 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a 0a 20 20   char *zDir;..  
23aa0 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
23ab0 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
23ac0 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
23ad0 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
23ae0 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
23af0 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
23b00 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
23b10 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
23b20 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
23b30 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
23b40 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74   .  */.  Simulat
23b50 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
23b60 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b   SQLITE_IOERR );
23b70 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e 69 78 54  ..  zDir = unixT
23b80 65 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a 20 20  empFileDir();.  
23b90 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 7a 44  if( zDir==0 ) zD
23ba0 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20  ir = ".";..  /* 
23bb0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f  Check that the o
23bc0 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20  utput buffer is 
23bd0 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
23be0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
23bf0 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20  ile .  ** name. 
23c00 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65  If it is not, re
23c10 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
23c20 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73  R..  */.  if( (s
23c30 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73 74  trlen(zDir) + st
23c40 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50  rlen(SQLITE_TEMP
23c50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20  _FILE_PREFIX) + 
23c60 31 37 29 20 3e 3d 20 28 73 69 7a 65 5f 74 29 6e  17) >= (size_t)n
23c70 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Buf ){.    retur
23c80 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
23c90 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 73    }..  do{.    s
23ca0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
23cb0 6e 42 75 66 2d 31 37 2c 20 7a 42 75 66 2c 20 22  nBuf-17, zBuf, "
23cc0 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f  %s/"SQLITE_TEMP_
23cd0 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69  FILE_PREFIX, zDi
23ce0 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28 69 6e 74  r);.    j = (int
23cf0 29 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20  )strlen(zBuf);. 
23d00 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
23d10 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b  mness(15, &zBuf[
23d20 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  j]);.    for(i=0
23d30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
23d40 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d  ){.      zBuf[j]
23d50 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b   = (char)zChars[
23d60 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   ((unsigned char
23d70 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f  )zBuf[j])%(sizeo
23d80 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a  f(zChars)-1) ];.
23d90 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a      }.    zBuf[j
23da0 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28  ] = 0;.  }while(
23db0 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d   access(zBuf,0)=
23dc0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
23dd0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
23de0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
23df0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
23e00 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
23e10 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  _)./*.** Routine
23e20 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20   to transform a 
23e30 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20  unixFile into a 
23e40 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e  proxy-locking un
23e50 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65  ixFile..** Imple
23e60 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65  mentation in the
23e70 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69   proxy-lock divi
23e80 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62  sion, but used b
23e90 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20  y unixOpen().** 
23ea0 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
23eb0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69  _PROXY_LOCKING i
23ec0 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  s defined..*/.st
23ed0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72  atic int proxyTr
23ee0 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
23ef0 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74  unixFile*, const
23f00 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a   char*);.#endif.
23f10 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
23f20 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65  r an unused file
23f30 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
23f40 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74   was opened on t
23f50 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
23f60 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
23f70 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f  nal or master-jo
23f80 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e  urnal file) iden
23f90 74 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61  tified by pathna
23fa0 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68  me.** zPath with
23fb0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58   SQLITE_OPEN_XXX
23fc0 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20   flags matching 
23fd0 74 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20  those passed as 
23fe0 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
23ff0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
24000 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53  unction..**.** S
24010 75 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72  uch a file descr
24020 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20  iptor may exist 
24030 69 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  if a database co
24040 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f  nnection was clo
24050 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61  sed.** but the a
24060 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64  ssociated file d
24070 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20  escriptor could 
24080 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65  not be closed be
24090 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74  cause some.** ot
240a0 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
240b0 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  tor open on the 
240c0 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c  same file is hol
240d0 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b  ding a file-lock
240e0 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f  ..** Refer to co
240f0 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e  mments in the un
24100 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69  ixClose() functi
24110 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74  on and the lengt
24120 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65  hy comment.** de
24130 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20  scribing "Posix 
24140 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67  Advisory Locking
24150 22 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  " at the start o
24160 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20  f this file for 
24170 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61  .** further deta
24180 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65  ils. Also, ticke
24190 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49  t #4018..**.** I
241a0 66 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c  f a suitable fil
241b0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
241c0 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69  found, then it i
241d0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  s returned. If n
241e0 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64  o.** such file d
241f0 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63  escriptor is loc
24200 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ated, -1 is retu
24210 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
24220 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69  UnixUnusedFd *fi
24230 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e  ndReusableFd(con
24240 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
24250 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e  int flags){.  Un
24260 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
24270 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  sed = 0;..  /* D
24280 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72  o not search for
24290 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
242a0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78  descriptor on vx
242b0 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75  works. Not becau
242c0 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20  se.  ** vxworks 
242d0 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69  would not benefi
242e0 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67  t from the chang
242f0 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27  e (it might, we'
24300 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20  re not sure),.  
24310 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e  ** but because n
24320 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74  o way to test it
24330 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76   is currently av
24340 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62  ailable. It is b
24350 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20  etter .  ** not 
24360 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67  to risk breaking
24370 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74   vxworks support
24380 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66   for the sake of
24390 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65   such an obscure
243a0 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20   .  ** feature. 
243b0 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f   */.#if !OS_VXWO
243c0 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61  RKS.  struct sta
243d0 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
243e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
243f0 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20  sults of stat() 
24400 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20  call */..  /* A 
24410 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20  stat() call may 
24420 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73  fail for various
24430 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69   reasons. If thi
24440 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73  s happens, it is
24450 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72  .  ** almost cer
24460 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65  tain that an ope
24470 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20  n() call on the 
24480 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61  same path will a
24490 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46  lso fail..  ** F
244a0 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
244b0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
244c0 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28 29  rs in the stat()
244d0 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69   call here, it i
244e0 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61  s.  ** ignored a
244f0 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  nd -1 is returne
24500 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  d. The caller wi
24510 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61  ll try to open a
24520 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64   new file.  ** d
24530 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65  escriptor on the
24540 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c   same path, fail
24550 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  , and return an 
24560 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e  error to SQLite.
24570 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20  .  **.  ** Even 
24580 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
24590 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73  open() call does
245a0 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f   succeed, the co
245b0 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20  nsequences of.  
245c0 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67  ** not searching
245d0 20 66 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65   for a resusable
245e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
245f0 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20   are not dire.  
24600 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 61 74  */.  if( 0==stat
24610 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20  (zPath, &sStat) 
24620 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65  ){.    unixInode
24630 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20  Info *pInode;.. 
24640 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
24650 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20  x();.    pInode 
24660 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
24670 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26   while( pInode &
24680 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  & (pInode->fileI
24690 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f  d.dev!=sStat.st_
246a0 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20  dev.            
246b0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f           || pIno
246c0 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d  de->fileId.ino!=
246d0 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b  sStat.st_ino) ){
246e0 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d  .       pInode =
246f0 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
24700 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
24710 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e  node ){.      Un
24720 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b  ixUnusedFd **pp;
24730 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70  .      for(pp=&p
24740 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20  Inode->pUnused; 
24750 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c  *pp && (*pp)->fl
24760 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26  ags!=flags; pp=&
24770 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b  ((*pp)->pNext));
24780 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
24790 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20   *pp;.      if( 
247a0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
247b0 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64     *pp = pUnused
247c0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
247d0 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
247e0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
247f0 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66  .#endif    /* if
24800 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a   !OS_VXWORKS */.
24810 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64    return pUnused
24820 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
24830 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
24840 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29  ed by unixOpen()
24850 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
24860 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f  e unix permissio
24870 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20  ns.** to create 
24880 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20  new files with. 
24890 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
248a0 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
248b0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
248c0 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75  * and a value su
248d0 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69  itable for passi
248e0 6e 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20  ng as the third 
248f0 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e  argument to open
24900 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65  (2) is.** writte
24910 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20  n to *pMode. If 
24920 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
24930 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
24940 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
24950 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
24960 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65   value of *pMode
24970 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64   is not modified
24980 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
24990 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
249a0 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
249b0 66 69 6c 65 2c 20 69 74 20 69 73 20 61 6c 77 61  file, it is alwa
249c0 79 73 20 63 72 65 61 74 65 64 20 77 69 74 68 0a  ys created with.
249d0 2a 2a 20 74 68 65 20 6f 63 74 61 6c 20 70 65 72  ** the octal per
249e0 6d 69 73 73 69 6f 6e 73 20 30 36 30 30 20 28 72  missions 0600 (r
249f0 65 61 64 2f 77 72 69 74 61 62 6c 65 20 62 79 20  ead/writable by 
24a00 6f 77 6e 65 72 20 6f 6e 6c 79 29 2e 20 49 66 20  owner only). If 
24a10 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61  the file.** is a
24a20 20 64 61 74 61 62 61 73 65 20 6f 72 20 6d 61 73   database or mas
24a30 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
24a40 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
24a50 77 69 74 68 20 74 68 65 20 70 65 72 6d 69 73 73  with the permiss
24a60 69 6f 6e 73 20 0a 2a 2a 20 6d 61 73 6b 20 53 51  ions .** mask SQ
24a70 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
24a80 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 2e 0a 2a  E_PERMISSIONS..*
24a90 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66  *.** Finally, if
24aa0 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
24ab0 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20  opened is a WAL 
24ac0 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e  or regular journ
24ad0 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a  al file, then .*
24ae0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
24af0 71 75 65 72 69 65 73 20 74 68 65 20 66 69 6c 65  queries the file
24b00 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
24b10 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
24b20 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  he .** correspon
24b30 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ding database fi
24b40 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f  le and sets *pMo
24b50 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  de to this value
24b60 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70  . Whenever .** p
24b70 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64  ossible, WAL and
24b80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61   journal files a
24b90 72 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  re created using
24ba0 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
24bb0 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65  sions .** as the
24bc0 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
24bd0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
24be0 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65  atic int findCre
24bf0 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63  ateFileMode(.  c
24c00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
24c10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
24c20 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28  * Path of file (
24c30 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20  possibly) being 
24c40 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  created */.  int
24c50 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
24c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24c70 46 6c 61 67 73 20 70 61 73 73 65 64 20 61 73 20  Flags passed as 
24c80 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  4th argument to 
24c90 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64  xOpen() */.  mod
24ca0 65 5f 74 20 2a 70 4d 6f 64 65 20 20 20 20 20 20  e_t *pMode      
24cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24cc0 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73  OUT: Permissions
24cd0 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69   to open file wi
24ce0 74 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  th */.){.  int r
24cf0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
24d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
24d10 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
24d20 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49  f( flags & (SQLI
24d30 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49  TE_OPEN_WAL|SQLI
24d40 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
24d50 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61  RNAL) ){.    cha
24d60 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41  r zDb[MAX_PATHNA
24d70 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61  ME+1];     /* Da
24d80 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68  tabase file path
24d90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b   */.    int nDb;
24da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24db0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
24dc0 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69  of valid bytes i
24dd0 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72  n zDb */.    str
24de0 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
24df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
24e00 74 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f  tput of stat() o
24e10 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
24e20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68  */..    /* zPath
24e30 20 69 73 20 61 20 70 61 74 68 20 74 6f 20 61 20   is a path to a 
24e40 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  WAL or journal f
24e50 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ile. The followi
24e60 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73  ng block derives
24e70 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68  .    ** the path
24e80 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74   to the associat
24e90 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
24ea0 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69   from zPath. Thi
24eb0 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a  s block handles.
24ec0 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
24ed0 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76  wing naming conv
24ee0 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a  entions:.    **.
24ef0 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
24f00 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a  to db>-journal".
24f10 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
24f20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20  to db>-wal".    
24f30 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
24f40 62 3e 2d 6a 6f 75 72 6e 61 6c 2d 4e 4e 4e 4e 22  b>-journal-NNNN"
24f50 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
24f60 20 74 6f 20 64 62 3e 2d 77 61 6c 2d 4e 4e 4e 4e   to db>-wal-NNNN
24f70 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ".    **.    ** 
24f80 77 68 65 72 65 20 4e 4e 4e 4e 20 69 73 20 61 20  where NNNN is a 
24f90 34 20 64 69 67 69 74 20 64 65 63 69 6d 61 6c 20  4 digit decimal 
24fa0 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 4e 4e  number. The NNNN
24fb0 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20   naming schemes 
24fc0 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64  are .    ** used
24fd0 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c   by the test_mul
24fe0 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e  tiplex.c module.
24ff0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20  .    */.    nDb 
25000 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
25010 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 20  0(zPath) - 1; . 
25020 20 20 20 77 68 69 6c 65 28 20 6e 44 62 3e 30 20     while( nDb>0 
25030 26 26 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27  && zPath[nDb]!='
25040 6c 27 20 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20  l' ) nDb--;.    
25050 6e 44 62 20 2d 3d 20 28 28 66 6c 61 67 73 20 26  nDb -= ((flags &
25060 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
25070 29 20 3f 20 33 20 3a 20 37 29 3b 0a 20 20 20 20  ) ? 3 : 7);.    
25080 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74  memcpy(zDb, zPat
25090 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62  h, nDb);.    zDb
250a0 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  [nDb] = '\0';.. 
250b0 20 20 20 69 66 28 20 30 3d 3d 73 74 61 74 28 7a     if( 0==stat(z
250c0 44 62 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  Db, &sStat) ){. 
250d0 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 73 53       *pMode = sS
250e0 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37  tat.st_mode & 07
250f0 37 37 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  77;.    }else{. 
25100 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25110 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
25120 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
25130 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
25140 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
25150 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20  E ){.    *pMode 
25160 3d 20 30 36 30 30 3b 0a 20 20 7d 65 6c 73 65 7b  = 0600;.  }else{
25170 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 53 51  .    *pMode = SQ
25180 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
25190 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20  E_PERMISSIONS;. 
251a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
251b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
251c0 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a  e file zPath..**
251d0 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c   .** Previously,
251e0 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c   the SQLite OS l
251f0 61 79 65 72 20 75 73 65 64 20 74 68 72 65 65 20  ayer used three 
25200 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61  functions in pla
25210 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e  ce of this.** on
25220 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  e:.**.**     sql
25230 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
25240 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71  ite();.**     sq
25250 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
25260 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71  nly();.**     sq
25270 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
25280 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  sive();.**.** Th
25290 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73  ese calls corres
252a0 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c  pond to the foll
252b0 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
252c0 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a  ns of flags:.**.
252d0 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 65  **     ReadWrite
252e0 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57  () ->     (READW
252f0 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a  RITE | CREATE).*
25300 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29  *     ReadOnly()
25310 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e    ->     (READON
25320 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e  LY) .**     Open
25330 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28  Exclusive() -> (
25340 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
25350 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a  TE | EXCLUSIVE).
25360 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70  **.** The old Op
25370 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61 63  enExclusive() ac
25380 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e  cepted a boolean
25390 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c   argument - "del
253a0 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75  Flag". If.** tru
253b0 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  e, the file was 
253c0 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65  configured to be
253d0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
253e0 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a  eleted when the.
253f0 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63  ** file handle c
25400 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76  losed. To achiev
25410 65 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63  e the same effec
25420 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77  t using this new
25430 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20   .** interface, 
25440 61 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e  add the DELETEON
25450 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68  CLOSE flag to th
25460 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 61 62  ose specified ab
25470 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e  ove for .** Open
25480 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a  Exclusive()..*/.
25490 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
254a0 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
254b0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
254c0 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66      /* The VFS f
254d0 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73  or which this is
254e0 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f   the xOpen metho
254f0 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
25500 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
25510 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20      /* Pathname 
25520 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70  of file to be op
25530 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ened */.  sqlite
25540 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
25550 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
25560 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
25570 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f   be filled in */
25580 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
25590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255a0 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74  /* Input flags t
255b0 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70  o control the op
255c0 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a  ening */.  int *
255d0 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20  pOutFlags       
255e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
255f0 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64  t flags returned
25600 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20   to SQLite core 
25610 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
25620 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20   *p = (unixFile 
25630 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66  *)pFile;.  int f
25640 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  d = -1;         
25650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
25660 65 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74  e descriptor ret
25670 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20  urned by open() 
25680 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 20 3d  */.  int dirfd =
25690 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
256a0 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
256b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
256c0 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c   */.  int openFl
256d0 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
256e0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f       /* Flags to
256f0 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20   pass to open() 
25700 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
25710 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30   flags&0xFFFFFF0
25720 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66  0;  /* Type of f
25730 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
25740 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20   int noLock;    
25750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25760 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
25770 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
25780 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  es */.  int rc =
25790 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
257a0 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
257b0 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  on Return Code *
257c0 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75  /..  int isExclu
257d0 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26  sive  = (flags &
257e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
257f0 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69  LUSIVE);.  int i
25800 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
25810 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
25820 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
25830 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  );.  int isCreat
25840 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
25850 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
25860 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  ATE);.  int isRe
25870 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67  adonly   = (flag
25880 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
25890 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  READONLY);.  int
258a0 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20   isReadWrite  = 
258b0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
258c0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b  OPEN_READWRITE);
258d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
258e0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
258f0 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f  .  int isAutoPro
25900 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  xy  = (flags & S
25910 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
25920 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ROXY);.#endif.. 
25930 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20   /* If creating 
25940 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e  a master or main
25950 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  -file journal, t
25960 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
25970 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69  l open.  ** a fi
25980 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le-descriptor on
25990 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
259a0 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74 69  oo. The first ti
259b0 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20  me unixSync().  
259c0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ** is called the
259d0 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   directory file 
259e0 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
259f0 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64  be fsync()ed and
25a00 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a   close()d..  */.
25a10 20 20 69 6e 74 20 69 73 4f 70 65 6e 44 69 72 65    int isOpenDire
25a20 63 74 6f 72 79 20 3d 20 28 69 73 43 72 65 61 74  ctory = (isCreat
25a30 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65  e && (.        e
25a40 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
25a50 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
25a60 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
25a70 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
25a80 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  N_JOURNAL .     
25a90 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
25aa0 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a  _OPEN_WAL.  ));.
25ab0 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
25ac0 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c  t zPath is a NUL
25ad0 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  L pointer, this 
25ae0 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75  function is requ
25af0 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  ired to open.  *
25b00 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
25b10 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66  le. Use this buf
25b20 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65  fer to store the
25b30 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20   file name in.. 
25b40 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e   */.  char zTmpn
25b50 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
25b60 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  +1];.  const cha
25b70 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68  r *zName = zPath
25b80 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
25b90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74  e following stat
25ba0 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a  ements are true:
25bb0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61   .  **.  **   (a
25bc0 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  ) Exactly one of
25bd0 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61   the READWRITE a
25be0 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67  nd READONLY flag
25bf0 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61  s must be set, a
25c00 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69  nd .  **   (b) i
25c10 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c  f CREATE is set,
25c20 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20   then READWRITE 
25c30 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
25c40 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29  , and.  **   (c)
25c50 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73   if EXCLUSIVE is
25c60 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
25c70 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
25c80 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69  et..  **   (d) i
25c90 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  f DELETEONCLOSE 
25ca0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
25cb0 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
25cc0 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
25cd0 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d  ert((isReadonly=
25ce0 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
25cf0 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64  e==0) && (isRead
25d00 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f  Write || isReado
25d10 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28  nly));.  assert(
25d20 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69  isCreate==0 || i
25d30 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61  sReadWrite);.  a
25d40 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76  ssert(isExclusiv
25d50 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
25d60 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65  );.  assert(isDe
25d70 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  lete==0 || isCre
25d80 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ate);..  /* The 
25d90 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f  main DB, main jo
25da0 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20  urnal, WAL file 
25db0 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  and master journ
25dc0 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20  al are never .  
25dd0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
25de0 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72   deleted. Nor ar
25df0 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70  e they ever temp
25e00 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f  orary files.  */
25e10 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
25e20 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
25e30 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
25e40 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
25e50 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
25e60 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
25e70 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
25e80 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
25e90 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
25ea0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
25eb0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
25ec0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
25ed0 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  R_JOURNAL );.  a
25ee0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
25ef0 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
25f00 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
25f10 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41  N_WAL );..  /* A
25f20 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75  ssert that the u
25f30 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73  pper layer has s
25f40 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66  et one of the "f
25f50 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e  ile-type" flags.
25f60 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54   */.  assert( eT
25f70 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
25f80 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c  _MAIN_DB      ||
25f90 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
25fa0 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20  PEN_TEMP_DB .   
25fb0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
25fc0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
25fd0 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
25fe0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
25ff0 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  P_JOURNAL .     
26000 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
26010 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
26020 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53  AL   || eType==S
26030 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
26040 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
26050 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
26060 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
26070 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53  T_DB || eType==S
26080 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
26090 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c   );..  memset(p,
260a0 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
260b0 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54  ile));..  if( eT
260c0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
260d0 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20  _MAIN_DB ){.    
260e0 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
260f0 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73  nused;.    pUnus
26100 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c  ed = findReusabl
26110 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73  eFd(zName, flags
26120 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73  );.    if( pUnus
26130 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d  ed ){.      fd =
26140 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20   pUnused->fd;.  
26150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
26160 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33  Unused = sqlite3
26170 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  _malloc(sizeof(*
26180 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20  pUnused));.     
26190 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b   if( !pUnused ){
261a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
261b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
261c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
261d0 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e  p->pUnused = pUn
261e0 75 73 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66  used;.  }else if
261f0 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( !zName ){.    
26200 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e  /* If zName is N
26210 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ULL, the upper l
26220 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74 69  ayer is requesti
26230 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  ng a temp file. 
26240 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69 73  */.    assert(is
26250 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65  Delete && !isOpe
26260 6e 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  nDirectory);.   
26270 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65 6d   rc = unixGetTem
26280 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41  pname(MAX_PATHNA
26290 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b  ME+1, zTmpname);
262a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
262b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
262c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
262d0 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d  .    zName = zTm
262e0 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pname;.  }..  /*
262f0 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76   Determine the v
26300 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67  alue of the flag
26310 73 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73  s parameter pass
26320 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63  ed to POSIX func
26330 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29  tion.  ** open()
26340 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62 65 20  . These must be 
26350 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20  calculated even 
26360 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74  if open() is not
26370 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a   called, as.  **
26380 20 74 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f   they may be sto
26390 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
263a0 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61  he file handle a
263b0 6e 64 20 75 73 65 64 20 62 79 20 74 68 65 20 0a  nd used by the .
263c0 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65    ** 'conch file
263d0 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69  ' locking functi
263e0 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a  ons later on.  *
263f0 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  /.  if( isReadon
26400 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20  ly )  openFlags 
26410 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69  |= O_RDONLY;.  i
26420 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
26430 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
26440 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72  RDWR;.  if( isCr
26450 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c  eate )    openFl
26460 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a  ags |= O_CREAT;.
26470 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76    if( isExclusiv
26480 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  e ) openFlags |=
26490 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c   (O_EXCL|O_NOFOL
264a0 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67  LOW);.  openFlag
264b0 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c  s |= (O_LARGEFIL
264c0 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20  E|O_BINARY);..  
264d0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
264e0 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b  mode_t openMode;
264f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26500 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   Permissions to 
26510 63 72 65 61 74 65 20 66 69 6c 65 20 77 69 74 68  create file with
26520 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 69 6e   */.    rc = fin
26530 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28  dCreateFileMode(
26540 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f  zName, flags, &o
26550 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 69 66  penMode);.    if
26560 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26570 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
26580 20 21 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a   !p->pUnused );.
26590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
265a0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
265b0 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  _WAL || eType==S
265c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
265d0 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20  JOURNAL );.     
265e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
265f0 7d 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28  }.    fd = open(
26600 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
26610 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20  , openMode);.   
26620 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58   OSTRACE(("OPENX
26630 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e     %-3d %s 0%o\n
26640 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70  ", fd, zName, op
26650 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 69  enFlags));.    i
26660 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f  f( fd<0 && errno
26670 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65  !=EISDIR && isRe
26680 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78  adWrite && !isEx
26690 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20  clusive ){.     
266a0 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70   /* Failed to op
266b0 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  en the file for 
266c0 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
266d0 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79  s. Try read-only
266e0 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73  . */.      flags
266f0 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45   &= ~(SQLITE_OPE
26700 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
26710 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
26720 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
26730 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43   &= ~(O_RDWR|O_C
26740 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61  REAT);.      fla
26750 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
26760 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
26770 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
26780 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 66  _RDONLY;.      f
26790 64 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  d = open(zName, 
267a0 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d  openFlags, openM
267b0 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ode);.    }.    
267c0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
267d0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
267e0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
267f0 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
26800 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
26810 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
26820 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ed;.    }.  }.  
26830 61 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b  assert( fd>=0 );
26840 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73  .  if( pOutFlags
26850 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61   ){.    *pOutFla
26860 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a  gs = flags;.  }.
26870 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65  .  if( p->pUnuse
26880 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75  d ){.    p->pUnu
26890 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  sed->fd = fd;.  
268a0 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c    p->pUnused->fl
268b0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
268c0 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65  ..  if( isDelete
268d0 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   ){.#if OS_VXWOR
268e0 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a  KS.    zPath = z
268f0 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Name;.#else.    
26900 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23  unlink(zName);.#
26910 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51  endif.  }.#if SQ
26920 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
26930 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65  ING_STYLE.  else
26940 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61  {.    p->openFla
26950 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
26960 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
26970 28 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  ( isOpenDirector
26980 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70  y ){.    rc = op
26990 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74  enDirectory(zPat
269a0 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20  h, &dirfd);.    
269b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
269c0 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74  K ){.      /* It
269d0 20 69 73 20 73 61 66 65 20 74 6f 20 63 6c 6f 73   is safe to clos
269e0 65 20 66 64 20 61 74 20 74 68 69 73 20 70 6f 69  e fd at this poi
269f0 6e 74 2c 20 62 65 63 61 75 73 65 20 69 74 20 69  nt, because it i
26a00 73 20 67 75 61 72 61 6e 74 65 65 64 20 6e 6f 74  s guaranteed not
26a10 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  .      ** to be 
26a20 6f 70 65 6e 20 6f 6e 20 61 20 64 61 74 61 62 61  open on a databa
26a30 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 77  se file. If it w
26a40 65 72 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61  ere open on a da
26a50 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 20 20 20  tabase file,.   
26a60 20 20 20 2a 2a 20 69 74 20 77 6f 75 6c 64 20 6e     ** it would n
26a70 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20 63 6c  ot be safe to cl
26a80 6f 73 65 20 61 73 20 74 68 69 73 20 77 6f 75 6c  ose as this woul
26a90 64 20 72 65 6c 65 61 73 65 20 61 6e 79 20 6c 6f  d release any lo
26aa0 63 6b 73 20 68 65 6c 64 0a 20 20 20 20 20 20 2a  cks held.      *
26ab0 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 62 79  * on the file by
26ac0 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 20 20   this process.  
26ad0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
26ae0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
26af0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20  PEN_MAIN_DB );. 
26b00 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20       close(fd); 
26b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
26b20 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20  ilently leak if 
26b30 66 61 69 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e  fail, already in
26b40 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
26b50 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
26b60 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  ed;.    }.  }..#
26b70 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43  ifdef FD_CLOEXEC
26b80 0a 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53  .  fcntl(fd, F_S
26b90 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20  ETFD, fcntl(fd, 
26ba0 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44  F_GETFD, 0) | FD
26bb0 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69  _CLOEXEC);.#endi
26bc0 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54  f..  noLock = eT
26bd0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
26be0 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69  _MAIN_DB;..  .#i
26bf0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
26c00 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  E__) || SQLITE_E
26c10 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
26c20 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74 61  YLE.  struct sta
26c30 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 69 66  tfs fsInfo;.  if
26c40 28 20 66 73 74 61 74 66 73 28 66 64 2c 20 26 66  ( fstatfs(fd, &f
26c50 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a  sInfo) == -1 ){.
26c60 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
26c70 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e  pFile)->lastErrn
26c80 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  o = errno;.    i
26c90 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  f( dirfd>=0 ) cl
26ca0 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73  ose(dirfd); /* s
26cb0 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20  ilently leak if 
26cc0 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a  fail, in error *
26cd0 2f 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b  /.    close(fd);
26ce0 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61   /* silently lea
26cf0 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72  k if fail, in er
26d00 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
26d10 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
26d20 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20  CCESS;.  }.  if 
26d30 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d  (0 == strncmp("m
26d40 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f  sdos", fsInfo.f_
26d50 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20  fstypename, 5)) 
26d60 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
26d70 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
26d80 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
26d90 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20  AGS_IS_MSDOS;.  
26da0 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69 66 20  }.#endif.  .#if 
26db0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
26dc0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20  CKING_STYLE.#if 
26dd0 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
26de0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73  OXY_LOCKING.  is
26df0 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23  AutoProxy = 1;.#
26e00 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41 75  endif.  if( isAu
26e10 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74  toProxy && (zPat
26e20 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f  h!=NULL) && (!no
26e30 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78  Lock) && pVfs->x
26e40 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  Open ){.    char
26e50 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74   *envforce = get
26e60 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43  env("SQLITE_FORC
26e70 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22  E_PROXY_LOCKING"
26e80 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72  );.    int usePr
26e90 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  oxy = 0;..    /*
26ea0 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
26eb0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d  OXY_LOCKING==1 m
26ec0 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79  eans force alway
26ed0 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d  s use proxy, 0 m
26ee0 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76  eans .    ** nev
26ef0 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55  er use proxy, NU
26f00 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f  LL means use pro
26f10 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c  xy for non-local
26f20 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f   files only.  */
26f30 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63  .    if( envforc
26f40 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  e!=NULL ){.     
26f50 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69   useProxy = atoi
26f60 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20  (envforce)>0;.  
26f70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
26f80 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
26f90 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 73  nfo;.      if( s
26fa0 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73  tatfs(zPath, &fs
26fb0 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
26fc0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65         /* In the
26fd0 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66  ory, the close(f
26fe0 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f  d) call is sub-o
26ff0 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66  ptimal. If the f
27000 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20  ile opened.     
27010 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73     ** with fd is
27020 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
27030 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
27040 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
27050 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  s open.        *
27060 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74  * on that file t
27070 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
27080 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f  y holding adviso
27090 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a  ry locks on it,.
270a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
270b0 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73  the call to clos
270c0 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20  e() will cancel 
270d0 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20  those locks. In 
270e0 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20  practice,.      
270f0 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d    ** we're assum
27100 69 6e 67 20 74 68 61 74 20 73 74 61 74 66 73 28  ing that statfs(
27110 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76  ) doesn't fail v
27120 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65  ery often. At le
27130 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  ast.        ** n
27140 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66  ot while other f
27150 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
27160 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73 61  opened by the sa
27170 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20  me process on.  
27180 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d        ** the sam
27190 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69  e file are worki
271a0 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ng.  */.        
271b0 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  p->lastErrno = e
271c0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66  rrno;.        if
271d0 28 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20  ( dirfd>=0 ){.  
271e0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 64 69          close(di
271f0 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c  rfd); /* silentl
27200 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20  y leak if fail, 
27210 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  in error */.    
27220 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6c      }.        cl
27230 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65  ose(fd); /* sile
27240 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69  ntly leak if fai
27250 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  l, in error */. 
27260 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
27270 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
27280 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  .        goto op
27290 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
272a0 20 20 20 7d 0a 20 20 20 20 20 20 75 73 65 50 72     }.      usePr
272b0 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66  oxy = !(fsInfo.f
272c0 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c  _flags&MNT_LOCAL
272d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
272e0 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20   useProxy ){.   
272f0 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e     rc = fillInUn
27300 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c  ixFile(pVfs, fd,
27310 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a   dirfd, pFile, z
27320 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73  Path, noLock, is
27330 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 69  Delete);.      i
27340 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27350 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27360 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
27370 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c  nixFile((unixFil
27380 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f  e*)pFile, ":auto
27390 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  :");.        if(
273a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
273b0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  {.          /* U
273c0 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20  se unixClose to 
273d0 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65 73  clean up the res
273e0 6f 75 72 63 65 73 20 61 64 64 65 64 20 69 6e 20  ources added in 
273f0 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a  fillInUnixFile .
27400 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
27410 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73   clear all the s
27420 74 72 75 63 74 75 72 65 27 73 20 72 65 66 65 72  tructure's refer
27430 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66 69 63  ences.  Specific
27440 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20  ally, .         
27450 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68   ** pFile->pMeth
27460 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ods will be NULL
27470 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f   so sqlite3OsClo
27480 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d  se will be a no-
27490 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  op .          */
274a0 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 43  .          unixC
274b0 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  lose(pFile);.   
274c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
274d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
274e0 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f    }.      goto o
274f0 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  pen_finished;.  
27500 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
27510 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55   .  rc = fillInU
27520 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64  nixFile(pVfs, fd
27530 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c 20  , dirfd, pFile, 
27540 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69  zPath, noLock, i
27550 73 44 65 6c 65 74 65 29 3b 0a 6f 70 65 6e 5f 66  sDelete);.open_f
27560 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72  inished:.  if( r
27570 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27580 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27590 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20  (p->pUnused);.  
275a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
275b0 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  .../*.** Delete 
275c0 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74  the file at zPat
275d0 68 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e  h. If the dirSyn
275e0 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72  c argument is tr
275f0 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74  ue, fsync().** t
27600 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  he directory aft
27610 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
27620 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
27630 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a  int unixDelete(.
27640 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e    sqlite3_vfs *N
27650 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56  otUsed,     /* V
27660 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  FS containing th
27670 69 73 20 61 73 20 74 68 65 20 78 44 65 6c 65 74  is as the xDelet
27680 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  e method */.  co
27690 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
276a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
276b0 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  of file to be de
276c0 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  leted */.  int d
276d0 69 72 53 79 6e 63 20 20 20 20 20 20 20 20 20 20  irSync          
276e0 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
276f0 20 66 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f   fsync() directo
27700 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e  ry after deletin
27710 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  g file */.){.  i
27720 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
27730 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  K;.  UNUSED_PARA
27740 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
27750 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
27760 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
27770 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20  IOERR_DELETE);. 
27780 20 69 66 28 20 75 6e 6c 69 6e 6b 28 7a 50 61 74   if( unlink(zPat
27790 68 29 3d 3d 28 2d 31 29 20 26 26 20 65 72 72 6e  h)==(-1) && errn
277a0 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20  o!=ENOENT ){.   
277b0 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
277c0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
277d0 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e  R_DELETE, "unlin
277e0 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  k", zPath);.  }.
277f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
27800 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20  ISABLE_DIRSYNC. 
27810 20 69 66 28 20 64 69 72 53 79 6e 63 20 29 7b 0a   if( dirSync ){.
27820 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20      int fd;.    
27830 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f  rc = openDirecto
27840 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a  ry(zPath, &fd);.
27850 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
27860 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f  TE_OK ){.#if OS_
27870 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66  VXWORKS.      if
27880 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20  ( fsync(fd)==-1 
27890 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66  ).#else.      if
278a0 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65  ( fsync(fd) ).#e
278b0 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
278c0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
278d0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
278e0 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22  ERR_DIR_FSYNC, "
278f0 66 73 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a  fsync", zPath);.
27900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
27910 28 20 63 6c 6f 73 65 28 66 64 29 26 26 21 72 63  ( close(fd)&&!rc
27920 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27930 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
27940 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43  LITE_IOERR_DIR_C
27950 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 20 7a  LOSE, "close", z
27960 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
27970 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
27980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27990 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65  /*.** Test the e
279a0 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72 20 61  xistance of or a
279b0 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
279c0 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e  s of file zPath.
279d0 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72   The.** test per
279e0 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f  formed depends o
279f0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66  n the value of f
27a00 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
27a10 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
27a20 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69  ISTS: Return 1 i
27a30 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
27a40 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  s.**     SQLITE_
27a50 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
27a60 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
27a70 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61  e file is read a
27a80 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20  nd writable..** 
27a90 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
27aa0 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75  S_READONLY: Retu
27ab0 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
27ac0 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a   is readable..**
27ad0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65  .** Otherwise re
27ae0 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
27af0 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73  c int unixAccess
27b00 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
27b10 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54  *NotUsed,   /* T
27b20 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  he VFS containin
27b30 67 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d  g this xAccess m
27b40 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
27b50 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
27b60 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68     /* Path of th
27b70 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e  e file to examin
27b80 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
27b90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
27ba0 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e  * What do we wan
27bb0 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74  t to learn about
27bc0 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f   the zPath file?
27bd0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
27be0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ut            /*
27bf0 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f   Write result bo
27c00 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  olean here */.){
27c10 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30  .  int amode = 0
27c20 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
27c30 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
27c40 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
27c50 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
27c60 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b  IOERR_ACCESS; );
27c70 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73  .  switch( flags
27c80 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
27c90 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
27ca0 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d  S:.      amode =
27cb0 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65   F_OK;.      bre
27cc0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
27cd0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
27ce0 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64  RITE:.      amod
27cf0 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20  e = W_OK|R_OK;. 
27d00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27d10 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
27d20 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20 61  SS_READ:.      a
27d30 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20  mode = R_OK;.   
27d40 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64     break;..    d
27d50 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
27d60 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66  sert(!"Invalid f
27d70 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b  lags argument");
27d80 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
27d90 3d 20 28 61 63 63 65 73 73 28 7a 50 61 74 68 2c  = (access(zPath,
27da0 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 69   amode)==0);.  i
27db0 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  f( flags==SQLITE
27dc0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 26  _ACCESS_EXISTS &
27dd0 26 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20 20  & *pResOut ){.  
27de0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
27df0 66 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74  f;.    if( 0==st
27e00 61 74 28 7a 50 61 74 68 2c 20 26 62 75 66 29 20  at(zPath, &buf) 
27e10 26 26 20 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  && buf.st_size==
27e20 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 ){.      *pRes
27e30 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Out = 0;.    }. 
27e40 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
27e50 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
27e60 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65   Turn a relative
27e70 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61   pathname into a
27e80 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20   full pathname. 
27e90 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  The relative pat
27ea0 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61  h.** is stored a
27eb0 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  s a nul-terminat
27ec0 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65  ed string in the
27ed0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
27ee0 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20  to by.** zPath. 
27ef0 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e  .**.** zOut poin
27f00 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  ts to a buffer o
27f10 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74  f at least sqlit
27f20 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
27f30 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20  e bytes .** (in 
27f40 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50  this case, MAX_P
27f50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20  ATHNAME bytes). 
27f60 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73  The full-path is
27f70 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74   written to.** t
27f80 68 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72  his buffer befor
27f90 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
27fa0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
27fb0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73  ullPathname(.  s
27fc0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
27fd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
27fe0 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
27ff0 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
28000 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
28010 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73           /* Poss
28020 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e  ibly relative in
28030 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e  put path */.  in
28040 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20  t nOut,         
28050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
28060 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75  ize of output bu
28070 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffer in bytes */
28080 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20  .  char *zOut   
28090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280a0 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
280b0 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74  r */.){..  /* It
280c0 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
280d0 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
280e0 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
280f0 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
28100 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
28110 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
28120 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
28130 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
28140 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
28150 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73  on failing. This
28160 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20   function could 
28170 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61  fail if, for exa
28180 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63  mple, the.  ** c
28190 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64  urrent working d
281a0 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
281b0 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f  n unlinked..  */
281c0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
281d0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
281e0 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73  E_ERROR );..  as
281f0 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61  sert( pVfs->mxPa
28200 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48  thname==MAX_PATH
28210 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44  NAME );.  UNUSED
28220 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
28230 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31  ;..  zOut[nOut-1
28240 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28 20  ] = '\0';.  if( 
28250 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b  zPath[0]=='/' ){
28260 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
28270 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74  rintf(nOut, zOut
28280 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a  , "%s", zPath);.
28290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
282a0 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20 67   nCwd;.    if( g
282b0 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74  etcwd(zOut, nOut
282c0 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
282d0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
282e0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
282f0 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77  PEN_BKPT, "getcw
28300 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  d", zPath);.    
28310 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e  }.    nCwd = (in
28320 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a  t)strlen(zOut);.
28330 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
28340 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20  intf(nOut-nCwd, 
28350 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25  &zOut[nCwd], "/%
28360 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  s", zPath);.  }.
28370 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28380 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  OK;.}...#ifndef 
28390 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
283a0 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a  _EXTENSION./*.**
283b0 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
283c0 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
283d0 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
283e0 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
283f0 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
28400 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
28410 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
28420 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
28430 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e  #include <dlfcn.
28440 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  h>.static void *
28450 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74  unixDlOpen(sqlit
28460 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
28470 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
28480 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45  lename){.  UNUSE
28490 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
284a0 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64  sed);.  return d
284b0 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  lopen(zFilename,
284c0 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44   RTLD_NOW | RTLD
284d0 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a  _GLOBAL);.}../*.
284e0 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20  ** SQLite calls 
284f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d  this function im
28500 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
28510 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c  a call to unixDl
28520 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78  Sym() or.** unix
28530 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28  DlOpen() fails (
28540 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70  returns a null p
28550 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f  ointer). If a mo
28560 72 65 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f  re detailed erro
28570 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20  r.** message is 
28580 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73  available, it is
28590 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66   written to zBuf
285a0 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  Out. If no error
285b0 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61   message.** is a
285c0 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75  vailable, zBufOu
285d0 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69  t is left unmodi
285e0 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20  fied and SQLite 
285f0 75 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a  uses a default.*
28600 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  * error message.
28610 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28620 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69  unixDlError(sqli
28630 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
28640 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
28650 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f   *zBufOut){.  co
28660 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  nst char *zErr;.
28670 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
28680 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75  ER(NotUsed);.  u
28690 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
286a0 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f  .  zErr = dlerro
286b0 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20  r();.  if( zErr 
286c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
286d0 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
286e0 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72  ufOut, "%s", zEr
286f0 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  r);.  }.  unixLe
28700 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74  aveMutex();.}.st
28710 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78  atic void (*unix
28720 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66  DlSym(sqlite3_vf
28730 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64  s *NotUsed, void
28740 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a   *p, const char*
28750 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20  zSym))(void){.  
28760 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74  /* .  ** GCC wit
28770 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f  h -pedantic-erro
28780 72 73 20 73 61 79 73 20 74 68 61 74 20 43 39 30  rs says that C90
28790 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20   does not allow 
287a0 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20  a void* to be.  
287b0 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70  ** cast into a p
287c0 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
287d0 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74  tion.  And yet t
287e0 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d  he library dlsym
287f0 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20  () routine.  ** 
28800 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20  returns a void* 
28810 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
28820 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
28830 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77  unction.  So how
28840 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20   do we.  ** use 
28850 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65  dlsym() with -pe
28860 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20  dantic-errors?. 
28870 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c   **.  ** Variabl
28880 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66  e x below is def
28890 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69  ined to be a poi
288a0 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
288b0 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70  on taking.  ** p
288c0 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20  arameters void* 
288d0 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20  and const char* 
288e0 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20  and returning a 
288f0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
28900 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69  ction..  ** We i
28910 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61  nitialize x by a
28920 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f  ssigning it a po
28930 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73  inter to the dls
28940 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  ym() function.. 
28950 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e   ** (That assign
28960 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20 61 20  ment requires a 
28970 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20  cast.)  Then we 
28980 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f  call the functio
28990 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f  n that.  ** x po
289a0 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a  ints to.  .  **.
289b0 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61    ** This work-a
289c0 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c  round is unlikel
289d0 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63  y to work correc
289e0 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65  tly on any syste
289f0 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75  m where.  ** you
28a00 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63   really cannot c
28a10 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  ast a function p
28a20 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64  ointer into void
28a30 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e  *.  But then, on
28a40 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20   the.  ** other 
28a50 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69  hand, dlsym() wi
28a60 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73  ll not work on s
28a70 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69 74  uch a system eit
28a80 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a  her, so we have.
28a90 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20    ** not really 
28aa0 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20  lost anything.. 
28ab0 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78   */.  void (*(*x
28ac0 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
28ad0 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55  ar*))(void);.  U
28ae0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
28af0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20  NotUsed);.  x = 
28b00 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a  (void(*(*)(void*
28b10 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76  ,const char*))(v
28b20 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65  oid))dlsym;.  re
28b30 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79  turn (*x)(p, zSy
28b40 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  m);.}.static voi
28b50 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71  d unixDlClose(sq
28b60 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
28b70 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c  ed, void *pHandl
28b80 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
28b90 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
28ba0 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64  .  dlclose(pHand
28bb0 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20  le);.}.#else /* 
28bc0 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  if SQLITE_OMIT_L
28bd0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73  OAD_EXTENSION is
28be0 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23   defined: */.  #
28bf0 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65  define unixDlOpe
28c00 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75  n  0.  #define u
28c10 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23  nixDlError 0.  #
28c20 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d  define unixDlSym
28c30 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75     0.  #define u
28c40 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e  nixDlClose 0.#en
28c50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
28c60 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72   nBuf bytes of r
28c70 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68  andom data to th
28c80 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65  e supplied buffe
28c90 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  r zBuf..*/.stati
28ca0 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d  c int unixRandom
28cb0 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  ness(sqlite3_vfs
28cc0 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e   *NotUsed, int n
28cd0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
28ce0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
28cf0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
28d00 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29   assert((size_t)
28d10 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69  nBuf>=(sizeof(ti
28d20 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74  me_t)+sizeof(int
28d30 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61  )));..  /* We ha
28d40 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ve to initialize
28d50 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74   zBuf to prevent
28d60 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72   valgrind from r
28d70 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72  eporting.  ** er
28d80 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72  rors.  The repor
28d90 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61 6c  ts issued by val
28da0 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72  grind are incorr
28db0 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20  ect - we would. 
28dc0 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74 20   ** prefer that 
28dd0 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62  the randomness b
28de0 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d  e increased by m
28df0 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65  aking use of the
28e00 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69  .  ** uninitiali
28e10 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75  zed space in zBu
28e20 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64  f - but valgrind
28e30 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20   errors tend to 
28e40 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20  worry.  ** some 
28e50 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20 74  users.  Rather t
28e60 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65  han argue, it se
28e70 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74 20  ems easier just 
28e80 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20  to initialize.  
28e90 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72  ** the whole arr
28ea0 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76  ay and silence v
28eb0 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66  algrind, even if
28ec0 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73   that means less
28ed0 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a   randomness.  **
28ee0 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73   in the random s
28ef0 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  eed..  **.  ** W
28f00 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69  hen testing, ini
28f10 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d  tializing zBuf[]
28f20 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20   to zero is all 
28f30 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61  we do.  That mea
28f40 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20  ns.  ** that we 
28f50 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 73  always use the s
28f60 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  ame random numbe
28f70 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69  r sequence.  Thi
28f80 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a  s makes the.  **
28f90 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62 6c   tests repeatabl
28fa0 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  e..  */.  memset
28fb0 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b  (zBuf, 0, nBuf);
28fc0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
28fd0 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20  LITE_TEST).  {. 
28fe0 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a     int pid, fd;.
28ff0 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f      fd = open("/
29000 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f  dev/urandom", O_
29010 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28  RDONLY);.    if(
29020 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74   fd<0 ){.      t
29030 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74  ime_t t;.      t
29040 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d  ime(&t);.      m
29050 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20  emcpy(zBuf, &t, 
29060 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20  sizeof(t));.    
29070 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28 29    pid = getpid()
29080 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
29090 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c  zBuf[sizeof(t)],
290a0 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69   &pid, sizeof(pi
290b0 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d));.      asser
290c0 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a  t( sizeof(t)+siz
290d0 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f  eof(pid)<=(size_
290e0 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20  t)nBuf );.      
290f0 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29  nBuf = sizeof(t)
29100 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a   + sizeof(pid);.
29110 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29120 20 6e 42 75 66 20 3d 20 72 65 61 64 28 66 64 2c   nBuf = read(fd,
29130 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20   zBuf, nBuf);.  
29140 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20      close(fd);. 
29150 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
29160 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d    return nBuf;.}
29170 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  .../*.** Sleep f
29180 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
29190 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
291a0 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
291b0 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75  ept..** The argu
291c0 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62  ment is the numb
291d0 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
291e0 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c  ds we want to sl
291f0 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  eep..** The retu
29200 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
29210 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
29220 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20  econds of sleep 
29230 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75  actually.** requ
29240 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75  ested from the u
29250 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74  nderlying operat
29260 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75  ing system, a nu
29270 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69  mber which.** mi
29280 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ght be greater t
29290 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
292a0 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75  the argument, bu
292b0 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68  t not less.** th
292c0 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  an the argument.
292d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
292e0 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33  nixSleep(sqlite3
292f0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
29300 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29  nt microseconds)
29310 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
29320 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
29330 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f  ec sp;..  sp.tv_
29340 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e  sec = microsecon
29350 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20 20  ds / 1000000;.  
29360 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69  sp.tv_nsec = (mi
29370 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 30  croseconds % 100
29380 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20 20  0000) * 1000;.  
29390 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e  nanosleep(&sp, N
293a0 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ULL);.  UNUSED_P
293b0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
293c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72  );.  return micr
293d0 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20  oseconds;.#elif 
293e0 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
293f0 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
29400 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63  EEP.  usleep(mic
29410 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e  roseconds);.  UN
29420 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
29430 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
29440 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a  n microseconds;.
29450 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f  #else.  int seco
29460 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f  nds = (microseco
29470 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30  nds+999999)/1000
29480 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63  000;.  sleep(sec
29490 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  onds);.  UNUSED_
294a0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
294b0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63  d);.  return sec
294c0 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65  onds*1000000;.#e
294d0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
294e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
294f0 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
29500 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
29510 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  , is interpreted
29520 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   as.** the numbe
29530 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e  r of seconds sin
29540 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75  ce 1970 and is u
29550 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72  sed to set the r
29560 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69  esult of.** sqli
29570 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
29580 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  () during testin
29590 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
295a0 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
295b0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
295c0 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20  e = 0;  /* Fake 
295d0 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73  system time in s
295e0 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
295f0 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0. */.#endif../*
29600 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
29610 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
29620 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
29630 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
29640 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a  e into *piNow.**
29650 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
29660 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
29670 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
29680 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30  r times 86_400_0
29690 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72  00.  In.** other
296a0 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e   words, write in
296b0 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75  to *piNow the nu
296c0 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
296d0 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a  onds since the J
296e0 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f  ulian.** epoch o
296f0 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77  f noon in Greenw
29700 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20  ich on November 
29710 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63  24, 4714 B.C acc
29720 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a  ording to the.**
29730 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f   proleptic Grego
29740 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a  rian calendar..*
29750 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
29760 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
29770 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
29780 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
29790 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
297a0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
297b0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71  rentTimeInt64(sq
297c0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
297d0 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ed, sqlite3_int6
297e0 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61  4 *piNow){.  sta
297f0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
29800 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63  3_int64 unixEpoc
29810 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71  h = 24405875*(sq
29820 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
29830 30 30 30 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  000;.#if defined
29840 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69  (NO_GETTOD).  ti
29850 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26  me_t t;.  time(&
29860 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28  t);.  *piNow = (
29870 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74  (sqlite3_int64)t
29880 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70 6f  )*1000 + unixEpo
29890 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57  ch;.#elif OS_VXW
298a0 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69  ORKS.  struct ti
298b0 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63  mespec sNow;.  c
298c0 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f  lock_gettime(CLO
298d0 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e  CK_REALTIME, &sN
298e0 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  ow);.  *piNow = 
298f0 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30  unixEpoch + 1000
29900 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
29910 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e  sNow.tv_sec + sN
29920 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30 30  ow.tv_nsec/10000
29930 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75  00;.#else.  stru
29940 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b  ct timeval sNow;
29950 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28  .  gettimeofday(
29960 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 69  &sNow, 0);.  *pi
29970 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20  Now = unixEpoch 
29980 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  + 1000*(sqlite3_
29990 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65  int64)sNow.tv_se
299a0 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63  c + sNow.tv_usec
299b0 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  /1000;.#endif..#
299c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
299d0 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
299e0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
299f0 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30      *piNow = 100
29a00 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
29a10 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74  )sqlite3_current
29a20 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63  _time + unixEpoc
29a30 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  h;.  }.#endif.  
29a40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
29a50 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
29a60 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
29a70 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
29a80 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
29a90 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
29aa0 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68  Time).  Write th
29ab0 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d  e.** current tim
29ac0 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
29ad0 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
29ae0 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e  r into *prNow an
29af0 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20  d.** return 0.  
29b00 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
29b10 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
29b20 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
29b30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
29b40 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  xCurrentTime(sql
29b50 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
29b60 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77  d, double *prNow
29b70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
29b80 36 34 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50  64 i;.  UNUSED_P
29b90 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
29ba0 29 3b 0a 20 20 75 6e 69 78 43 75 72 72 65 6e 74  );.  unixCurrent
29bb0 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26 69 29  TimeInt64(0, &i)
29bc0 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38  ;.  *prNow = i/8
29bd0 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72 65 74  6400000.0;.  ret
29be0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
29bf0 57 65 20 61 64 64 65 64 20 74 68 65 20 78 47 65  We added the xGe
29c00 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74  tLastError() met
29c10 68 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e 74  hod with the int
29c20 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64  ention of provid
29c30 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f  ing.** better lo
29c40 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65  w-level error me
29c50 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65 72  ssages when oper
29c60 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f  ating-system pro
29c70 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a  blems come up.**
29c80 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f   during SQLite o
29c90 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73  peration.  But s
29ca0 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74  o far, none of t
29cb0 68 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70  hat has been imp
29cc0 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74  lemented.** in t
29cd0 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69  he core.  So thi
29ce0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
29cf0 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20  er called.  For 
29d00 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c  now, it is merel
29d10 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c  y.** a place-hol
29d20 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
29d30 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72  nt unixGetLastEr
29d40 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
29d50 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
29d60 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f  tUsed2, char *No
29d70 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45  tUsed3){.  UNUSE
29d80 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
29d90 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  sed);.  UNUSED_P
29da0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
29db0 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2);.  UNUSED_PAR
29dc0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29  AMETER(NotUsed3)
29dd0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
29de0 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*.***********
29df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
29e00 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
29e10 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
29e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29e30 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
29e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29e80 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
29e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ed0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
29ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ef0 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63   Begin Proxy Loc
29f00 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
29f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f20 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  *****.**.** Prox
29f30 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22  y locking is a "
29f40 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74  uber-locking-met
29f50 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e  hod" in this sen
29f60 73 65 3a 20 20 49 74 20 75 73 65 73 20 74 68 65  se:  It uses the
29f70 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
29f80 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63  g methods on sec
29f90 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65  ondary lock file
29fa0 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  s.  Proxy lockin
29fb0 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c  g is a.** meta-l
29fc0 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66  ayer over top of
29fd0 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c   the primitive l
29fe0 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
29ff0 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a  ed above.  For.*
2a000 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74  * this reason, t
2a010 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74  he division that
2a020 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70   implements of p
2a030 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
2a040 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69  deferred.** unti
2a050 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69  l late in the fi
2a060 6c 65 20 28 68 65 72 65 29 20 61 66 74 65 72 20  le (here) after 
2a070 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72  all of the other
2a080 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76   I/O methods hav
2a090 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65  e.** been define
2a0a0 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20  d - so that the 
2a0b0 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e  primitive lockin
2a0c0 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76  g methods are av
2a0d0 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65  ailable.** as se
2a0e0 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77  rvices to help w
2a0f0 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ith the implemen
2a100 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20  tation of proxy 
2a110 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a  locking..**.****
2a120 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
2a130 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  lt locking schem
2a140 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65  es in SQLite use
2a150 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
2a160 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  s on the.** data
2a170 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f  base file to coo
2a180 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f  rdinate safe, co
2a190 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73 73 20  ncurrent access 
2a1a0 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  by multiple read
2a1b0 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  ers.** and write
2a1c0 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74  rs [http://sqlit
2a1d0 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e  e.org/lockingv3.
2a1e0 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65  html].  The five
2a1f0 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
2a200 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45   states (UNLOCKE
2a210 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52  D, PENDING, SHAR
2a220 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58  ED, RESERVED, EX
2a230 43 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d 70  CLUSIVE) are imp
2a240 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50  lemented.** as P
2a250 4f 53 49 58 20 72 65 61 64 20 26 20 77 72 69 74  OSIX read & writ
2a260 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78  e locks over fix
2a270 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69  ed set of locati
2a280 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c  ons (via fsctl),
2a290 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53  .** on AFP and S
2a2a0 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76  MB only exclusiv
2a2b0 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  e byte-range loc
2a2c0 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ks are available
2a2d0 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69   via fsctl.** wi
2a2e0 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33  th _IOWR('z', 23
2a2f0 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  , struct ByteRan
2a300 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72  geLockPB2) to tr
2a310 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73  ack the same 5 s
2a320 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d  tates..** To sim
2a330 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20  ulate a F_RDLCK 
2a340 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61  on the shared ra
2a350 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61  nge, on AFP a ra
2a360 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a  ndomly selected.
2a370 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74 68  ** address in th
2a380 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69  e shared range i
2a390 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48  s taken for a SH
2a3a0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65  ARED lock, the e
2a3b0 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20  ntire.** shared 
2a3c0 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
2a3d0 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  or an EXCLUSIVE 
2a3e0 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lock):.**.**    
2a3f0 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20    PENDING_BYTE  
2a400 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30        0x40000000
2a410 09 09 20 20 20 09 0a 2a 2a 20 20 20 20 20 20 52  ..   ..**      R
2a420 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20  ESERVED_BYTE    
2a430 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a     0x40000001.**
2a440 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e        SHARED_RAN
2a450 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  GE        0x4000
2a460 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32  0002 -> 0x400002
2a470 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  00.**.** This wo
2a480 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20  rks well on the 
2a490 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
2a4a0 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e  m, but shows a n
2a4b0 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c  early 100x.** sl
2a4c0 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70  owdown in read p
2a4d0 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46  erformance on AF
2a4e0 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41 46  P because the AF
2a4f0 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65  P client disable
2a500 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61  s.** the read ca
2a510 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61  che when byte-ra
2a520 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72  nge locks are pr
2a530 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67  esent.  Enabling
2a540 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63   the read.** cac
2a550 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61 63  he exposes a cac
2a560 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f  he coherency pro
2a570 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72 65  blem that is pre
2a580 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58  sent on all OS X
2a590 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65  .** supported ne
2a5a0 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65  twork file syste
2a5b0 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50  ms.  NFS and AFP
2a5c0 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68   both observe th
2a5d0 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70  e.** close-to-op
2a5e0 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72  en semantics for
2a5f0 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20   ensuring cache 
2a600 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74  coherency.** [ht
2a610 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66  tp://nfs.sourcef
2a620 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38  orge.net/#faq_a8
2a630 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f  ], which does no
2a640 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a  t effectively.**
2a650 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65 71   address the req
2a660 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f  uirements for co
2a670 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73  ncurrent databas
2a680 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  e access by mult
2a690 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20  iple.** readers 
2a6a0 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b  and writers.** [
2a6b0 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c  http://www.nabbl
2a6c0 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d  e.com/SQLite-on-
2a6d0 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65  NFS-cache-cohere
2a6e0 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68  ncy-td15655701.h
2a6f0 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  tml]..**.** To a
2a700 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66 6f  ddress the perfo
2a710 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65  rmance and cache
2a720 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65   coherency issue
2a730 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f  s, proxy file lo
2a740 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  cking.** changes
2a750 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61 73   the way databas
2a760 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74  e access is cont
2a770 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69  rolled by limiti
2a780 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a  ng access to a.*
2a790 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74  * single host at
2a7a0 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69   a time and movi
2a7b0 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66  ng file locks of
2a7c0 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  f of the databas
2a7d0 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e  e file.** and on
2a7e0 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20  to a proxy file 
2a7f0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c  on the local fil
2a800 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a  e system.  .**.*
2a810 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79  *.** Using proxy
2a820 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d   locks.** ------
2a830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
2a840 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20  * C APIs.**.**  
2a850 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
2a860 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
2a870 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
2a880 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20  PROXYFILE,.**   
2a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8a0 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e      <proxy_path>
2a8b0 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a   | ":auto:");.**
2a8c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
2a8d0 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
2a8e0 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  e, SQLITE_GET_LO
2a8f0 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70  CKPROXYFILE, &<p
2a900 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a  roxy_path>);.**.
2a910 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61  **.** SQL pragma
2a920 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20  s.**.**  PRAGMA 
2a930 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f  [database.]lock_
2a940 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78  proxy_file=<prox
2a950 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a  y_path> | :auto:
2a960 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74  .**  PRAGMA [dat
2a970 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  abase.]lock_prox
2a980 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65  y_file.**.** Spe
2a990 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22  cifying ":auto:"
2a9a0 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
2a9b0 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20  here is a conch 
2a9c0 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63  file with a matc
2a9d0 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20  hing.** host ID 
2a9e0 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79  in it, the proxy
2a9f0 20 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e   path in the con
2aa00 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
2aa10 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a  used, otherwise.
2aa20 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68 20  ** a proxy path 
2aa30 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65  based on the use
2aa40 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20  r's temp dir.** 
2aa50 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53  (via confstr(_CS
2aa60 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
2aa70 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c  P_DIR,...)) will
2aa80 20 62 65 20 75 73 65 64 20 61 6e 64 20 74 68 65   be used and the
2aa90 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79  .** actual proxy
2aaa0 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65   file name is ge
2aab0 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
2aac0 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f   name and path o
2aad0 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
2aae0 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61  e file.  For exa
2aaf0 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
2ab00 20 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70    For database p
2ab10 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66  ath "/Users/me/f
2ab20 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20  oo.db" .**      
2ab30 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77   The lock path w
2ab40 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e  ill be "<tmpdir>
2ab50 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55  /sqliteplocks/_U
2ab60 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61  sers_me_foo.db:a
2ab70 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63  uto:").**.** Onc
2ab80 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69  e a lock proxy i
2ab90 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  s configured for
2aba0 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
2abb0 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e  ection, it can n
2abc0 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64  ot.** be removed
2abd0 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79  , however it may
2abe0 20 62 65 20 73 77 69 74 63 68 65 64 20 74 6f 20   be switched to 
2abf0 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78  a different prox
2ac00 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68  y path via.** th
2ac10 65 20 61 62 6f 76 65 20 41 50 49 73 20 28 61 73  e above APIs (as
2ac20 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68  suming the conch
2ac30 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69   file is not bei
2ac40 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  ng held by anoth
2ac50 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  er.** connection
2ac60 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a   or process). .*
2ac70 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78  *.**.** How prox
2ac80 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a  y locking works.
2ac90 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
2aca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
2acb0 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   Proxy file lock
2acc0 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61  ing relies prima
2acd0 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20  rily on two new 
2ace0 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73  supporting files
2acf0 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f  : .**.**   *  co
2ad00 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69  nch file to limi
2ad10 74 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  t access to the 
2ad20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2ad30 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a   a single host.*
2ad40 2a 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65  *      at a time
2ad50 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78  .**.**   *  prox
2ad60 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73  y file to act as
2ad70 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65   a proxy for the
2ad80 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
2ad90 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20  normally.**     
2ada0 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61   taken on the da
2adb0 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65  tabase.**.** The
2adc0 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f   conch file - to
2add0 20 75 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c   use a proxy fil
2ade0 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66  e, sqlite must f
2adf0 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63  irst "hold the c
2ae00 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69  onch".** by taki
2ae10 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79  ng an sqlite-sty
2ae20 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f  le shared lock o
2ae30 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
2ae40 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a  , reading the.**
2ae50 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f   contents and co
2ae60 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74  mparing the host
2ae70 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49  's unique host I
2ae80 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e  D (see below) an
2ae90 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20  d lock.** proxy 
2aea0 70 61 74 68 20 61 67 61 69 6e 73 74 20 74 68 65  path against the
2aeb0 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
2aec0 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68  n the conch.  Th
2aed0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a  e conch file is.
2aee0 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
2aef0 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
2af00 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  as the database 
2af10 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
2af20 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74  e name.** is pat
2af30 74 65 72 6e 65 64 20 61 66 74 65 72 20 74 68 65  terned after the
2af40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
2af50 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61  ame as ".<databa
2af60 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a  sename>-conch"..
2af70 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20  ** If the conch 
2af80 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
2af90 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e  ist, or it's con
2afa0 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  tents do not mat
2afb0 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49  ch the.** host I
2afc0 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70  D and/or proxy p
2afd0 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  ath, then the lo
2afe0 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64 20  ck is escalated 
2aff0 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a  to an exclusive.
2b000 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20  ** lock and the 
2b010 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65  conch file conte
2b020 6e 74 73 20 69 73 20 75 70 64 61 74 65 64 20 77  nts is updated w
2b030 69 74 68 20 74 68 65 20 68 6f 73 74 20 49 44 20  ith the host ID 
2b040 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74  and proxy.** pat
2b050 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69  h and the lock i
2b060 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  s downgraded to 
2b070 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67  a shared lock ag
2b080 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e  ain.  If the con
2b090 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79  ch.** is held by
2b0a0 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
2b0b0 20 28 77 69 74 68 20 61 20 73 68 61 72 65 64 20   (with a shared 
2b0c0 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75  lock), the exclu
2b0d0 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c  sive lock.** wil
2b0e0 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54  l fail and SQLIT
2b0f0 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
2b100 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
2b110 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e  oxy file - a sin
2b120 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73  gle-byte file us
2b130 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73  ed for all advis
2b140 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a  ory file locks.*
2b150 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e  * normally taken
2b160 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2b170 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c   file.   This al
2b180 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73 68  lows for safe sh
2b190 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20  aring.** of the 
2b1a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
2b1b0 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65  r multiple reade
2b1c0 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f  rs and writers o
2b1d0 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f  n the same.** ho
2b1e0 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e  st (the conch en
2b1f0 73 75 72 65 73 20 74 68 61 74 20 74 68 65 79 20  sures that they 
2b200 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65  all use the same
2b210 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65   local lock file
2b220 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74  )..**.** Request
2b230 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f  ing the lock pro
2b240 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65  xy does not imme
2b250 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65  diately take the
2b260 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a   conch, it is.**
2b270 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e   only taken when
2b280 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 65   the first reque
2b290 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62  st to lock datab
2b2a0 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65  ase file is made
2b2b0 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63  .  .** This matc
2b2c0 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63  hes the semantic
2b2d0 73 20 6f 66 20 74 68 65 20 74 72 61 64 69 74 69  s of the traditi
2b2e0 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68  onal locking beh
2b2f0 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20  avior, where.** 
2b300 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63  opening a connec
2b310 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61  tion to a databa
2b320 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  se file does not
2b330 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20   take a lock on 
2b340 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65  it..** The share
2b350 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70  d lock and an op
2b360 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
2b370 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65  or are maintaine
2b380 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20  d until .** the 
2b390 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
2b3a0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6c  e database is cl
2b3b0 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  osed. .**.** The
2b3c0 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20   proxy file and 
2b3d0 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72  the lock file ar
2b3e0 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20  e never deleted 
2b3f0 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65  so they only nee
2b400 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74  d.** to be creat
2b410 65 64 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ed the first tim
2b420 65 20 74 68 65 79 20 61 72 65 20 75 73 65 64 2e  e they are used.
2b430 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61  .**.** Configura
2b440 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20  tion options.** 
2b450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b460 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c  -----.**.**  SQL
2b470 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
2b480 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20  _LOCKING.**.**  
2b490 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2b4a0 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20  les accessed on 
2b4b0 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73  non-local file s
2b4c0 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20  ystems are.**   
2b4d0 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c      automaticall
2b4e0 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  y configured for
2b4f0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20   proxy locking, 
2b500 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a  lock files are.*
2b510 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75  *       named au
2b520 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e  tomatically usin
2b530 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63  g the same logic
2b540 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41   as.**       PRA
2b550 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  GMA lock_proxy_f
2b560 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20  ile=":auto:".** 
2b570 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50     .**  SQLITE_P
2b580 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a  ROXY_DEBUG.**.**
2b590 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74         Enables t
2b5a0 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72  he logging of er
2b5b0 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75 72  ror messages dur
2b5c0 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65  ing host id file
2b5d0 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69 65  .**       retrie
2b5e0 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e  val and creation
2b5f0 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58  .**.**  LOCKPROX
2b600 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  YDIR.**.**      
2b610 20 4f 76 65 72 72 69 64 65 73 20 74 68 65 20 64   Overrides the d
2b620 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79  efault directory
2b630 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70   used for lock p
2b640 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a  roxy files that.
2b650 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d  **       are nam
2b660 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
2b670 20 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a   via the ":auto:
2b680 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20  " setting.**.** 
2b690 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2b6a0 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
2b6b0 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  IONS.**.**      
2b6c0 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   Permissions to 
2b6d0 75 73 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  use when creatin
2b6e0 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f  g a directory fo
2b6f0 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a  r storing the.**
2b700 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78         lock prox
2b710 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73  y files, only us
2b720 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58  ed when LOCKPROX
2b730 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e  YDIR is not set.
2b740 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a  .**    .**    .*
2b750 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61  * As mentioned a
2b760 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69  bove, when compi
2b770 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f  led with SQLITE_
2b780 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
2b790 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67  KING,.** setting
2b7a0 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74   the environment
2b7b0 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45   variable SQLITE
2b7c0 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
2b7d0 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a  KING to 1 will.*
2b7e0 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f  * force proxy lo
2b7f0 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64  cking to be used
2b800 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 62   for every datab
2b810 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c  ase file opened,
2b820 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66   and 0.** will f
2b830 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70  orce automatic p
2b840 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20  roxy locking to 
2b850 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20  be disabled for 
2b860 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  all database.** 
2b870 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74 79  files (explicity
2b880 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c   calling the SQL
2b890 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
2b8a0 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a  YFILE pragma or.
2b8b0 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63  ** sqlite_file_c
2b8c0 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f  ontrol API is no
2b8d0 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53 51  t affected by SQ
2b8e0 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
2b8f0 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f  _LOCKING)..*/../
2b900 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69  *.** Proxy locki
2b910 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ng is only avail
2b920 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a  able on MacOSX .
2b930 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
2b940 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2b950 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2b960 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20  NG_STYLE../*.** 
2b970 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  The proxyLocking
2b980 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65 20  Context has the 
2b990 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74  path and file st
2b9a0 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68 65  ructures for the
2b9b0 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20   remote .** and 
2b9c0 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65  local proxy file
2b9d0 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64  s in it.*/.typed
2b9e0 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c  ef struct proxyL
2b9f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72  ockingContext pr
2ba00 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2ba10 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c  t;.struct proxyL
2ba20 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
2ba30 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
2ba40 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f  hFile;         /
2ba50 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c  * Open conch fil
2ba60 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e  e */.  char *con
2ba70 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20  chFilePath;     
2ba80 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2ba90 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  he conch file */
2baa0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63  .  unixFile *loc
2bab0 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20  kProxy;         
2bac0 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f  /* Open proxy lo
2bad0 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ck file */.  cha
2bae0 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  r *lockProxyPath
2baf0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ;         /* Nam
2bb00 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c  e of the proxy l
2bb10 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
2bb20 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20  ar *dbPath;     
2bb30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
2bb40 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  me of the open f
2bb50 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e  ile */.  int con
2bb60 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20  chHeld;         
2bb70 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68        /* 1 if th
2bb80 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c  e conch is held,
2bb90 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20   -1 if lockless 
2bba0 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f  */.  void *oldLo
2bbb0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20  ckingContext;   
2bbc0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f    /* Original lo
2bbd0 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20  ckingcontext to 
2bbe0 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65  restore on close
2bbf0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f   */.  sqlite3_io
2bc00 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a  _methods const *
2bc10 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20  pOldMethod;     
2bc20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20  /* Original I/O 
2bc30 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73  methods for clos
2bc40 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20  e */.};../* .** 
2bc50 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  The proxy lock f
2bc60 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68 65  ile path for the
2bc70 20 64 61 74 61 62 61 73 65 20 61 74 20 64 62 50   database at dbP
2bc80 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 69  ath is written i
2bc90 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77  nto lPath, .** w
2bca0 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74 20  hich must point 
2bcb0 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61 62  to valid, writab
2bcc0 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20  le memory large 
2bcd0 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61 78  enough for a max
2bce0 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69  Len length.** fi
2bcf0 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61  le path. .*/.sta
2bd00 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
2bd10 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
2bd20 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61  har *dbPath, cha
2bd30 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74  r *lPath, size_t
2bd40 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20   maxLen){.  int 
2bd50 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e  len;.  int dbLen
2bd60 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64  ;.  int i;..#ifd
2bd70 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a  ef LOCKPROXYDIR.
2bd80 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28    len = strlcpy(
2bd90 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59  lPath, LOCKPROXY
2bda0 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65  DIR, maxLen);.#e
2bdb0 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f  lse.# ifdef _CS_
2bdc0 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
2bdd0 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66 28  _DIR.  {.    if(
2bde0 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41   !confstr(_CS_DA
2bdf0 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
2be00 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65  IR, lPath, maxLe
2be10 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  n) ){.      OSTR
2be20 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54  ACE(("GETLOCKPAT
2be30 48 20 20 66 61 69 6c 65 64 20 25 73 20 65 72 72  H  failed %s err
2be40 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c  no=%d pid=%d\n",
2be50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2be60 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65  lPath, errno, ge
2be70 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20 20  tpid()));.      
2be80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2be90 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  ERR_LOCK;.    }.
2bea0 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61      len = strlca
2beb0 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65  t(lPath, "sqlite
2bec0 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29  plocks", maxLen)
2bed0 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65  ;    .  }.# else
2bee0 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79  .  len = strlcpy
2bef0 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c  (lPath, "/tmp/",
2bf00 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69   maxLen);.# endi
2bf10 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  f.#endif..  if( 
2bf20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f  lPath[len-1]!='/
2bf30 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  ' ){.    len = s
2bf40 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 2f  trlcat(lPath, "/
2bf50 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a  ", maxLen);.  }.
2bf60 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72    .  /* transfor
2bf70 6d 20 74 68 65 20 64 62 20 70 61 74 68 20 74 6f  m the db path to
2bf80 20 61 20 75 6e 69 71 75 65 20 63 61 63 68 65 20   a unique cache 
2bf90 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20  name */.  dbLen 
2bfa0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62  = (int)strlen(db
2bfb0 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d  Path);.  for( i=
2bfc0 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28 69  0; i<dbLen && (i
2bfd0 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78  +len+7)<(int)max
2bfe0 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Len; i++){.    c
2bff0 68 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69  har c = dbPath[i
2c000 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c  ];.    lPath[i+l
2c010 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27  en] = (c=='/')?'
2c020 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74  _':c;.  }.  lPat
2c030 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20  h[i+len]='\0';. 
2c040 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
2c050 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e  ":auto:", maxLen
2c060 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 47  );.  OSTRACE(("G
2c070 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78  ETLOCKPATH  prox
2c080 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
2c090 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c  id=%d\n", lPath,
2c0a0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72   getpid()));.  r
2c0b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2c0c0 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61  .}../* . ** Crea
2c0d0 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  tes the lock fil
2c0e0 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e  e and any missin
2c0f0 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 69 6e  g directories in
2c100 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74   lockPath. */.st
2c110 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
2c120 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e  eateLockPath(con
2c130 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74  st char *lockPat
2c140 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e  h){.  int i, len
2c150 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d 41 58  ;.  char buf[MAX
2c160 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20  PATHLEN];.  int 
2c170 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20  start = 0;.  .  
2c180 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74 68 21  assert(lockPath!
2c190 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79  =NULL);.  /* try
2c1a0 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c 20 74   to create all t
2c1b0 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
2c1c0 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20  directories */. 
2c1d0 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c   len = (int)strl
2c1e0 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20  en(lockPath);.  
2c1f0 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74  buf[0] = lockPat
2c200 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31  h[0];.  for( i=1
2c210 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a  ; i<len; i++ ){.
2c220 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74 68      if( lockPath
2c230 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28 69  [i] == '/' && (i
2c240 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29 7b   - start > 0) ){
2c250 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d  .      /* only m
2c260 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64 69 72  kdir if leaf dir
2c270 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f   != "." or "/" o
2c280 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20  r ".." */.      
2c290 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c  if( i-start>2 ||
2c2a0 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 26 20   (i-start==1 && 
2c2b0 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e  buf[start] != '.
2c2c0 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  ' && buf[start] 
2c2d0 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20 20 20  != '/') .       
2c2e0 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32    || (i-start==2
2c2f0 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21   && buf[start] !
2c300 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61  = '.' && buf[sta
2c310 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b  rt+1] != '.') ){
2c320 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69 5d 3d  .        buf[i]=
2c330 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66  '\0';.        if
2c340 28 20 6d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c  ( mkdir(buf, SQL
2c350 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
2c360 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
2c370 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
2c380 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20  nt err=errno;.  
2c390 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 21          if( err!
2c3a0 3d 45 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20  =EEXIST ) {.    
2c3b0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
2c3c0 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48  ("CREATELOCKPATH
2c3d0 20 20 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e    FAILED creatin
2c3e0 67 20 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20  g %s, ".        
2c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 27 25               "'%
2c400 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  s' proxy lock pa
2c410 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
2c420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c430 20 20 20 20 20 20 62 75 66 2c 20 73 74 72 65 72        buf, strer
2c440 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61  ror(err), lockPa
2c450 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
2c460 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2c470 72 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20  rn err;.        
2c480 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2c490 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72      }.      star
2c4a0 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  t=i+1;.    }.   
2c4b0 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61   buf[i] = lockPa
2c4c0 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54  th[i];.  }.  OST
2c4d0 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43  RACE(("CREATELOC
2c4e0 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63  KPATH  proxy loc
2c4f0 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
2c500 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67  \n", lockPath, g
2c510 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74  etpid()));.  ret
2c520 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2c530 43 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53  Create a new VFS
2c540 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2c550 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f   (stored in memo
2c560 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
2c570 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
2c580 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65  oc) and open the
2c590 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74   file named "pat
2c5a0 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64  h" in the file d
2c5b0 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
2c5c0 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
2c5d0 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f  esponsible not o
2c5e0 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20  nly for closing 
2c5f0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2c600 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20  tor.** but also 
2c610 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
2c620 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
2c630 64 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  d with the file 
2c640 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73  descriptor..*/.s
2c650 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
2c660 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20  reateUnixFile(. 
2c670 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
2c680 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70  ath,        /* p
2c690 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ath for the new 
2c6a0 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20  unixFile */.    
2c6b0 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c  unixFile **ppFil
2c6c0 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78  e,       /* unix
2c6d0 46 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64  File created and
2c6e0 20 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66   returned by ref
2c6f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f   */.    int islo
2c700 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20  ckfile          
2c710 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20   /* if non zero 
2c720 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c  missing dirs wil
2c730 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  l be created */.
2c740 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ) {.  int fd = -
2c750 31 3b 0a 20 20 69 6e 74 20 64 69 72 66 64 20 3d  1;.  int dirfd =
2c760 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20   -1;.  unixFile 
2c770 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20  *pNew;.  int rc 
2c780 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2c790 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f  nt openFlags = O
2c7a0 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b  _RDWR | O_CREAT;
2c7b0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64  .  sqlite3_vfs d
2c7c0 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74  ummyVfs;.  int t
2c7d0 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69  errno = 0;.  Uni
2c7e0 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
2c7f0 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a  ed = NULL;..  /*
2c800 20 31 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f   1. first try to
2c810 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65   open/create the
2c820 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66   file.  ** 2. if
2c830 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64   that fails, and
2c840 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20   this is a lock 
2c850 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29  file (not-conch)
2c860 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20  , try creating. 
2c870 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64   ** the parent d
2c880 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74  irectories and t
2c890 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20  hen try again.. 
2c8a0 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66   ** 3. if that f
2c8b0 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65  ails, try to ope
2c8c0 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d  n the file read-
2c8d0 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77  only.  ** otherw
2c8e0 69 73 65 20 72 65 74 75 72 6e 20 42 55 53 59 20  ise return BUSY 
2c8f0 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f  (if lock file) o
2c900 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74  r CANTOPEN for t
2c910 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20  he conch file.  
2c920 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66  */.  pUnused = f
2c930 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70 61  indReusableFd(pa
2c940 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a  th, openFlags);.
2c950 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
2c960 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65  .    fd = pUnuse
2c970 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d->fd;.  }else{.
2c980 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71      pUnused = sq
2c990 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
2c9a0 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a  eof(*pUnused));.
2c9b0 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64      if( !pUnused
2c9c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2c9d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2c9e0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
2c9f0 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20  d<0 ){.    fd = 
2ca00 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46  open(path, openF
2ca10 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46  lags, SQLITE_DEF
2ca20 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
2ca30 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72 72  SIONS);.    terr
2ca40 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
2ca50 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e  if( fd<0 && errn
2ca60 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c  o==ENOENT && isl
2ca70 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
2ca80 20 69 66 28 20 70 72 6f 78 79 43 72 65 61 74 65   if( proxyCreate
2ca90 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29 20 3d  LockPath(path) =
2caa0 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  = SQLITE_OK ){. 
2cab0 20 20 20 20 20 20 20 66 64 20 3d 20 6f 70 65 6e         fd = open
2cac0 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
2cad0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
2cae0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
2caf0 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  S);.      }.    
2cb00 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  }.  }.  if( fd<0
2cb10 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67   ){.    openFlag
2cb20 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20  s = O_RDONLY;.  
2cb30 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68    fd = open(path
2cb40 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c  , openFlags, SQL
2cb50 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
2cb60 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
2cb70 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e     terrno = errn
2cb80 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c  o;.  }.  if( fd<
2cb90 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c  0 ){.    if( isl
2cba0 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
2cbb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
2cbc0 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
2cbd0 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b  witch (terrno) {
2cbe0 0a 20 20 20 20 20 20 63 61 73 65 20 45 41 43 43  .      case EACC
2cbf0 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  ES:.        retu
2cc00 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
2cc10 20 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20        case EIO: 
2cc20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2cc30 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
2cc40 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67  K; /* even thoug
2cc50 68 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63  h it is the conc
2cc60 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75  h */.      defau
2cc70 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  lt:.        retu
2cc80 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
2cc90 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
2cca0 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28   }.  .  pNew = (
2ccb0 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74  unixFile *)sqlit
2ccc0 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
2ccd0 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20  (*pNew));.  if( 
2cce0 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pNew==NULL ){.  
2ccf0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2cd00 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  MEM;.    goto en
2cd10 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a  d_create_proxy;.
2cd20 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65    }.  memset(pNe
2cd30 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  w, 0, sizeof(uni
2cd40 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d  xFile));.  pNew-
2cd50 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
2cd60 6e 46 6c 61 67 73 3b 0a 20 20 64 75 6d 6d 79 56  nFlags;.  dummyV
2cd70 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76  fs.pAppData = (v
2cd80 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f  oid*)&autolockIo
2cd90 46 69 6e 64 65 72 3b 0a 20 20 70 55 6e 75 73 65  Finder;.  pUnuse
2cda0 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55  d->fd = fd;.  pU
2cdb0 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f  nused->flags = o
2cdc0 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  penFlags;.  pNew
2cdd0 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75  ->pUnused = pUnu
2cde0 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66  sed;.  .  rc = f
2cdf0 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64  illInUnixFile(&d
2ce00 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 64 69 72  ummyVfs, fd, dir
2ce10 66 64 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  fd, (sqlite3_fil
2ce20 65 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30  e*)pNew, path, 0
2ce30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
2ce40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ce50 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b   *ppFile = pNew;
2ce60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2ce70 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63  TE_OK;.  }.end_c
2ce80 72 65 61 74 65 5f 70 72 6f 78 79 3a 20 20 20 20  reate_proxy:    
2ce90 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a  .  close(fd); /*
2cea0 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 66   silently leak f
2ceb0 64 20 69 66 20 65 72 72 6f 72 2c 20 77 65 27 72  d if error, we'r
2cec0 65 20 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72  e already in err
2ced0 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
2cee0 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 73 71  free(pNew);.  sq
2cef0 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73  lite3_free(pUnus
2cf00 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ed);.  return rc
2cf10 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2cf20 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c  TE_TEST./* simul
2cf30 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73  ate multiple hos
2cf40 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75  ts by creating u
2cf50 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c  nique hostid fil
2cf60 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73  e paths */.int s
2cf70 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
2cf80 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  m = 0;.#endif..#
2cf90 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53  define PROXY_HOS
2cfa0 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a  TIDLEN    16  /*
2cfb0 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74   conch file host
2cfc0 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f   id length */../
2cfd0 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20 64 65 66  * Not always def
2cfe0 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65 61 64  ined in the head
2cff0 65 72 73 20 61 73 20 69 74 20 6f 75 67 68 74 20  ers as it ought 
2d000 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72 6e 20  to be */.extern 
2d010 69 6e 74 20 67 65 74 68 6f 73 74 75 75 69 64 28  int gethostuuid(
2d020 75 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e 73 74  uuid_t id, const
2d030 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
2d040 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a 20 67 65 74   *wait);../* get
2d050 20 74 68 65 20 68 6f 73 74 20 49 44 20 76 69 61   the host ID via
2d060 20 67 65 74 68 6f 73 74 75 75 69 64 28 29 2c 20   gethostuuid(), 
2d070 70 48 6f 73 74 49 44 20 6d 75 73 74 20 70 6f 69  pHostID must poi
2d080 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54  nt to PROXY_HOST
2d090 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20  IDLEN .** bytes 
2d0a0 6f 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f  of writable memo
2d0b0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
2d0c0 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44  t proxyGetHostID
2d0d0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
2d0e0 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70 45  pHostID, int *pE
2d0f0 72 72 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28  rror){.  assert(
2d100 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
2d110 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74  == sizeof(uuid_t
2d120 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f  ));.  memset(pHo
2d130 73 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48  stID, 0, PROXY_H
2d140 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66 20 64  OSTIDLEN);.#if d
2d150 65 66 69 6e 65 64 28 5f 5f 4d 41 58 5f 4f 53 5f  efined(__MAX_OS_
2d160 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45  X_VERSION_MIN_RE
2d170 51 55 49 52 45 44 29 5c 0a 20 20 20 20 20 20 20  QUIRED)\.       
2d180 20 20 20 20 20 20 20 20 26 26 20 5f 5f 4d 41 43          && __MAC
2d190 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49  _OS_X_VERSION_MI
2d1a0 4e 5f 52 45 51 55 49 52 45 44 3c 31 30 35 30 0a  N_REQUIRED<1050.
2d1b0 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63    {.    static c
2d1c0 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65  onst struct time
2d1d0 73 70 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b  spec timeout = {
2d1e0 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20  1, 0}; /* 1 sec 
2d1f0 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 20 20 69  timeout */.    i
2d200 66 28 20 67 65 74 68 6f 73 74 75 75 69 64 28 70  f( gethostuuid(p
2d210 48 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f 75 74  HostID, &timeout
2d220 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  ) ){.      int e
2d230 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  rr = errno;.    
2d240 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a    if( pError ){.
2d250 20 20 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20          *pError 
2d260 3d 20 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  = err;.      }. 
2d270 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d280 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
2d290 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65    }.#endif.#ifde
2d2a0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
2d2b0 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74  /* simulate mult
2d2c0 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72  iple hosts by cr
2d2d0 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f  eating unique ho
2d2e0 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20  stid file paths 
2d2f0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
2d300 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30  _hostid_num != 0
2d310 29 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30  ){.    pHostID[0
2d320 5d 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74  ] = (char)(pHost
2d330 49 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73  ID[0] + (char)(s
2d340 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
2d350 6d 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a  m & 0xFF));.  }.
2d360 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75  #endif.  .  retu
2d370 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2d380 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69  ./* The conch fi
2d390 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
2d3a0 68 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20  header, host id 
2d3b0 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  and lock file pa
2d3c0 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  th. */.#define P
2d3d0 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
2d3e0 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20  N 2   /* 1-byte 
2d3f0 68 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20  header, 16-byte 
2d400 68 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f  host id, path */
2d410 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48  .#define PROXY_H
2d420 45 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20  EADERLEN    1   
2d430 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65  /* conch file he
2d440 61 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23  ader length */.#
2d450 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54  define PROXY_PAT
2d460 48 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59  HINDEX    (PROXY
2d470 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
2d480 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66  _HOSTIDLEN).#def
2d490 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  ine PROXY_MAXCON
2d4a0 43 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45  CHLEN  (PROXY_HE
2d4b0 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f  ADERLEN+PROXY_HO
2d4c0 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c  STIDLEN+MAXPATHL
2d4d0 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65  EN)../* .** Take
2d4e0 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20  s an open conch 
2d4f0 66 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65  file, copies the
2d500 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e   contents to a n
2d510 65 77 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e  ew path and then
2d520 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61   moves .** it ba
2d530 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63  ck.  The newly c
2d540 72 65 61 74 65 64 20 66 69 6c 65 27 73 20 66 69  reated file's fi
2d550 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
2d560 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65   assigned to the
2d570 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73  .** conch file s
2d580 74 72 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e  tructure and fin
2d590 61 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61  ally the origina
2d5a0 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73  l conch file des
2d5b0 63 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63  criptor is .** c
2d5c0 6c 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20  losed.  Returns 
2d5d0 7a 65 72 6f 20 69 66 20 73 75 63 63 65 73 73 66  zero if successf
2d5e0 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ul..*/.static in
2d5f0 74 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63  t proxyBreakConc
2d600 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  hLock(unixFile *
2d610 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79  pFile, uuid_t my
2d620 48 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79  HostID){.  proxy
2d630 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2d640 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
2d650 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
2d660 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
2d670 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65  ext; .  unixFile
2d680 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
2d690 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
2d6a0 20 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50   char tPath[MAXP
2d6b0 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20  ATHLEN];.  char 
2d6c0 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  buf[PROXY_MAXCON
2d6d0 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a  CHLEN];.  char *
2d6e0 63 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f  cPath = pCtx->co
2d6f0 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73  nchFilePath;.  s
2d700 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20  ize_t readLen = 
2d710 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68  0;.  size_t path
2d720 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Len = 0;.  char 
2d730 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b  errmsg[64] = "";
2d740 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
2d750 20 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20    int rc = -1;. 
2d760 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2d770 52 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20  R(myHostID);..  
2d780 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  /* create a new 
2d790 70 61 74 68 20 62 79 20 72 65 70 6c 61 63 65 20  path by replace 
2d7a0 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63  the trailing '-c
2d7b0 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62 72 65  onch' with '-bre
2d7c0 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e  ak' */.  pathLen
2d7d0 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61 74 68   = strlcpy(tPath
2d7e0 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48  , cPath, MAXPATH
2d7f0 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68  LEN);.  if( path
2d800 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c  Len>MAXPATHLEN |
2d810 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a  | pathLen<6 || .
2d820 20 20 20 20 20 28 73 74 72 6c 63 70 79 28 26 74       (strlcpy(&t
2d830 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c  Path[pathLen-5],
2d840 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20   "break", 6) != 
2d850 35 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  5) ){.    sqlite
2d860 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2d870 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67  f(errmsg),errmsg
2d880 2c 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65  ,"path error (le
2d890 6e 20 25 64 29 22 2c 28 69 6e 74 29 70 61 74 68  n %d)",(int)path
2d8a0 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  Len);.    goto e
2d8b0 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
2d8c0 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20  }.  /* read the 
2d8d0 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f  conch content */
2d8e0 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 70 72 65  .  readLen = pre
2d8f0 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ad(conchFile->h,
2d900 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43   buf, PROXY_MAXC
2d910 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69  ONCHLEN, 0);.  i
2d920 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59  f( readLen<PROXY
2d930 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20 20  _PATHINDEX ){.  
2d940 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2d950 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
2d960 29 2c 65 72 72 6d 73 67 2c 22 72 65 61 64 20 65  ),errmsg,"read e
2d970 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28  rror (len %d)",(
2d980 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20  int)readLen);.  
2d990 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
2d9a0 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77  lock;.  }.  /* w
2d9b0 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74  rite it out to t
2d9c0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62 72 65  he temporary bre
2d9d0 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20  ak file */.  fd 
2d9e0 3d 20 6f 70 65 6e 28 74 50 61 74 68 2c 20 28 4f  = open(tPath, (O
2d9f0 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f  _RDWR|O_CREAT|O_
2da00 45 58 43 4c 29 2c 20 53 51 4c 49 54 45 5f 44 45  EXCL), SQLITE_DE
2da10 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
2da20 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66  SSIONS);.  if( f
2da30 64 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  d<0 ){.    sqlit
2da40 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2da50 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d  of(errmsg), errm
2da60 73 67 2c 20 22 63 72 65 61 74 65 20 66 61 69 6c  sg, "create fail
2da70 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29  ed (%d)", errno)
2da80 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
2da90 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
2daa0 69 66 28 20 70 77 72 69 74 65 28 66 64 2c 20 62  if( pwrite(fd, b
2dab0 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30 29 20  uf, readLen, 0) 
2dac0 21 3d 20 28 73 73 69 7a 65 5f 74 29 72 65 61 64  != (ssize_t)read
2dad0 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Len ){.    sqlit
2dae0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2daf0 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d  of(errmsg), errm
2db00 73 67 2c 20 22 77 72 69 74 65 20 66 61 69 6c 65  sg, "write faile
2db10 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b  d (%d)", errno);
2db20 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
2db30 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69  eaklock;.  }.  i
2db40 66 28 20 72 65 6e 61 6d 65 28 74 50 61 74 68 2c  f( rename(tPath,
2db50 20 63 50 61 74 68 29 20 29 7b 0a 20 20 20 20 73   cPath) ){.    s
2db60 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2db70 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20  sizeof(errmsg), 
2db80 65 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20  errmsg, "rename 
2db90 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
2dba0 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
2dbb0 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
2dbc0 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 66 70  }.  rc = 0;.  fp
2dbd0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 62  rintf(stderr, "b
2dbe0 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  roke stale lock 
2dbf0 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 29  on %s\n", cPath)
2dc00 3b 0a 20 20 63 6c 6f 73 65 28 63 6f 6e 63 68 46  ;.  close(conchF
2dc10 69 6c 65 2d 3e 68 29 3b 0a 20 20 63 6f 6e 63 68  ile->h);.  conch
2dc20 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20  File->h = fd;.  
2dc30 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46  conchFile->openF
2dc40 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20  lags = O_RDWR | 
2dc50 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72  O_CREAT;..end_br
2dc60 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72  eaklock:.  if( r
2dc70 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e  c ){.    if( fd>
2dc80 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 69  =0 ){.      unli
2dc90 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20  nk(tPath);.     
2dca0 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20   close(fd);.    
2dcb0 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  }.    fprintf(st
2dcc0 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f  derr, "failed to
2dcd0 20 62 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63   break stale loc
2dce0 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20  k on %s, %s\n", 
2dcf0 63 50 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a  cPath, errmsg);.
2dd00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2dd10 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20  .}../* Take the 
2dd20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f  requested lock o
2dd30 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
2dd40 20 61 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61   and break a sta
2dd50 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a  le lock if the .
2dd60 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68  ** host id match
2dd70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
2dd80 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b  t proxyConchLock
2dd90 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
2dda0 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49  , uuid_t myHostI
2ddb0 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29  D, int lockType)
2ddc0 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
2ddd0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
2dde0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
2ddf0 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
2de00 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
2de10 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
2de20 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
2de30 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63  chFile;.  int rc
2de40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2de50 69 6e 74 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a  int nTries = 0;.
2de60 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
2de70 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a  c conchModTime;.
2de80 20 20 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63    .  do {.    rc
2de90 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
2dea0 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
2deb0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
2dec0 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29  hFile, lockType)
2ded0 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b  ;.    nTries ++;
2dee0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2def0 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
2df00 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b    /* If the lock
2df10 20 66 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a   failed (busy):.
2df20 20 20 20 20 20 20 20 2a 20 31 73 74 20 74 72 79         * 1st try
2df30 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69  : get the mod ti
2df40 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c  me of the conch,
2df50 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74   wait 0.5s and t
2df60 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20  ry again. .     
2df70 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69    * 2nd try: fai
2df80 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d  l if the mod tim
2df90 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73  e changed or hos
2dfa0 74 20 69 64 20 69 73 20 64 69 66 66 65 72 65 6e  t id is differen
2dfb0 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20 20 20  t, wait .       
2dfc0 2a 20 20 20 20 20 20 20 20 20 20 20 31 30 20 73  *           10 s
2dfd0 65 63 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ec and try again
2dfe0 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20 74 72  .       * 3rd tr
2dff0 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63  y: break the loc
2e000 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64  k unless the mod
2e010 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65   time has change
2e020 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  d..       */.   
2e030 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
2e040 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20 66 73  uf;.      if( fs
2e050 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  tat(conchFile->h
2e060 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20  , &buf) ){.     
2e070 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
2e080 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
2e090 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2e0a0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
2e0b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
2e0c0 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d      if( nTries==
2e0d0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  1 ){.        con
2e0e0 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e  chModTime = buf.
2e0f0 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20  st_mtimespec;.  
2e100 20 20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30        usleep(500
2e110 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e  000); /* wait 0.
2e120 35 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68  5 sec and try th
2e130 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20  e lock again*/. 
2e140 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2e150 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20    .      }..    
2e160 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73    assert( nTries
2e170 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >1 );.      if( 
2e180 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f  conchModTime.tv_
2e190 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74  sec != buf.st_mt
2e1a0 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c  imespec.tv_sec |
2e1b0 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63  | .         conc
2e1c0 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63  hModTime.tv_nsec
2e1d0 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65   != buf.st_mtime
2e1e0 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a  spec.tv_nsec ){.
2e1f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2e200 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
2e210 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
2e220 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29   if( nTries==2 )
2e230 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68 61 72  {  .        char
2e240 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43   tBuf[PROXY_MAXC
2e250 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  ONCHLEN];.      
2e260 20 20 69 6e 74 20 6c 65 6e 20 3d 20 70 72 65 61    int len = prea
2e270 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
2e280 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43  tBuf, PROXY_MAXC
2e290 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20  ONCHLEN, 0);.   
2e2a0 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29       if( len<0 )
2e2b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
2e2c0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
2e2d0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
2e2e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2e2f0 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
2e300 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2e310 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e  len>PROXY_PATHIN
2e320 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d  DEX && tBuf[0]==
2e330 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43  (char)PROXY_CONC
2e340 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20  HVERSION){.     
2e350 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72       /* don't br
2e360 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66 20  eak the lock if 
2e370 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f 65 73  the host id does
2e380 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  n't match */.   
2e390 20 20 20 20 20 20 20 69 66 28 20 30 21 3d 6d 65         if( 0!=me
2e3a0 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f 58 59  mcmp(&tBuf[PROXY
2e3b0 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48  _HEADERLEN], myH
2e3c0 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53  ostID, PROXY_HOS
2e3d0 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20  TIDLEN) ){.     
2e3e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2e3f0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
2e400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2e410 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2e420 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74  /* don't break t
2e430 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74  he lock on short
2e440 20 72 65 61 64 20 6f 72 20 61 20 76 65 72 73 69   read or a versi
2e450 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20  on mismatch */. 
2e460 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2e470 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
2e480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
2e490 73 6c 65 65 70 28 31 30 30 30 30 30 30 30 29 3b  sleep(10000000);
2e4a0 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65 63 20   /* wait 10 sec 
2e4b0 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b  and try the lock
2e4c0 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20   again */.      
2e4d0 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20    continue; .   
2e4e0 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
2e4f0 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73    assert( nTries
2e500 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==3 );.      if(
2e510 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f   0==proxyBreakCo
2e520 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d  nchLock(pFile, m
2e530 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20 20 20  yHostID) ){.    
2e540 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2e550 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OK;.        if( 
2e560 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53  lockType==EXCLUS
2e570 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
2e580 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
2e590 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2e5a0 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
2e5b0 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53  le*)conchFile, S
2e5c0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20  HARED_LOCK);    
2e5d0 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d        .        }
2e5e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 72 63  .        if( !rc
2e5f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2e600 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
2e610 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
2e620 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
2e630 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29  hFile, lockType)
2e640 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e650 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68    }.    }.  } wh
2e660 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2e670 42 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33  BUSY && nTries<3
2e680 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20   );.  .  return 
2e690 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20  rc;.}../* Takes 
2e6a0 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b  the conch by tak
2e6b0 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
2e6c0 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65 20 63  k and read the c
2e6d0 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69  ontents conch, i
2e6e0 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69  f .** lockPath i
2e6f0 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20  s non-NULL, the 
2e700 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b  host ID and lock
2e710 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20   file path must 
2e720 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a  match.  A NULL .
2e730 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e  ** lockPath mean
2e740 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50  s that the lockP
2e750 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  ath in the conch
2e760 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73   file will be us
2e770 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f  ed if the .** ho
2e780 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72  st IDs match, or
2e790 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68   a new lock path
2e7a0 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
2e7b0 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
2e7c0 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e   .** and written
2e7d0 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69   to the conch fi
2e7e0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
2e7f0 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68  t proxyTakeConch
2e800 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
2e810 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
2e820 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
2e830 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
2e840 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
2e850 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
2e860 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63    .  if( pCtx->c
2e870 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20  onchHeld!=0 ){. 
2e880 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e890 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2e8a0 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
2e8b0 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
2e8c0 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69  nchFile;.    uui
2e8d0 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20  d_t myHostID;.  
2e8e0 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30    int pError = 0
2e8f0 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61 64 42  ;.    char readB
2e900 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
2e910 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
2e920 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48  lockPath[MAXPATH
2e930 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a  LEN];.    char *
2e940 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e  tempLockPath = N
2e950 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  ULL;.    int rc 
2e960 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2e970 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68   int createConch
2e980 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f   = 0;.    int ho
2e990 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20  stIdMatch = 0;. 
2e9a0 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d     int readLen =
2e9b0 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79 4f   0;.    int tryO
2e9c0 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ldLockPath = 0;.
2e9d0 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65 77      int forceNew
2e9e0 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20  LockPath = 0;.  
2e9f0 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28    .    OSTRACE((
2ea00 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 66  "TAKECONCH  %d f
2ea10 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  or %s pid=%d\n",
2ea20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
2ea30 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74              (pCt
2ea40 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
2ea50 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   ? pCtx->lockPro
2ea60 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a  xyPath : ":auto:
2ea70 22 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  "), getpid()));.
2ea80 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47  .    rc = proxyG
2ea90 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49  etHostID(myHostI
2eaa0 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20  D, &pError);.   
2eab0 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d   if( (rc&0xff)==
2eac0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
2ead0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
2eae0 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b  tErrno = pError;
2eaf0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
2eb00 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d  takeconch;.    }
2eb10 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43  .    rc = proxyC
2eb20 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  onchLock(pFile, 
2eb30 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44  myHostID, SHARED
2eb40 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
2eb50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2eb60 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
2eb70 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d  takeconch;.    }
2eb80 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74 68 65  .    /* read the
2eb90 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63 68 20   existing conch 
2eba0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61 64  file */.    read
2ebb0 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65 61  Len = seekAndRea
2ebc0 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e  d((unixFile*)con
2ebd0 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61 64 42  chFile, 0, readB
2ebe0 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
2ebf0 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28 20  CHLEN);.    if( 
2ec00 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20  readLen<0 ){.   
2ec10 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a     /* I/O error:
2ec20 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62   lastErrno set b
2ec30 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f  y seekAndRead */
2ec40 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
2ec50 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46  stErrno = conchF
2ec60 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
2ec70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2ec80 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
2ec90 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
2eca0 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73  econch;.    }els
2ecb0 65 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28  e if( readLen<=(
2ecc0 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
2ecd0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
2ece0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
2ecf0 20 20 72 65 61 64 42 75 66 5b 30 5d 21 3d 28 63    readBuf[0]!=(c
2ed00 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
2ed10 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  ERSION ){.      
2ed20 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64 20  /* a short read 
2ed30 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61  or version forma
2ed40 74 20 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e 73  t mismatch means
2ed50 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
2ed60 74 65 20 61 20 6e 65 77 20 0a 20 20 20 20 20 20  te a new .      
2ed70 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a  ** conch file. .
2ed80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
2ed90 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a  reateConch = 1;.
2eda0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20      }.    /* if 
2edb0 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63  the host id matc
2edc0 68 65 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  hes and the lock
2edd0 20 70 61 74 68 20 61 6c 72 65 61 64 79 20 65 78   path already ex
2ede0 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 63  ists in the conc
2edf0 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74  h.    ** we'll t
2ee00 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  ry to use the pa
2ee10 74 68 20 74 68 65 72 65 2c 20 69 66 20 77 65 20  th there, if we 
2ee20 63 61 6e 27 74 20 6f 70 65 6e 20 74 68 61 74 20  can't open that 
2ee30 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20  path, we'll .   
2ee40 20 2a 2a 20 72 65 74 72 79 20 77 69 74 68 20 61   ** retry with a
2ee50 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65 72 61   new auto-genera
2ee60 74 65 64 20 70 61 74 68 20 0a 20 20 20 20 2a 2f  ted path .    */
2ee70 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20  .    do { /* in 
2ee80 63 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20  case we need to 
2ee90 74 72 79 20 61 67 61 69 6e 20 66 6f 72 20 61 6e  try again for an
2eea0 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f   :auto: named lo
2eeb0 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  ck file */..    
2eec0 20 20 69 66 28 20 21 63 72 65 61 74 65 43 6f 6e    if( !createCon
2eed0 63 68 20 26 26 20 21 66 6f 72 63 65 4e 65 77 4c  ch && !forceNewL
2eee0 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20  ockPath ){.     
2eef0 20 20 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d     hostIdMatch =
2ef00 20 21 6d 65 6d 63 6d 70 28 26 72 65 61 64 42 75   !memcmp(&readBu
2ef10 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  f[PROXY_HEADERLE
2ef20 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20  N], myHostID, . 
2ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef50 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
2ef60 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66  );.        /* if
2ef70 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64   the conch has d
2ef80 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20  ata compare the 
2ef90 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20  contents */.    
2efa0 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c      if( !pCtx->l
2efb0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
2efc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72            /* for
2efd0 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61   auto-named loca
2efe0 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73  l lock file, jus
2eff0 74 20 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74  t check the host
2f000 20 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20   ID and we'll.  
2f010 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20           ** use 
2f020 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  the local lock f
2f030 69 6c 65 20 70 61 74 68 20 74 68 61 74 27 73 20  ile path that's 
2f040 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 72 65  already in there
2f050 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  .           */. 
2f060 20 20 20 20 20 20 20 20 20 69 66 28 20 68 6f 73           if( hos
2f070 74 49 64 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  tIdMatch ){.    
2f080 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20 70          size_t p
2f090 61 74 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65  athLen = (readLe
2f0a0 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e  n - PROXY_PATHIN
2f0b0 44 45 58 29 3b 0a 20 20 20 20 20 20 20 20 20 20  DEX);.          
2f0c0 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69    .            i
2f0d0 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50  f( pathLen>=MAXP
2f0e0 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20  ATHLEN ){.      
2f0f0 20 20 20 20 20 20 20 20 70 61 74 68 4c 65 6e 3d          pathLen=
2f100 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20  MAXPATHLEN-1;.  
2f110 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f120 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6c          memcpy(l
2f130 6f 63 6b 50 61 74 68 2c 20 26 72 65 61 64 42 75  ockPath, &readBu
2f140 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  f[PROXY_PATHINDE
2f150 58 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20  X], pathLen);.  
2f160 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 50 61            lockPa
2f170 74 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b  th[pathLen] = 0;
2f180 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 6d  .            tem
2f190 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b  pLockPath = lock
2f1a0 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20  Path;.          
2f1b0 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68    tryOldLockPath
2f1c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2f1d0 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f    /* create a co
2f1e0 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70  py of the lock p
2f1f0 61 74 68 20 69 66 20 74 68 65 20 63 6f 6e 63 68  ath if the conch
2f200 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20   is taken */.   
2f210 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2f220 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
2f230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f240 20 7d 65 6c 73 65 20 69 66 28 20 68 6f 73 74 49   }else if( hostI
2f250 64 4d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20  dMatch.         
2f260 20 20 20 20 20 20 26 26 20 21 73 74 72 6e 63 6d        && !strncm
2f270 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  p(pCtx->lockProx
2f280 79 50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b  yPath, &readBuf[
2f290 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
2f2a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
2f2c0 64 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49  dLen-PROXY_PATHI
2f2d0 4e 44 45 58 29 0a 20 20 20 20 20 20 20 20 29 7b  NDEX).        ){
2f2e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f  .          /* co
2f2f0 6e 63 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63  nch host and loc
2f300 6b 20 70 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a  k path match */.
2f310 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2f320 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20  nd_takeconch; . 
2f330 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f340 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a  .      .      /*
2f350 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73   if the conch is
2f360 6e 27 74 20 77 72 69 74 61 62 6c 65 20 61 6e 64  n't writable and
2f370 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c 20   doesn't match, 
2f380 77 65 20 63 61 6e 27 74 20 74 61 6b 65 20 69 74  we can't take it
2f390 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 63   */.      if( (c
2f3a0 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  onchFile->openFl
2f3b0 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30  ags&O_RDWR) == 0
2f3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2f3d0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
2f3e0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
2f3f0 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20  akeconch;.      
2f400 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f  }.      .      /
2f410 2a 20 65 69 74 68 65 72 20 74 68 65 20 63 6f 6e  * either the con
2f420 63 68 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20  ch didn't match 
2f430 6f 72 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  or we need to cr
2f440 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a  eate a new one *
2f450 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 74  /.      if( !pCt
2f460 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
2f470 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78   ){.        prox
2f480 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70 43 74  yGetLockPath(pCt
2f490 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50  x->dbPath, lockP
2f4a0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
2f4b0 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f  ;.        tempLo
2f4c0 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74  ckPath = lockPat
2f4d0 68 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 72  h;.        /* cr
2f4e0 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
2f4f0 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e  he lock path _on
2f500 6c 79 5f 20 69 66 20 74 68 65 20 63 6f 6e 63 68  ly_ if the conch
2f510 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20   is taken */.   
2f520 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
2f530 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63    /* update conc
2f540 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20  h with host and 
2f550 70 61 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20  path (this will 
2f560 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72  fail if other pr
2f570 6f 63 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 68  ocess.      ** h
2f580 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  as a shared lock
2f590 20 61 6c 72 65 61 64 79 29 2c 20 69 66 20 74 68   already), if th
2f5a0 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65  e host id matche
2f5b0 73 2c 20 75 73 65 20 74 68 65 20 62 69 67 0a 20  s, use the big. 
2f5c0 20 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a 20       ** stick.. 
2f5d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 75       */.      fu
2f5e0 74 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65 2d  times(conchFile-
2f5f0 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  >h, NULL);.     
2f600 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68   if( hostIdMatch
2f610 20 26 26 20 21 63 72 65 61 74 65 43 6f 6e 63 68   && !createConch
2f620 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2f630 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64  conchFile->pInod
2f640 65 20 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  e && conchFile->
2f650 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
2f660 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  1 ){.          /
2f670 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20  * We are trying 
2f680 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65  for an exclusive
2f690 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65   lock but anothe
2f6a0 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  r thread in this
2f6b0 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  .           ** s
2f6c0 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
2f6d0 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
2f6e0 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
2f6f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2f700 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
2f710 20 20 20 7d 20 65 6c 73 65 20 7b 20 20 20 20 20     } else {     
2f720 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
2f730 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c  rc = proxyConchL
2f740 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
2f750 74 49 44 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  tID, EXCLUSIVE_L
2f760 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OCK);.        }.
2f770 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f780 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46       rc = conchF
2f790 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
2f7a0 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
2f7b0 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58  e*)conchFile, EX
2f7c0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
2f7d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2f7e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f7f0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 77  {.        char w
2f800 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59  riteBuffer[PROXY
2f810 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
2f820 20 20 20 20 20 20 20 69 6e 74 20 77 72 69 74 65         int write
2f830 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
2f840 20 20 0a 20 20 20 20 20 20 20 20 77 72 69 74 65    .        write
2f850 42 75 66 66 65 72 5b 30 5d 20 3d 20 28 63 68 61  Buffer[0] = (cha
2f860 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52  r)PROXY_CONCHVER
2f870 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 6d 65  SION;.        me
2f880 6d 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65  mcpy(&writeBuffe
2f890 72 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  r[PROXY_HEADERLE
2f8a0 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52  N], myHostID, PR
2f8b0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a  OXY_HOSTIDLEN);.
2f8c0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78          if( pCtx
2f8d0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 21  ->lockProxyPath!
2f8e0 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  =NULL ){.       
2f8f0 20 20 20 73 74 72 6c 63 70 79 28 26 77 72 69 74     strlcpy(&writ
2f900 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41  eBuffer[PROXY_PA
2f910 54 48 49 4e 44 45 58 5d 2c 20 70 43 74 78 2d 3e  THINDEX], pCtx->
2f920 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 4d  lockProxyPath, M
2f930 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20  AXPATHLEN);.    
2f940 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f950 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72       strlcpy(&wr
2f960 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
2f970 50 41 54 48 49 4e 44 45 58 5d 2c 20 74 65 6d 70  PATHINDEX], temp
2f980 4c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54  LockPath, MAXPAT
2f990 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d  HLEN);.        }
2f9a0 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 53 69  .        writeSi
2f9b0 7a 65 20 3d 20 50 52 4f 58 59 5f 50 41 54 48 49  ze = PROXY_PATHI
2f9c0 4e 44 45 58 20 2b 20 73 74 72 6c 65 6e 28 26 77  NDEX + strlen(&w
2f9d0 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59  riteBuffer[PROXY
2f9e0 5f 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a 20 20  _PATHINDEX]);.  
2f9f0 20 20 20 20 20 20 66 74 72 75 6e 63 61 74 65 28        ftruncate(
2fa00 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 77 72  conchFile->h, wr
2fa10 69 74 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  iteSize);.      
2fa20 20 20 72 63 20 3d 20 75 6e 69 78 57 72 69 74 65    rc = unixWrite
2fa30 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
2fa40 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72 69 74  )conchFile, writ
2fa50 65 42 75 66 66 65 72 2c 20 77 72 69 74 65 53 69  eBuffer, writeSi
2fa60 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ze, 0);.        
2fa70 66 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c 65 2d  fsync(conchFile-
2fa80 3e 68 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  >h);.        /* 
2fa90 49 66 20 77 65 20 63 72 65 61 74 65 64 20 61 20  If we created a 
2faa0 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c 65 20 28  new conch file (
2fab0 6e 6f 74 20 6a 75 73 74 20 75 70 64 61 74 65 64  not just updated
2fac0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2fad0 20 61 20 0a 20 20 20 20 20 20 20 20 20 2a 2a 20   a .         ** 
2fae0 76 61 6c 69 64 20 63 6f 6e 63 68 20 66 69 6c 65  valid conch file
2faf0 29 2c 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20  ), try to match 
2fb00 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
2fb10 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2fb20 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  .         */.   
2fb30 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2fb40 49 54 45 5f 4f 4b 20 26 26 20 63 72 65 61 74 65  ITE_OK && create
2fb50 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Conch ){.       
2fb60 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
2fb70 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  uf;.          in
2fb80 74 20 65 72 72 20 3d 20 66 73 74 61 74 28 70 46  t err = fstat(pF
2fb90 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20  ile->h, &buf);. 
2fba0 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72           if( err
2fbb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2fbc0 20 20 20 6d 6f 64 65 5f 74 20 63 6d 6f 64 65 20     mode_t cmode 
2fbd0 3d 20 62 75 66 2e 73 74 5f 6d 6f 64 65 26 28 53  = buf.st_mode&(S
2fbe0 5f 49 52 55 53 52 7c 53 5f 49 57 55 53 52 20 7c  _IRUSR|S_IWUSR |
2fbf0 20 53 5f 49 52 47 52 50 7c 53 5f 49 57 47 52 50   S_IRGRP|S_IWGRP
2fc00 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
2fc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc20 20 20 20 20 20 20 20 20 20 20 20 53 5f 49 52 4f             S_IRO
2fc30 54 48 7c 53 5f 49 57 4f 54 48 29 3b 0a 20 20 20  TH|S_IWOTH);.   
2fc40 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72 79 20           /* try 
2fc50 74 6f 20 6d 61 74 63 68 20 74 68 65 20 64 61 74  to match the dat
2fc60 61 62 61 73 65 20 66 69 6c 65 20 52 2f 57 20 70  abase file R/W p
2fc70 65 72 6d 69 73 73 69 6f 6e 73 2c 20 69 67 6e 6f  ermissions, igno
2fc80 72 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a 23 69  re failure */.#i
2fc90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 50 52 4f  fndef SQLITE_PRO
2fca0 58 59 5f 44 45 42 55 47 0a 20 20 20 20 20 20 20  XY_DEBUG.       
2fcb0 20 20 20 20 20 66 63 68 6d 6f 64 28 63 6f 6e 63       fchmod(conc
2fcc0 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29  hFile->h, cmode)
2fcd0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
2fce0 20 20 20 20 69 66 28 20 66 63 68 6d 6f 64 28 63      if( fchmod(c
2fcf0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f  onchFile->h, cmo
2fd00 64 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  de)!=0 ){.      
2fd10 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65          int code
2fd20 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
2fd30 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
2fd40 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20  stderr, "fchmod 
2fd50 25 6f 20 46 41 49 4c 45 44 20 77 69 74 68 20 25  %o FAILED with %
2fd60 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
2fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2fd80 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74 72 65  mode, code, stre
2fd90 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20 20  rror(code));.   
2fda0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
2fdb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2fdc0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
2fdd0 22 66 63 68 6d 6f 64 20 25 6f 20 53 55 43 43 45  "fchmod %o SUCCE
2fde0 44 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20  DED\n",cmode);. 
2fdf0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2fe00 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2fe10 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f            int co
2fe20 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  de = errno;.    
2fe30 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
2fe40 73 74 64 65 72 72 2c 20 22 53 54 41 54 20 46 41  stderr, "STAT FA
2fe50 49 4c 45 44 5b 25 64 5d 20 77 69 74 68 20 25 64  ILED[%d] with %d
2fe60 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20   %s\n", .       
2fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
2fe80 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72  , code, strerror
2fe90 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a  (code));.#endif.
2fea0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2feb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2fec0 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70      conchFile->p
2fed0 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
2fee0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
2fef0 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44  onchFile, SHARED
2ff00 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20  _LOCK);.      . 
2ff10 20 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68     end_takeconch
2ff20 3a 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  :.      OSTRACE(
2ff30 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c  ("TRANSPROXY: CL
2ff40 4f 53 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c  OSE  %d\n", pFil
2ff50 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 69 66  e->h));.      if
2ff60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ff70 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  && pFile->openFl
2ff80 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ags ){.        i
2ff90 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29  f( pFile->h>=0 )
2ffa0 7b 0a 23 69 66 64 65 66 20 53 54 52 49 43 54 5f  {.#ifdef STRICT_
2ffb0 43 4c 4f 53 45 5f 45 52 52 4f 52 0a 20 20 20 20  CLOSE_ERROR.    
2ffc0 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28        if( close(
2ffd0 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20  pFile->h) ){.   
2ffe0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
2fff0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
30000 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  o;.            r
30010 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
30020 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  RR_CLOSE;.      
30030 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
30040 20 20 20 20 20 20 63 6c 6f 73 65 28 70 46 69 6c        close(pFil
30050 65 2d 3e 68 29 3b 20 2f 2a 20 73 69 6c 65 6e 74  e->h); /* silent
30060 6c 79 20 6c 65 61 6b 20 66 64 20 69 66 20 66 61  ly leak fd if fa
30070 69 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  il */.#endif.   
30080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
30090 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
300a0 20 20 20 20 20 20 69 6e 74 20 66 64 20 3d 20 6f        int fd = o
300b0 70 65 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68  pen(pCtx->dbPath
300c0 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  , pFile->openFla
300d0 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gs,.            
300e0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
300f0 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
30100 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20  RMISSIONS);.    
30110 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 52      OSTRACE(("TR
30120 41 4e 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20  ANSPROXY: OPEN  
30130 25 64 5c 6e 22 2c 20 66 64 29 29 3b 0a 20 20 20  %d\n", fd));.   
30140 20 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29       if( fd>=0 )
30150 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
30160 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20 20  e->h = fd;.     
30170 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30180 20 20 20 20 72 63 3d 53 51 4c 49 54 45 5f 43 41      rc=SQLITE_CA
30190 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20  NTOPEN_BKPT; /* 
301a0 53 51 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f  SQLITE_BUSY? pro
301b0 78 79 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c  xyTakeConch call
301c0 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 64 75  ed.           du
301d0 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  ring locking */.
301e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
301f0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
30200 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43  SQLITE_OK && !pC
30210 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b  tx->lockProxy ){
30220 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
30230 61 74 68 20 3d 20 74 65 6d 70 4c 6f 63 6b 50 61  ath = tempLockPa
30240 74 68 20 3f 20 74 65 6d 70 4c 6f 63 6b 50 61 74  th ? tempLockPat
30250 68 20 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h : pCtx->lockPr
30260 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20  oxyPath;.       
30270 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74   rc = proxyCreat
30280 65 55 6e 69 78 46 69 6c 65 28 70 61 74 68 2c 20  eUnixFile(path, 
30290 26 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  &pCtx->lockProxy
302a0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
302b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
302c0 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
302d0 4d 45 4d 20 26 26 20 74 72 79 4f 6c 64 4c 6f 63  MEM && tryOldLoc
302e0 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  kPath ){.       
302f0 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 6e 27     /* we couldn'
30300 74 20 63 72 65 61 74 65 20 74 68 65 20 70 72 6f  t create the pro
30310 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 77 69 74  xy lock file wit
30320 68 20 74 68 65 20 6f 6c 64 20 6c 6f 63 6b 20 66  h the old lock f
30330 69 6c 65 20 70 61 74 68 0a 20 20 20 20 20 20 20  ile path.       
30340 20 20 20 20 2a 2a 20 73 6f 20 74 72 79 20 61 67      ** so try ag
30350 61 69 6e 20 76 69 61 20 61 75 74 6f 2d 6e 61 6d  ain via auto-nam
30360 69 6e 67 20 0a 20 20 20 20 20 20 20 20 20 20 20  ing .           
30370 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  */.          for
30380 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20  ceNewLockPath = 
30390 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74 72 79  1;.          try
303a0 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b  OldLockPath = 0;
303b0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
303c0 6e 75 65 3b 20 2f 2a 20 67 6f 20 62 61 63 6b 20  nue; /* go back 
303d0 74 6f 20 74 68 65 20 64 6f 20 7b 7d 20 77 68 69  to the do {} whi
303e0 6c 65 20 73 74 61 72 74 20 70 6f 69 6e 74 2c 20  le start point, 
303f0 74 72 79 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20  try again */.   
30400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
30410 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
30420 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30430 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b    /* Need to mak
30440 65 20 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68  e a copy of path
30450 20 69 66 20 77 65 20 65 78 74 72 61 63 74 65 64   if we extracted
30460 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   the value.     
30470 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
30480 63 6f 6e 63 68 20 66 69 6c 65 20 6f 72 20 74 68  conch file or th
30490 65 20 70 61 74 68 20 77 61 73 20 61 6c 6c 6f 63  e path was alloc
304a0 61 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63  ated on the stac
304b0 6b 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  k.         */.  
304c0 20 20 20 20 20 20 69 66 28 20 74 65 6d 70 4c 6f        if( tempLo
304d0 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  ckPath ){.      
304e0 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
304f0 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65  oxyPath = sqlite
30500 33 44 62 53 74 72 44 75 70 28 30 2c 20 74 65 6d  3DbStrDup(0, tem
30510 70 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20  pLockPath);.    
30520 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d        if( !pCtx-
30530 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
30540 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
30550 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
30560 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
30580 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
30590 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
305a0 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c    pCtx->conchHel
305b0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a  d = 1;.        .
305c0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78          if( pCtx
305d0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65  ->lockProxy->pMe
305e0 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65  thod == &afpIoMe
305f0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20  thods ){.       
30600 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e     afpLockingCon
30610 74 65 78 74 20 2a 61 66 70 43 74 78 3b 0a 20 20  text *afpCtx;.  
30620 20 20 20 20 20 20 20 20 61 66 70 43 74 78 20 3d          afpCtx =
30630 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
30640 65 78 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b  ext *)pCtx->lock
30650 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  Proxy->lockingCo
30660 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  ntext;.         
30670 20 61 66 70 43 74 78 2d 3e 64 62 50 61 74 68 20   afpCtx->dbPath 
30680 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
30690 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d  yPath;.        }
306a0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
306b0 20 20 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c          conchFil
306c0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
306d0 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
306e0 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f  e*)conchFile, NO
306f0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
30700 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
30710 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 25 73  TAKECONCH  %d %s
30720 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  \n", conchFile->
30730 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
30740 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f    rc==SQLITE_OK?
30750 22 6f 6b 22 3a 22 66 61 69 6c 65 64 22 29 29 3b  "ok":"failed"));
30760 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
30770 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 31  ;.    } while (1
30780 29 3b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65  ); /* in case we
30790 20 6e 65 65 64 20 74 6f 20 72 65 74 72 79 20 74   need to retry t
307a0 68 65 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b 20 66  he :auto: lock f
307b0 69 6c 65 20 2d 20 0a 20 20 20 20 20 20 20 20 20  ile - .         
307c0 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68          ** we sh
307d0 6f 75 6c 64 20 6e 65 76 65 72 20 67 65 74 20 68  ould never get h
307e0 65 72 65 20 65 78 63 65 70 74 20 76 69 61 20 74  ere except via t
307f0 68 65 20 27 63 6f 6e 74 69 6e 75 65 27 20 63 61  he 'continue' ca
30800 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ll. */.  }.}../*
30810 0a 2a 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c  .** If pFile hol
30820 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63  ds a lock on a c
30830 6f 6e 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20  onch file, then 
30840 72 65 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63  release that loc
30850 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
30860 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e   proxyReleaseCon
30870 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
30880 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  le){.  int rc = 
30890 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
308a0 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
308b0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
308c0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
308d0 6e 74 65 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a  ntext *pCtx;  /*
308e0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   The locking con
308f0 74 65 78 74 20 66 6f 72 20 74 68 65 20 70 72 6f  text for the pro
30900 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69  xy lock */.  uni
30910 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
30920 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ;        /* Name
30930 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   of the conch fi
30940 6c 65 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20  le */..  pCtx = 
30950 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
30960 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
30970 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
30980 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
30990 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f  ->conchFile;.  O
309a0 53 54 52 41 43 45 28 28 22 52 45 4c 45 41 53 45  STRACE(("RELEASE
309b0 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
309c0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
309d0 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
309e0 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b       (pCtx->lock
309f0 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78  ProxyPath ? pCtx
30a00 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
30a10 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20  : ":auto:"), .  
30a20 20 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28           getpid(
30a30 29 29 29 3b 0a 20 20 69 66 28 20 70 43 74 78 2d  )));.  if( pCtx-
30a40 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a  >conchHeld>0 ){.
30a50 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
30a60 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  le->pMethod->xUn
30a70 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  lock((sqlite3_fi
30a80 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e  le*)conchFile, N
30a90 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 70  O_LOCK);.  }.  p
30aa0 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d  Ctx->conchHeld =
30ab0 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   0;.  OSTRACE(("
30ac0 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64  RELEASECONCH  %d
30ad0 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c   %s\n", conchFil
30ae0 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
30af0 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
30b00 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
30b10 22 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ")));.  return r
30b20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  c;.}../*.** Give
30b30 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
30b40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 63  database file, c
30b50 6f 6d 70 75 74 65 20 74 68 65 20 6e 61 6d 65 20  ompute the name 
30b60 6f 66 20 69 74 73 20 63 6f 6e 63 68 20 66 69 6c  of its conch fil
30b70 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20  e..** Store the 
30b80 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 69  conch filename i
30b90 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
30ba0 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
30bb0 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65  alloc()..** Make
30bc0 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 70 6f 69   *pConchPath poi
30bd0 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 61  nt to the new na
30be0 6d 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  me.  Return SQLI
30bf0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
30c00 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
30c10 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65 20 74 6f  MEM if unable to
30c20 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a   obtain memory..
30c30 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
30c40 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
30c50 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61  for ensuring tha
30c60 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  t the allocated 
30c70 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20  memory.** space 
30c80 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  is eventually fr
30c90 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e  eed..**.** *pCon
30ca0 63 68 50 61 74 68 20 69 73 20 73 65 74 20 74 6f  chPath is set to
30cb0 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f 72   NULL if a memor
30cc0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
30cd0 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
30ce0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
30cf0 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d  eateConchPathnam
30d00 65 28 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20  e(char *dbPath, 
30d10 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61 74  char **pConchPat
30d20 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  h){.  int i;    
30d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d40 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
30d50 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e  ter */.  int len
30d60 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64   = (int)strlen(d
30d70 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67 74  bPath); /* Lengt
30d80 68 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  h of database fi
30d90 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61 74 68 20  lename - dbPath 
30da0 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  */.  char *conch
30db0 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
30dc0 20 20 20 2f 2a 20 62 75 66 66 65 72 20 69 6e 20     /* buffer in 
30dd0 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75  which to constru
30de0 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f  ct conch name */
30df0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
30e00 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 63 6f  space for the co
30e10 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  nch filename and
30e20 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
30e30 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65  name to.  ** the
30e40 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 72 69   name of the ori
30e50 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
30e60 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43 6f  ile. */  .  *pCo
30e70 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e 63 68 50  nchPath = conchP
30e80 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ath = (char *)sq
30e90 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e  lite3_malloc(len
30ea0 20 2b 20 38 29 3b 0a 20 20 69 66 28 20 63 6f 6e   + 8);.  if( con
30eb0 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20  chPath==0 ){.   
30ec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
30ed0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63  OMEM;.  }.  memc
30ee0 70 79 28 63 6f 6e 63 68 50 61 74 68 2c 20 64 62  py(conchPath, db
30ef0 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  Path, len+1);.  
30f00 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72 74  .  /* now insert
30f10 20 61 20 22 2e 22 20 62 65 66 6f 72 65 20 74 68   a "." before th
30f20 65 20 6c 61 73 74 20 2f 20 63 68 61 72 61 63 74  e last / charact
30f30 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d 28  er */.  for( i=(
30f40 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69 2d  len-1); i>=0; i-
30f50 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6e  - ){.    if( con
30f60 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29  chPath[i]=='/' )
30f70 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  {.      i++;.   
30f80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
30f90 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68 5b    }.  conchPath[
30fa0 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65 20  i]='.';.  while 
30fb0 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 63  ( i<len ){.    c
30fc0 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64 62  onchPath[i+1]=db
30fd0 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b  Path[i];.    i++
30fe0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65  ;.  }..  /* appe
30ff0 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63 68 22 20  nd the "-conch" 
31000 73 75 66 66 69 78 20 74 6f 20 74 68 65 20 66 69  suffix to the fi
31010 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26  le */.  memcpy(&
31020 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c 20  conchPath[i+1], 
31030 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20 20  "-conch", 7);.  
31040 61 73 73 65 72 74 28 20 28 69 6e 74 29 73 74 72  assert( (int)str
31050 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68 29 20 3d  len(conchPath) =
31060 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72 65  = len+7 );..  re
31070 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31080 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20 66  }.../* Takes a f
31090 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20  ully configured 
310a0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73 74  proxy locking-st
310b0 79 6c 65 20 75 6e 69 78 20 66 69 6c 65 20 61 6e  yle unix file an
310c0 64 20 73 77 69 74 63 68 65 73 0a 2a 2a 20 74 68  d switches.** th
310d0 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
310e0 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74 69  e path .*/.stati
310f0 63 20 69 6e 74 20 73 77 69 74 63 68 4c 6f 63 6b  c int switchLock
31100 50 72 6f 78 79 50 61 74 68 28 75 6e 69 78 46 69  ProxyPath(unixFi
31110 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74  le *pFile, const
31120 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20   char *path) {. 
31130 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
31140 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
31150 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
31160 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  t*)pFile->lockin
31170 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61 72  gContext;.  char
31180 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43 74 78   *oldPath = pCtx
31190 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b  ->lockProxyPath;
311a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
311b0 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 46  TE_OK;..  if( pF
311c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
311d0 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  NO_LOCK ){.    r
311e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
311f0 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e  Y;.  }  ..  /* n
31200 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 66 20  othing to do if 
31210 74 68 65 20 70 61 74 68 20 69 73 20 4e 55 4c 4c  the path is NULL
31220 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74 63  , :auto: or matc
31230 68 65 73 20 74 68 65 20 65 78 69 73 74 69 6e 67  hes the existing
31240 20 70 61 74 68 20 2a 2f 0a 20 20 69 66 28 20 21   path */.  if( !
31250 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d  path || path[0]=
31260 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70  ='\0' || !strcmp
31270 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29  (path, ":auto:")
31280 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74 68   ||.    (oldPath
31290 20 26 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64   && !strncmp(old
312a0 50 61 74 68 2c 20 70 61 74 68 2c 20 4d 41 58 50  Path, path, MAXP
312b0 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20 20  ATHLEN)) ){.    
312c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
312d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
312e0 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
312f0 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
31300 72 6f 78 79 3b 0a 20 20 20 20 70 43 74 78 2d 3e  roxy;.    pCtx->
31310 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a  lockProxy=NULL;.
31320 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48      pCtx->conchH
31330 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  eld = 0;.    if(
31340 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c   lockProxy!=NULL
31350 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f 63   ){.      rc=loc
31360 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d  kProxy->pMethod-
31370 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
31380 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f 78  _file *)lockProx
31390 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
313a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
313b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
313c0 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20  (lockProxy);.   
313d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
313e0 72 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20 20  ree(oldPath);.  
313f0 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
31400 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44  yPath = sqlite3D
31410 62 53 74 72 44 75 70 28 30 2c 20 70 61 74 68 29  bStrDup(0, path)
31420 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72  ;.  }.  .  retur
31430 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  n rc;.}../*.** p
31440 46 69 6c 65 20 69 73 20 61 20 66 69 6c 65 20 74  File is a file t
31450 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65  hat has been ope
31460 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 78  ned by a prior x
31470 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50 61  Open call.  dbPa
31480 74 68 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e  th.** is a strin
31490 67 20 62 75 66 66 65 72 20 61 74 20 6c 65 61 73  g buffer at leas
314a0 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20 63  t MAXPATHLEN+1 c
314b0 68 61 72 61 63 74 65 72 73 20 69 6e 20 73 69 7a  haracters in siz
314c0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
314d0 75 74 69 6e 65 20 66 69 6e 64 20 74 68 65 20 66  utine find the f
314e0 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69 61 74  ilename associat
314f0 65 64 20 77 69 74 68 20 70 46 69 6c 65 20 61 6e  ed with pFile an
31500 64 20 77 72 69 74 65 73 20 69 74 0a 2a 2a 20 69  d writes it.** i
31510 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73 74  nt dbPath..*/.st
31520 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
31530 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69  tDbPathForUnixFi
31540 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  le(unixFile *pFi
31550 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68  le, char *dbPath
31560 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ){.#if defined(_
31570 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28 20  _APPLE__).  if( 
31580 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
31590 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20  = &afpIoMethods 
315a0 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70 20 73 74  ){.    /* afp st
315b0 79 6c 65 20 6b 65 65 70 73 20 61 20 72 65 66 65  yle keeps a refe
315c0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 64 62 20  rence to the db 
315d0 70 61 74 68 20 69 6e 20 74 68 65 20 66 69 6c 65  path in the file
315e0 50 61 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20  Path field .    
315f0 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  ** of the struct
31600 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
31610 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 68 61  (int)strlen((cha
31620 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  r*)pFile->lockin
31630 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41  gContext)<=MAXPA
31640 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72  THLEN );.    str
31650 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28 28 61  lcpy(dbPath, ((a
31660 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
31670 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
31680 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74  gContext)->dbPat
31690 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
316a0 20 20 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a    } else.#endif.
316b0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65    if( pFile->pMe
316c0 74 68 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b  thod == &dotlock
316d0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
316e0 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79   /* dot lock sty
316f0 6c 65 20 75 73 65 73 20 74 68 65 20 6c 6f 63 6b  le uses the lock
31700 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73  ing context to s
31710 74 6f 72 65 20 74 68 65 20 64 6f 74 20 6c 6f 63  tore the dot loc
31720 6b 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 70 61  k.    ** file pa
31730 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65  th */.    int le
31740 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72  n = strlen((char
31750 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
31760 67 43 6f 6e 74 65 78 74 29 20 2d 20 73 74 72 6c  gContext) - strl
31770 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  en(DOTLOCK_SUFFI
31780 58 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64  X);.    memcpy(d
31790 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70  bPath, (char *)p
317a0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
317b0 74 65 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a  text, len + 1);.
317c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
317d0 61 6c 6c 20 6f 74 68 65 72 20 73 74 79 6c 65 73  all other styles
317e0 20 75 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67   use the locking
317f0 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72   context to stor
31800 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 70 61  e the db file pa
31810 74 68 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  th */.    assert
31820 28 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29  ( strlen((char*)
31830 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
31840 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c  ntext)<=MAXPATHL
31850 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70  EN );.    strlcp
31860 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72 20  y(dbPath, (char 
31870 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
31880 43 6f 6e 74 65 78 74 2c 20 4d 41 58 50 41 54 48  Context, MAXPATH
31890 4c 45 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LEN);.  }.  retu
318a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
318b0 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20  ./*.** Takes an 
318c0 61 6c 72 65 61 64 79 20 66 69 6c 6c 65 64 20 69  already filled i
318d0 6e 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20  n unix file and 
318e0 61 6c 74 65 72 73 20 69 74 20 73 6f 20 61 6c 6c  alters it so all
318f0 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a   file locking .*
31900 2a 20 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72  * will be perfor
31910 6d 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  med on the local
31920 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
31930 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
31940 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70   fields.** are p
31950 72 65 73 65 72 76 65 64 20 69 6e 20 74 68 65 20  reserved in the 
31960 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
31970 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e  so that they can
31980 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
31990 20 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20 73 74   .** the unix st
319a0 72 75 63 74 75 72 65 20 70 72 6f 70 65 72 6c 79  ructure properly
319b0 20 63 6c 65 61 6e 65 64 20 75 70 20 61 74 20 63   cleaned up at c
319c0 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d  lose time:.**  -
319d0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a  >lockingContext.
319e0 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f  **  ->pMethod.*/
319f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
31a00 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
31a10 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  le(unixFile *pFi
31a20 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
31a30 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c  path) {.  proxyL
31a40 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
31a50 43 74 78 3b 0a 20 20 63 68 61 72 20 64 62 50 61  Ctx;.  char dbPa
31a60 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d  th[MAXPATHLEN+1]
31a70 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
31a80 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
31a90 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
31aa0 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20  lockPath=NULL;. 
31ab0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
31ac0 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46  _OK;.  .  if( pF
31ad0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
31ae0 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  NO_LOCK ){.    r
31af0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
31b00 59 3b 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47 65  Y;.  }.  proxyGe
31b10 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69  tDbPathForUnixFi
31b20 6c 65 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68  le(pFile, dbPath
31b30 29 3b 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c  );.  if( !path |
31b40 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20  | path[0]=='\0' 
31b50 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c  || !strcmp(path,
31b60 20 22 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20   ":auto:") ){.  
31b70 20 20 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b    lockPath=NULL;
31b80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f  .  }else{.    lo
31b90 63 6b 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70  ckPath=(char *)p
31ba0 61 74 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53  ath;.  }.  .  OS
31bb0 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f  TRACE(("TRANSPRO
31bc0 58 59 20 20 25 64 20 66 6f 72 20 25 73 20 70 69  XY  %d for %s pi
31bd0 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
31be0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c  h,.           (l
31bf0 6f 63 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61  ockPath ? lockPa
31c00 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20  th : ":auto:"), 
31c10 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 70  getpid()));..  p
31c20 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ctx = sqlite3_ma
31c30 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
31c40 74 78 29 20 29 3b 0a 20 20 69 66 28 20 70 43 74  tx) );.  if( pCt
31c50 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  x==0 ){.    retu
31c60 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
31c70 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43  .  }.  memset(pC
31c80 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  tx, 0, sizeof(*p
31c90 43 74 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70  Ctx));..  rc = p
31ca0 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50  roxyCreateConchP
31cb0 61 74 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20  athname(dbPath, 
31cc0 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  &pCtx->conchFile
31cd0 50 61 74 68 29 3b 0a 20 20 69 66 28 20 72 63 3d  Path);.  if( rc=
31ce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31cf0 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61    rc = proxyCrea
31d00 74 65 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d  teUnixFile(pCtx-
31d10 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20  >conchFilePath, 
31d20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  &pCtx->conchFile
31d30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
31d40 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
31d50 4e 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f 70  N && ((pFile->op
31d60 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20  enFlags&O_RDWR) 
31d70 3d 3d 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f  == 0) ){.      /
31d80 2a 20 69 66 20 28 61 29 20 74 68 65 20 6f 70 65  * if (a) the ope
31d90 6e 20 66 6c 61 67 73 20 61 72 65 20 6e 6f 74 20  n flags are not 
31da0 4f 5f 52 44 57 52 2c 20 28 62 29 20 74 68 65 20  O_RDWR, (b) the 
31db0 63 6f 6e 63 68 20 69 73 6e 27 74 20 74 68 65 72  conch isn't ther
31dc0 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  e, and.      ** 
31dd0 28 63 29 20 74 68 65 20 66 69 6c 65 20 73 79 73  (c) the file sys
31de0 74 65 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  tem is read-only
31df0 2c 20 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e 6f  , then enable no
31e00 2d 6c 6f 63 6b 69 6e 67 20 61 63 63 65 73 73 2e  -locking access.
31e10 0a 20 20 20 20 20 20 2a 2a 20 55 67 68 2c 20 73  .      ** Ugh, s
31e20 69 6e 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30  ince O_RDONLY==0
31e30 78 30 30 30 30 20 77 65 20 74 65 73 74 20 66 6f  x0000 we test fo
31e40 72 20 21 4f 5f 52 44 57 52 20 73 69 6e 63 65 20  r !O_RDWR since 
31e50 75 6e 69 78 4f 70 65 6e 20 61 73 73 65 72 74 73  unixOpen asserts
31e60 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f  .      ** that o
31e70 70 65 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68 61  penFlags will ha
31e80 76 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f  ve only one of O
31e90 5f 52 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44 57  _RDONLY or O_RDW
31ea0 52 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  R..      */.    
31eb0 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
31ec0 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74  fsInfo;.      st
31ed0 72 75 63 74 20 73 74 61 74 20 63 6f 6e 63 68 49  ruct stat conchI
31ee0 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 67  nfo;.      int g
31ef0 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a  oLockless = 0;..
31f00 20 20 20 20 20 20 69 66 28 20 73 74 61 74 28 70        if( stat(p
31f10 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
31f20 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20  th, &conchInfo) 
31f30 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20  == -1 ) {.      
31f40 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
31f50 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  o;.        if( (
31f60 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20  err==ENOENT) && 
31f70 28 73 74 61 74 66 73 28 64 62 50 61 74 68 2c 20  (statfs(dbPath, 
31f80 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20  &fsInfo) != -1) 
31f90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 4c  ){.          goL
31fa0 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e 66  ockless = (fsInf
31fb0 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44  o.f_flags&MNT_RD
31fc0 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f  ONLY) == MNT_RDO
31fd0 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  NLY;.        }. 
31fe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
31ff0 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20   goLockless ){. 
32000 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e         pCtx->con
32010 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20  chHeld = -1; /* 
32020 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f  read only FS/ lo
32030 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20  ckless */.      
32040 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
32050 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32060 20 20 7d 20 20 0a 20 20 69 66 28 20 72 63 3d 3d    }  .  if( rc==
32070 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63  SQLITE_OK && loc
32080 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74  kPath ){.    pCt
32090 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
320a0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
320b0 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b  up(0, lockPath);
320c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
320d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
320e0 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20   pCtx->dbPath = 
320f0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
32100 30 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 20 20  0, dbPath);.    
32110 69 66 28 20 70 43 74 78 2d 3e 64 62 50 61 74 68  if( pCtx->dbPath
32120 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ==NULL ){.      
32130 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
32140 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  M;.    }.  }.  i
32150 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32160 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d   ){.    /* all m
32170 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
32180 65 64 2c 20 70 72 6f 78 79 73 20 61 72 65 20 63  ed, proxys are c
32190 72 65 61 74 65 64 20 61 6e 64 20 61 73 73 69 67  reated and assig
321a0 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69  ned, .    ** swi
321b0 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  tch the locking 
321c0 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74  context and pMet
321d0 68 6f 64 20 74 68 65 6e 20 72 65 74 75 72 6e 2e  hod then return.
321e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 74 78  .    */.    pCtx
321f0 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ->oldLockingCont
32200 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ext = pFile->loc
32210 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
32220 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
32230 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20  ontext = pCtx;. 
32240 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74     pCtx->pOldMet
32250 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65  hod = pFile->pMe
32260 74 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d  thod;.    pFile-
32270 3e 70 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78  >pMethod = &prox
32280 79 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  yIoMethods;.  }e
32290 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74  lse{.    if( pCt
322a0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20  x->conchFile ){ 
322b0 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e  .      pCtx->con
322c0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
322d0 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
322e0 5f 66 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f  _file *)pCtx->co
322f0 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  nchFile);.      
32300 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
32310 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  x->conchFile);. 
32320 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
32330 44 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e  DbFree(0, pCtx->
32340 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a  lockProxyPath);.
32350 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
32360 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
32370 50 61 74 68 29 3b 20 0a 20 20 20 20 73 71 6c 69  Path); .    sqli
32380 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a  te3_free(pCtx);.
32390 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
323a0 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64 20 25  TRANSPROXY  %d %
323b0 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  s\n", pFile->h,.
323c0 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d             (rc==
323d0 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
323e0 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a   : "failed")));.
323f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
32400 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
32410 69 6e 65 20 68 61 6e 64 6c 65 73 20 73 71 6c 69  ine handles sqli
32420 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
32430 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 61 72  () calls that ar
32440 65 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  e specific.** to
32450 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a   proxy locking..
32460 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
32470 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  oxyFileControl(s
32480 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
32490 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
324a0 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20  Arg){.  switch( 
324b0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
324c0 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
324d0 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
324e0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
324f0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
32500 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c  ;.      if( pFil
32510 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70  e->pMethod == &p
32520 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b  roxyIoMethods ){
32530 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f  .        proxyLo
32540 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
32550 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
32560 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65  ngContext*)pFile
32570 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
32580 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 54  ;.        proxyT
32590 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  akeConch(pFile);
325a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74  .        if( pCt
325b0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
325c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28   ){.          *(
325d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41  const char **)pA
325e0 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  rg = pCtx->lockP
325f0 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20  roxyPath;.      
32600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32610 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20     *(const char 
32620 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61 75 74 6f  **)pArg = ":auto
32630 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20  : (not held)";. 
32640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32650 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
32660 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
32670 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  pArg = NULL;.   
32680 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
32690 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
326a0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
326b0 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
326c0 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  FILE: {.      un
326d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
326e0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
326f0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
32700 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
32710 6e 74 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20  nt isProxyStyle 
32720 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  = (pFile->pMetho
32730 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74  d == &proxyIoMet
32740 68 6f 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28  hods);.      if(
32750 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28   pArg==NULL || (
32760 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72  const char *)pAr
32770 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
32780 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65  if( isProxyStyle
32790 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
327a0 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20   turn off proxy 
327b0 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75  locking - not su
327c0 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 20  pported */.     
327d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
327e0 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f  _ERROR /*SQLITE_
327f0 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45  PROTOCOL? SQLITE
32800 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20  _MISUSE?*/;.    
32810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32820 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66       /* turn off
32830 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d   proxy locking -
32840 20 61 6c 72 65 61 64 79 20 6f 66 66 20 2d 20 4e   already off - N
32850 4f 4f 50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  OOP */.         
32860 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
32870 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32880 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32890 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78  const char *prox
328a0 79 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63  yPath = (const c
328b0 68 61 72 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  har *)pArg;.    
328c0 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53      if( isProxyS
328d0 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tyle ){.        
328e0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
328f0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 0a 20  ntext *pCtx = . 
32900 20 20 20 20 20 20 20 20 20 20 20 28 70 72 6f 78             (prox
32910 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
32920 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
32930 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  ontext;.        
32940 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 70 41    if( !strcmp(pA
32950 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20  rg, ":auto:") . 
32960 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 43            || (pC
32970 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
32980 68 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  h &&.           
32990 20 20 20 20 21 73 74 72 6e 63 6d 70 28 70 43 74      !strncmp(pCt
329a0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
329b0 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 4d 41 58  , proxyPath, MAX
329c0 50 41 54 48 4c 45 4e 29 29 0a 20 20 20 20 20 20  PATHLEN)).      
329d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
329e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
329f0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  K;.          }el
32a00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
32a10 72 63 20 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50  rc = switchLockP
32a20 72 6f 78 79 50 61 74 68 28 70 46 69 6c 65 2c 20  roxyPath(pFile, 
32a30 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  proxyPath);.    
32a40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32a50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
32a60 20 2f 2a 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78   /* turn on prox
32a70 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a  y file locking *
32a80 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
32a90 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
32aa0 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 70  nixFile(pFile, p
32ab0 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20  roxyPath);.     
32ac0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
32ad0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
32ae0 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
32af0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
32b00 20 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 63 61   0 );  /* The ca
32b10 6c 6c 20 61 73 73 75 72 65 73 20 74 68 61 74 20  ll assures that 
32b20 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70 63 6f 64  only valid opcod
32b30 65 73 20 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20  es are sent */. 
32b40 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
32b50 52 45 41 43 48 45 44 2a 2f 0a 20 20 72 65 74 75  REACHED*/.  retu
32b60 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
32b70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e  .}../*.** Within
32b80 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 20 28   this division (
32b90 74 68 65 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63  the proxying loc
32ba0 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
32bb0 69 6f 6e 29 20 74 68 65 20 70 72 6f 63 65 64 75  ion) the procedu
32bc0 72 65 73 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69  res.** above thi
32bd0 73 20 70 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20  s point are all 
32be0 75 74 69 6c 69 74 69 65 73 2e 20 20 54 68 65 20  utilities.  The 
32bf0 6c 6f 63 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74  lock-related met
32c00 68 6f 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70  hods of the.** p
32c10 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c  roxy-locking sql
32c20 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f  ite3_io_method o
32c30 62 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f  bject follow..*/
32c40 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
32c50 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
32c60 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
32c70 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
32c80 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
32c90 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
32ca0 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
32cb0 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
32cc0 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
32cd0 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
32ce0 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
32cf0 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
32d00 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
32d10 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
32d20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
32d30 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
32d40 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
32d50 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
32d60 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
32d70 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
32d80 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
32d90 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
32da0 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
32db0 74 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  t) {.  unixFile 
32dc0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
32dd0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
32de0 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63   = proxyTakeConc
32df0 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  h(pFile);.  if( 
32e00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
32e10 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
32e20 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
32e30 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
32e40 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
32e50 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
32e60 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
32e70 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20  chHeld>0 ){.    
32e80 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78    unixFile *prox
32e90 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
32ea0 6f 78 79 3b 0a 20 20 20 20 20 20 72 65 74 75 72  oxy;.      retur
32eb0 6e 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  n proxy->pMethod
32ec0 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  ->xCheckReserved
32ed0 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
32ee0 6c 65 2a 29 70 72 6f 78 79 2c 20 70 52 65 73 4f  le*)proxy, pResO
32ef0 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20  ut);.    }else{ 
32f00 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30  /* conchHeld < 0
32f10 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   is lockless */.
32f20 20 20 20 20 20 20 70 52 65 73 4f 75 74 3d 30 3b        pResOut=0;
32f30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
32f40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
32f50 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
32f60 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
32f70 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
32f80 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
32f90 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
32fa0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
32fb0 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
32fc0 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
32fd0 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
32fe0 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
32ff0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
33000 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
33010 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
33020 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
33030 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
33040 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
33050 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
33060 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
33070 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
33080 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
33090 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
330a0 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
330b0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
330c0 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
330d0 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
330e0 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
330f0 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
33100 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
33110 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
33120 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
33130 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
33140 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
33150 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
33160 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
33170 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
33180 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
33190 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
331a0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
331b0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
331c0 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
331d0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
331e0 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
331f0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
33200 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
33210 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
33220 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
33230 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
33240 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
33250 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
33260 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
33270 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c  tatic int proxyL
33280 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
33290 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
332a0 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
332b0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
332c0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
332d0 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f  rc = proxyTakeCo
332e0 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  nch(pFile);.  if
332f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33300 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  ){.    proxyLock
33310 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
33320 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
33330 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
33340 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
33350 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63  .    if( pCtx->c
33360 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20  onchHeld>0 ){.  
33370 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72      unixFile *pr
33380 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
33390 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20  Proxy;.      rc 
333a0 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  = proxy->pMethod
333b0 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
333c0 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46  _file*)proxy, eF
333d0 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  ileLock);.      
333e0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
333f0 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c   = proxy->eFileL
33400 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
33410 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65        /* conchHe
33420 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65  ld < 0 is lockle
33430 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  ss */.    }.  }.
33440 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
33450 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
33460 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
33470 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
33480 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
33490 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
334a0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
334b0 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
334c0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
334d0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
334e0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
334f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
33500 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
33510 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
33520 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
33530 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
33540 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
33550 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
33560 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
33570 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
33580 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
33590 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
335a0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
335b0 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b  nt rc = proxyTak
335c0 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
335d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
335e0 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c  OK ){.    proxyL
335f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
33600 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
33610 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
33620 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
33630 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78  xt;.    if( pCtx
33640 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b  ->conchHeld>0 ){
33650 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
33660 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  *proxy = pCtx->l
33670 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20  ockProxy;.      
33680 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74  rc = proxy->pMet
33690 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
336a0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78  lite3_file*)prox
336b0 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  y, eFileLock);. 
336c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
336d0 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65  eLock = proxy->e
336e0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65  FileLock;.    }e
336f0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f  lse{.      /* co
33700 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c  nchHeld < 0 is l
33710 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d  ockless */.    }
33720 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
33730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
33740 20 61 20 66 69 6c 65 20 74 68 61 74 20 75 73 65   a file that use
33750 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a  s proxy locks..*
33760 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
33770 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
33780 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
33790 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
337a0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
337b0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
337c0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
337d0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
337e0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
337f0 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
33800 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75  ngContext;.    u
33810 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
33820 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
33830 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69  roxy;.    unixFi
33840 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
33850 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
33860 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
33870 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20  LITE_OK;.    .  
33880 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20    if( lockProxy 
33890 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  ){.      rc = lo
338a0 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
338b0 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
338c0 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f  e3_file*)lockPro
338d0 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  xy, NO_LOCK);.  
338e0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
338f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63  urn rc;.      rc
33900 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d   = lockProxy->pM
33910 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73  ethod->xClose((s
33920 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63  qlite3_file*)loc
33930 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69  kProxy);.      i
33940 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
33950 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
33960 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29  _free(lockProxy)
33970 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f  ;.      pCtx->lo
33980 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20  ckProxy = 0;.   
33990 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68   }.    if( conch
339a0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  File ){.      if
339b0 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
339c0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  d ){.        rc 
339d0 3d 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f  = proxyReleaseCo
339e0 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nch(pFile);.    
339f0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
33a00 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
33a10 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
33a20 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
33a30 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
33a40 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b  ile*)conchFile);
33a50 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
33a60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
33a70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f   sqlite3_free(co
33a80 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  nchFile);.    }.
33a90 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
33aa0 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  e(0, pCtx->lockP
33ab0 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73  roxyPath);.    s
33ac0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
33ad0 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29  ->conchFilePath)
33ae0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
33af0 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 64 62 50  ree(0, pCtx->dbP
33b00 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73  ath);.    /* res
33b10 74 6f 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61  tore the origina
33b20 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  l locking contex
33b30 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68  t and pMethod th
33b40 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20  en close it */. 
33b50 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e     pFile->lockin
33b60 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 2d  gContext = pCtx-
33b70 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  >oldLockingConte
33b80 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  xt;.    pFile->p
33b90 4d 65 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70  Method = pCtx->p
33ba0 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73  OldMethod;.    s
33bb0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
33bc0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 46  );.    return pF
33bd0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  ile->pMethod->xC
33be0 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  lose(id);.  }.  
33bf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
33c00 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a  ;.}....#endif /*
33c10 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
33c20 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
33c30 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
33c40 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
33c50 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74  proxy locking st
33c60 79 6c 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  yle is intended 
33c70 66 6f 72 20 75 73 65 20 77 69 74 68 20 41 46 50  for use with AFP
33c80 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a   filesystems..**
33c90 20 41 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69   And since AFP i
33ca0 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64  s only supported
33cb0 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20   on MacOSX, the 
33cc0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
33cd0 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63   also.** restric
33ce0 74 65 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a  ted to MacOSX..*
33cf0 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  * .**.**********
33d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
33d10 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
33d20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
33d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d40 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
33d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d90 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ****/../*.** Ini
33da0 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72  tialize the oper
33db0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
33dc0 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  erface..**.** Th
33dd0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73  is routine regis
33de0 74 65 72 73 20 61 6c 6c 20 56 46 53 20 69 6d 70  ters all VFS imp
33df0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72  lementations for
33e00 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61   unix-like opera
33e10 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e  ting.** systems.
33e20 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 2c 20    This routine, 
33e30 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f  and the sqlite3_
33e40 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e 65  os_end() routine
33e50 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a   that follows,.*
33e60 2a 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  * should be the 
33e70 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73 20 69 6e  only routines in
33e80 20 74 68 69 73 20 66 69 6c 65 20 74 68 61 74 20   this file that 
33e90 61 72 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d  are visible from
33ea0 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e   other.** files.
33eb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
33ec0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
33ed0 63 65 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65  ce during SQLite
33ee0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
33ef0 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67  and by a.** sing
33f00 6c 65 20 74 68 72 65 61 64 2e 20 20 54 68 65 20  le thread.  The 
33f10 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
33f20 6e 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73  n and mutex subs
33f30 79 73 74 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a  ystems have not.
33f40 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62  ** necessarily b
33f50 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
33f60 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
33f70 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64  e is called, and
33f80 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75   so they.** shou
33f90 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a  ld not be used..
33fa0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
33fb0 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20  s_init(void){ . 
33fc0 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f   /* .  ** The fo
33fd0 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64 65  llowing macro de
33fe0 66 69 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c  fines an initial
33ff0 69 7a 65 72 20 66 6f 72 20 61 6e 20 73 71 6c 69  izer for an sqli
34000 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
34010 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66    ** The name of
34020 20 74 68 65 20 56 46 53 20 69 73 20 4e 41 4d 45   the VFS is NAME
34030 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 20  .  The pAppData 
34040 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
34050 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74  a pointer.  ** t
34060 6f 20 74 68 65 20 22 66 69 6e 64 65 72 22 20 66  o the "finder" f
34070 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41 70 70 44  unction.  (pAppD
34080 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ata is a pointer
34090 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 62 65   to a pointer be
340a0 63 61 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c 79  cause.  ** silly
340b0 20 43 39 30 20 72 75 6c 65 73 20 70 72 6f 68 69   C90 rules prohi
340c0 62 69 74 20 61 20 76 6f 69 64 2a 20 66 72 6f 6d  bit a void* from
340d0 20 62 65 69 6e 67 20 63 61 73 74 20 74 6f 20 61   being cast to a
340e0 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
340f0 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77 65  r.  ** and so we
34100 20 68 61 76 65 20 74 6f 20 67 6f 20 74 68 72 6f   have to go thro
34110 75 67 68 20 74 68 65 20 69 6e 74 65 72 6d 65 64  ugh the intermed
34120 69 61 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  iate pointer to 
34130 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20  avoid problems. 
34140 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
34150 6e 67 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  ng with -pedanti
34160 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47 43 43 2e  c-errors on GCC.
34170 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
34180 46 49 4e 44 45 52 20 70 61 72 61 6d 65 74 65 72  FINDER parameter
34190 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69   to this macro i
341a0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
341b0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
341c0 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e  .  ** finder-fun
341d0 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64  ction.  The find
341e0 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  er-function retu
341f0 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
34200 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
34210 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
34220 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
34230 74 73 20 74 68 65 20 64 65 73 69 72 65 64 20 6c  ts the desired l
34240 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61  ocking.  ** beha
34250 76 69 6f 72 73 2e 20 20 53 65 65 20 74 68 65 20  viors.  See the 
34260 64 69 76 69 73 69 6f 6e 20 61 62 6f 76 65 20 74  division above t
34270 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
34280 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20   IOMETHODS.  ** 
34290 6d 61 63 72 6f 20 66 6f 72 20 61 64 64 69 74 69  macro for additi
342a0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  on information o
342b0 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  n finder-functio
342c0 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ns..  **.  ** Mo
342d0 73 74 20 66 69 6e 64 65 72 73 20 73 69 6d 70 6c  st finders simpl
342e0 79 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  y return a point
342f0 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
34300 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
34310 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42  .  ** object.  B
34320 75 74 20 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b  ut the "autolock
34330 49 6f 46 69 6e 64 65 72 22 20 61 76 61 69 6c 61  IoFinder" availa
34340 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f  ble on MacOSX do
34350 65 73 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a  es a little.  **
34360 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 61 74 3b   more than that;
34370 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65   it looks at the
34380 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   filesystem type
34390 20 74 68 61 74 20 68 6f 73 74 73 20 74 68 65 20   that hosts the 
343a0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
343b0 69 6c 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f  ile and tries to
343c0 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69   choose an locki
343d0 6e 67 20 6d 65 74 68 6f 64 20 61 70 70 72 6f 70  ng method approp
343e0 72 69 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74  riate for.  ** t
343f0 68 61 74 20 66 69 6c 65 73 79 73 74 65 6d 20 74  hat filesystem t
34400 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66  ime..  */.  #def
34410 69 6e 65 20 55 4e 49 58 56 46 53 28 56 46 53 4e  ine UNIXVFS(VFSN
34420 41 4d 45 2c 20 46 49 4e 44 45 52 29 20 7b 20 20  AME, FINDER) {  
34430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34440 20 20 20 20 20 20 5c 0a 20 20 20 20 32 2c 20 20        \.    2,  
34450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34460 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
34470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34480 20 20 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66      \.    sizeof
34490 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20  (unixFile),     
344a0 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20  /* szOsFile */  
344b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
344c0 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48    \.    MAX_PATH
344d0 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a  NAME,         /*
344e0 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20   mxPathname */  
344f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34500 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  \.    0,        
34510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
34520 4e 65 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20  Next */         
34530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
34540 20 20 20 20 56 46 53 4e 41 4d 45 2c 20 20 20 20      VFSNAME,    
34550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
34560 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
34570 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
34580 20 20 28 76 6f 69 64 2a 29 26 46 49 4e 44 45 52    (void*)&FINDER
34590 2c 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44  ,       /* pAppD
345a0 61 74 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ata */          
345b0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
345c0 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20  unixOpen,       
345d0 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
345e0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
345f0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
34600 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  ixDelete,       
34610 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
34620 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
34630 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
34640 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
34650 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20    /* xAccess */ 
34660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34670 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75      \.    unixFu
34680 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
34690 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
346a0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
346b0 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70    \.    unixDlOp
346c0 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  en,           /*
346d0 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20   xDlOpen */     
346e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346f0 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f  \.    unixDlErro
34700 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  r,          /* x
34710 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20  DlError */      
34720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
34730 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20      unixDlSym,  
34740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
34750 53 79 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20  Sym */          
34760 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
34770 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20    unixDlClose,  
34780 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
34790 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
347a0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
347b0 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20  unixRandomness, 
347c0 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
347d0 6e 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ness */         
347e0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
347f0 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  ixSleep,        
34800 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
34810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34820 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
34830 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
34840 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
34850 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
34860 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65      \.    unixGe
34870 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
34880 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
34890 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
348a0 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75 72 72    \.    unixCurr
348b0 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a  entTimeInt64, /*
348c0 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
348d0 36 34 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  64 */           
348e0 5c 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  \.  }..  /*.  **
348f0 20 41 6c 6c 20 64 65 66 61 75 6c 74 20 56 46 53   All default VFS
34900 65 73 20 66 6f 72 20 75 6e 69 78 20 61 72 65 20  es for unix are 
34910 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
34920 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79   following array
34930 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
34940 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
34950 33 5f 76 66 73 2e 70 4e 65 78 74 20 66 69 65 6c  3_vfs.pNext fiel
34960 64 20 6f 66 20 74 68 65 20 56 46 53 20 6f 62 6a  d of the VFS obj
34970 65 63 74 20 69 73 20 6d 6f 64 69 66 69 65 64 0a  ect is modified.
34980 20 20 2a 2a 20 62 79 20 74 68 65 20 53 51 4c 69    ** by the SQLi
34990 74 65 20 63 6f 72 65 20 77 68 65 6e 20 74 68 65  te core when the
349a0 20 56 46 53 20 69 73 20 72 65 67 69 73 74 65 72   VFS is register
349b0 65 64 2e 20 20 53 6f 20 74 68 65 20 66 6f 6c 6c  ed.  So the foll
349c0 6f 77 69 6e 67 0a 20 20 2a 2a 20 61 72 72 61 79  owing.  ** array
349d0 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74   cannot be const
349e0 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ..  */.  static 
349f0 73 71 6c 69 74 65 33 5f 76 66 73 20 61 56 66 73  sqlite3_vfs aVfs
34a00 5b 5d 20 3d 20 7b 0a 23 69 66 20 53 51 4c 49 54  [] = {.#if SQLIT
34a10 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
34a20 5f 53 54 59 4c 45 20 26 26 20 28 4f 53 5f 56 58  _STYLE && (OS_VX
34a30 57 4f 52 4b 53 20 7c 7c 20 64 65 66 69 6e 65 64  WORKS || defined
34a40 28 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a 20 20 20  (__APPLE__)).   
34a50 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22 2c   UNIXVFS("unix",
34a60 20 20 20 20 20 20 20 20 20 20 61 75 74 6f 6c 6f            autolo
34a70 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  ckIoFinder ),.#e
34a80 6c 73 65 0a 20 20 20 20 55 4e 49 58 56 46 53 28  lse.    UNIXVFS(
34a90 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20  "unix",         
34aa0 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29   posixIoFinder )
34ab0 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 55 4e 49  ,.#endif.    UNI
34ac0 58 56 46 53 28 22 75 6e 69 78 2d 6e 6f 6e 65 22  XVFS("unix-none"
34ad0 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69  ,     nolockIoFi
34ae0 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58  nder ),.    UNIX
34af0 56 46 53 28 22 75 6e 69 78 2d 64 6f 74 66 69 6c  VFS("unix-dotfil
34b00 65 22 2c 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69  e",  dotlockIoFi
34b10 6e 64 65 72 20 29 2c 0a 23 69 66 20 4f 53 5f 56  nder ),.#if OS_V
34b20 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58 56  XWORKS.    UNIXV
34b30 46 53 28 22 75 6e 69 78 2d 6e 61 6d 65 64 73 65  FS("unix-namedse
34b40 6d 22 2c 20 73 65 6d 49 6f 46 69 6e 64 65 72 20  m", semIoFinder 
34b50 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  ),.#endif.#if SQ
34b60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
34b70 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 55 4e  ING_STYLE.    UN
34b80 49 58 56 46 53 28 22 75 6e 69 78 2d 70 6f 73 69  IXVFS("unix-posi
34b90 78 22 2c 20 20 20 20 70 6f 73 69 78 49 6f 46 69  x",    posixIoFi
34ba0 6e 64 65 72 20 29 2c 0a 23 69 66 20 21 4f 53 5f  nder ),.#if !OS_
34bb0 56 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58  VXWORKS.    UNIX
34bc0 56 46 53 28 22 75 6e 69 78 2d 66 6c 6f 63 6b 22  VFS("unix-flock"
34bd0 2c 20 20 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64  ,    flockIoFind
34be0 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23 65 6e  er ),.#endif.#en
34bf0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
34c00 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
34c10 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
34c20 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 55 4e  _APPLE__).    UN
34c30 49 58 56 46 53 28 22 75 6e 69 78 2d 61 66 70 22  IXVFS("unix-afp"
34c40 2c 20 20 20 20 20 20 61 66 70 49 6f 46 69 6e 64  ,      afpIoFind
34c50 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46  er ),.    UNIXVF
34c60 53 28 22 75 6e 69 78 2d 6e 66 73 22 2c 20 20 20  S("unix-nfs",   
34c70 20 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 20 29     nfsIoFinder )
34c80 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
34c90 6e 69 78 2d 70 72 6f 78 79 22 2c 20 20 20 20 70  nix-proxy",    p
34ca0 72 6f 78 79 49 6f 46 69 6e 64 65 72 20 29 2c 0a  roxyIoFinder ),.
34cb0 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 75 6e  #endif.  };.  un
34cc0 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 20 20 20  signed int i;   
34cd0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
34ce0 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20  ounter */..  /* 
34cf0 52 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53  Register all VFS
34d00 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68  es defined in th
34d10 65 20 61 56 66 73 5b 5d 20 61 72 72 61 79 20 2a  e aVfs[] array *
34d20 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28  /.  for(i=0; i<(
34d30 73 69 7a 65 6f 66 28 61 56 66 73 29 2f 73 69 7a  sizeof(aVfs)/siz
34d40 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29  eof(sqlite3_vfs)
34d50 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ); i++){.    sql
34d60 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
34d70 72 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d 3d 30  r(&aVfs[i], i==0
34d80 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
34d90 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f  SQLITE_OK; .}../
34da0 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
34db0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
34dc0 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  em interface..**
34dd0 0a 2a 2a 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  .** Some operati
34de0 6e 67 20 73 79 73 74 65 6d 73 20 6d 69 67 68 74  ng systems might
34df0 20 6e 65 65 64 20 74 6f 20 64 6f 20 73 6f 6d 65   need to do some
34e00 20 63 6c 65 61 6e 75 70 20 69 6e 20 74 68 69 73   cleanup in this
34e10 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74 6f 20   routine,.** to 
34e20 72 65 6c 65 61 73 65 20 64 79 6e 61 6d 69 63 61  release dynamica
34e30 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62  lly allocated ob
34e40 6a 65 63 74 73 2e 20 20 42 75 74 20 6e 6f 74 20  jects.  But not 
34e50 6f 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54 68 69 73  on unix..** This
34e60 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
34e70 2d 6f 70 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f  -op for unix..*/
34e80 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
34e90 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20 72 65  end(void){ .  re
34ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
34eb0 0a 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .}. .#endif /* S
34ec0 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 2a 2f  QLITE_OS_UNIX */
34ed0 0a                                               .