/ Hex Artifact Content
Login

Artifact 6d4a58d81ad4b782406519f3790202f330e89bb7:


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 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1b60: 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20   ctrlFlags;     
1b70: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1b80: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1b90: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1ba0: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1bd0: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1be0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1bf0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1c00: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1c10: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1c20: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1c30: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1c40: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c60: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1c70: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1c80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c90: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1ca0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1cb0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1cc0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1cf0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1d00: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1d10: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d40: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d50: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d60: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d70: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1d80: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1da0: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1db0: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1dc0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1dd0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1de0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1df0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1e00: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e30: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e40: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e50: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1e60: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1e90: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1ea0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1eb0: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1ec0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
1ed0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
1ee0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ef0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1f00: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1f10: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1f20: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1f30: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1f40: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1f50: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1f60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1f70: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1f80: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1f90: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1fa0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1fb0: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1fc0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1fd0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1fe0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1ff0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
2000: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
2010: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2020: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2030: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2040: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2050: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2060: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2070: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
2080: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
2090: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
20a0: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
20b0: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
20c0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
20d0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
20e0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
20f0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
2100: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2110: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2120: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2130: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2140: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2150: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2160: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
2170: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2180: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2190: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
21a0: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
21b0: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
21c0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
21d0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
21e0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
21f0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
2200: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
2210: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2220: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2230: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
2240: 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65  for the unixFile
2250: 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61  .ctrlFlags bitma
2260: 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  sk:.*/.#define U
2270: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 30  NIXFILE_EXCL   0
2280: 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  x01     /* Conne
2290: 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20  ctions from one 
22a0: 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a  process only */.
22b0: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
22c0: 5f 52 44 4f 4e 4c 59 20 30 78 30 32 20 20 20 20  _RDONLY 0x02    
22d0: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
22e0: 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 0a  s read only */..
22f0: 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f  /*.** Include co
2300: 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f  de that is commo
2310: 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20  n to all os_*.c 
2320: 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64  files.*/.#includ
2330: 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a  e "os_common.h".
2340: 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61  ./*.** Define va
2350: 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61  rious macros tha
2360: 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72  t are missing fr
2370: 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e  om some systems.
2380: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41  .*/.#ifndef O_LA
2390: 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65  RGEFILE.# define
23a0: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23   O_LARGEFILE 0.#
23b0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
23c0: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a  ITE_DISABLE_LFS.
23d0: 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46  # undef O_LARGEF
23e0: 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c  ILE.# define O_L
23f0: 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69  ARGEFILE 0.#endi
2400: 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f  f.#ifndef O_NOFO
2410: 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f  LLOW.# define O_
2420: 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69  NOFOLLOW 0.#endi
2430: 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41  f.#ifndef O_BINA
2440: 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49  RY.# define O_BI
2450: 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  NARY 0.#endif../
2460: 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69  *.** The threadi
2470: 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73  d macro resolves
2480: 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69   to the thread-i
2490: 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64  d or to 0.  Used
24a0: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
24b0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
24c0: 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ly..*/.#if SQLIT
24d0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65  E_THREADSAFE.#de
24e0: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74  fine threadid pt
24f0: 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c  hread_self().#el
2500: 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61  se.#define threa
2510: 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  did 0.#endif../*
2520: 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 55 6e  .** Different Un
2530: 69 78 20 73 79 73 74 65 6d 73 20 64 65 63 6c 61  ix systems decla
2540: 72 65 20 6f 70 65 6e 28 29 20 69 6e 20 64 69 66  re open() in dif
2550: 66 65 72 65 6e 74 20 77 61 79 73 2e 20 20 53 61  ferent ways.  Sa
2560: 6d 65 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63  me use.** open(c
2570: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d  onst char*,int,m
2580: 6f 64 65 5f 74 29 2e 20 20 4f 74 68 65 72 73 20  ode_t).  Others 
2590: 75 73 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63  use open(const c
25a0: 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a  har*,int,...)..*
25b0: 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
25c0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 77 68   is important wh
25d0: 65 6e 20 75 73 69 6e 67 20 61 20 70 6f 69 6e 74  en using a point
25e0: 65 72 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  er to the functi
25f0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  on..**.** The sa
2600: 66 65 73 74 20 77 61 79 20 74 6f 20 64 65 61 6c  fest way to deal
2610: 20 77 69 74 68 20 74 68 65 20 70 72 6f 62 6c 65   with the proble
2620: 6d 20 69 73 20 74 6f 20 61 6c 77 61 79 73 20 75  m is to always u
2630: 73 65 20 74 68 69 73 20 77 72 61 70 70 65 72 0a  se this wrapper.
2640: 2a 2a 20 77 68 69 63 68 20 61 6c 77 61 79 73 20  ** which always 
2650: 68 61 73 20 74 68 65 20 73 61 6d 65 20 77 65 6c  has the same wel
2660: 6c 2d 64 65 66 69 6e 65 64 20 69 6e 74 65 72 66  l-defined interf
2670: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
2680: 6e 74 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e  nt posixOpen(con
2690: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  st char *zFile, 
26a0: 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d  int flags, int m
26b0: 6f 64 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f  ode){.  return o
26c0: 70 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73  pen(zFile, flags
26d0: 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , mode);.}../*.*
26e0: 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61  * Many system ca
26f0: 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64  lls are accessed
2700: 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72   through pointer
2710: 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f  -to-functions so
2720: 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61   that.** they ma
2730: 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  y be overridden 
2740: 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61  at runtime to fa
2750: 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69  cilitate fault i
2760: 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a  njection during.
2770: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73  ** testing and s
2780: 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20  andboxing.  The 
2790: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20  following array 
27a0: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20  holds the names 
27b0: 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  and pointers.** 
27c0: 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61  to all overridea
27d0: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
27e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
27f0: 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20  ct unix_syscall 
2800: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2810: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
2820: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2830: 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20   sytem call */. 
2840: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
2850: 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f  _ptr pCurrent; /
2860: 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * Current value 
2870: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
2880: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
2890: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66  syscall_ptr pDef
28a0: 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74  ault; /* Default
28b0: 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73   value */.} aSys
28c0: 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22  call[] = {.  { "
28d0: 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28  open",         (
28e0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
28f0: 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20  ptr)posixOpen,  
2900: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2910: 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28  Open      ((int(
2920: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
2930: 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  nt,int))aSyscall
2940: 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [0].pCurrent).. 
2950: 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20   { "close",     
2960: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2970: 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20  all_ptr)close,  
2980: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2990: 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28  e osClose     ((
29a0: 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73  int(*)(int))aSys
29b0: 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74  call[1].pCurrent
29c0: 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c  )..  { "access",
29d0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
29e0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65  syscall_ptr)acce
29f0: 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ss,     0  },.#d
2a00: 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20  efine osAccess  
2a10: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
2a20: 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73   char*,int))aSys
2a30: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
2a40: 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c  )..  { "getcwd",
2a50: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2a60: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63  syscall_ptr)getc
2a70: 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  wd,     0  },.#d
2a80: 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20  efine osGetcwd  
2a90: 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61    ((char*(*)(cha
2aa0: 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  r*,size_t))aSysc
2ab0: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
2ac0: 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20  ..  { "stat",   
2ad0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
2ae0: 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c  yscall_ptr)stat,
2af0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65         0  },.#de
2b00: 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20  fine osStat     
2b10: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
2b20: 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61  char*,struct sta
2b30: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e  t*))aSyscall[4].
2b40: 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a  pCurrent)../*.**
2b50: 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69   The DJGPP compi
2b60: 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ler environment 
2b70: 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b  looks mostly lik
2b80: 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a  e Unix, but it.*
2b90: 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74  * lacks the fcnt
2ba0: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  l() system call.
2bb0: 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63    So redefine fc
2bc0: 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65  ntl() to be some
2bd0: 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c  thing.** that al
2be0: 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20  ways succeeds.  
2bf0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
2c00: 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74  locking does not
2c10: 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20   occur under.** 
2c20: 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69  DJGPP.  But it i
2c30: 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64  s DOS - what did
2c40: 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a   you expect?.*/.
2c50: 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  #ifdef __DJGPP__
2c60: 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20  .  { "fstat",   
2c70: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
2c80: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64          0  },.#d
2c90: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c  efine osFstat(a,
2ca0: 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20  b,c)    0.#else 
2cb0: 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22      .  { "fstat"
2cc0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
2cd0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73  3_syscall_ptr)fs
2ce0: 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  tat,      0  },.
2cf0: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20  #define osFstat 
2d00: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
2d10: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
2d20: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
2d30: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b  ent).#endif..  {
2d40: 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20   "ftruncate",   
2d50: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
2d60: 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c  l_ptr)ftruncate,
2d70: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
2d80: 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e  osFtruncate ((in
2d90: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29  t(*)(int,off_t))
2da0: 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72  aSyscall[6].pCur
2db0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74  rent)..  { "fcnt
2dc0: 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  l",        (sqli
2dd0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2de0: 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d  fcntl,      0  }
2df0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  ,.#define osFcnt
2e00: 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  l     ((int(*)(i
2e10: 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73  nt,int,...))aSys
2e20: 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74  call[7].pCurrent
2e30: 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20  )..  { "read",  
2e40: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2e50: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64  syscall_ptr)read
2e60: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
2e70: 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20  efine osRead    
2e80: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
2e90: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  nt,void*,size_t)
2ea0: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
2eb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
2ec0: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
2ed0: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
2ee0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2ef0: 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20  { "pread",      
2f00: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
2f10: 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20  ll_ptr)pread,   
2f20: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
2f30: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
2f40: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2f50: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
2f60: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
2f70: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
2f80: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
2f90: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
2fa0: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
2fb0: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
2fc0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
2fd0: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
2fe0: 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73  read64",      (s
2ff0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3000: 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20 30  tr)pread64,    0
3010: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
3020: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3030: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3040: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3050: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3060: 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20 20  fine osPread64  
3070: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3080: 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t,void*,size_t,o
3090: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
30a0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
30b0: 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20 20  { "write",      
30c0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
30d0: 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20  ll_ptr)write,   
30e0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
30f0: 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28 73   osWrite     ((s
3100: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
3110: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
3120: 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70  ))aSyscall[11].p
3130: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3140: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
3150: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
3160: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
3170: 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20    { "pwrite",   
3180: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3190: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c  call_ptr)pwrite,
31a0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
31b0: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
31c0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
31d0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
31e0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
31f0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
3200: 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ite    ((ssize_t
3210: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3220: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3230: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3240: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3250: 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [12].pCurrent)..
3260: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
3270: 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77  PREAD64).  { "pw
3280: 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71  rite64",     (sq
3290: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
32a0: 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30 20  r)pwrite64,   0 
32b0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
32c0: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
32d0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
32e0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
32f0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3300: 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20 20  ine osPwrite64  
3310: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3320: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a  ,const void*,siz
3330: 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20  e_t,off_t))\.   
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3350: 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43   aSyscall[13].pC
3360: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
3370: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
3380: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 66 63  NG_STYLE.  { "fc
3390: 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71  hmod",       (sq
33a0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
33b0: 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 30 20  r)fchmod,     0 
33c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66   },.#else.  { "f
33d0: 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73  chmod",       (s
33e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
33f0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3400: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3410: 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20  ine osFchmod    
3420: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64  ((int(*)(int,mod
3430: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  e_t))aSyscall[14
3440: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3450: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
3460: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
3470: 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
3480: 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c  LOCATE.  { "fall
3490: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
34a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
34b0: 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c  posix_fallocate,
34c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
34d0: 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20   "fallocate",   
34e0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
34f0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
3500: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3510: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61  dif.#define osFa
3520: 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29  llocate ((int(*)
3530: 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74  (int,off_t,off_t
3540: 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70  ))aSyscall[15].p
3550: 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20  Current)..}; /* 
3560: 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72  End of the overr
3570: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
3580: 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  alls */../*.** T
3590: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
35a0: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
35b0: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
35c0: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
35d0: 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73  .** "unix" VFSes
35e0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
35f0: 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73  _OK opon success
3600: 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74  fully updating t
3610: 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  he.** system cal
3620: 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51  l pointer, or SQ
3630: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66  LITE_NOTFOUND if
3640: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e   there is no con
3650: 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73  figurable.** sys
3660: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a  tem call named z
3670: 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Name..*/.static 
3680: 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65  int unixSetSyste
3690: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
36a0: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
36b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
36c0: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
36d0: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
36e0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
36f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
3700: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
3710: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
3720: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3730: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
3740: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
3750: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
3760: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
3770: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
3780: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
3790: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
37a0: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
37b0: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
37c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
37d0: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
37e0: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
37f0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
3800: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
3810: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
3820: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
3830: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
3840: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
3850: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
3860: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
3870: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
3880: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
3890: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
38a0: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
38b0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
38c0: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
38d0: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
38e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
38f0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
3900: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
3910: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
3920: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
3930: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
3940: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
3950: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
3960: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
3970: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
3980: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
3990: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
39a0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
39b0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
39c0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
39d0: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
39e0: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
39f0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
3a00: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
3a10: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
3a20: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
3a30: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
3a40: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
3a50: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
3a60: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
3a70: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
3a80: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
3a90: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
3aa0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3ab0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
3ac0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3ad0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
3ae0: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
3af0: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
3b00: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
3b10: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
3b20: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
3b30: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
3b40: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
3b50: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
3b60: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
3b70: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
3b80: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
3b90: 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74  call_ptr unixGet
3ba0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
3bb0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
3bc0: 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sed,.  const cha
3bd0: 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e  r *zName.){.  un
3be0: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20  signed int i;.. 
3bf0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
3c00: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66  R(pNotUsed);.  f
3c10: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
3c20: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
3c30: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
3c40: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
3c50: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
3c60: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
3c70: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
3c80: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
3c90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3ca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3cb0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
3cc0: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
3cd0: 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20  ll after zName. 
3ce0: 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a   If zName==NULL.
3cf0: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  ** then return t
3d00: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
3d10: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
3d20: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
3d30: 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68  f zName.** is th
3d40: 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61  e last system ca
3d50: 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69  ll or if zName i
3d60: 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f  s not the name o
3d70: 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73  f a valid.** sys
3d80: 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  tem call..*/.sta
3d90: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
3da0: 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61  unixNextSystemCa
3db0: 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ll(sqlite3_vfs *
3dc0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
3dd0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
3de0: 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50   -1;..  UNUSED_P
3df0: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69  ARAMETER(p);.  i
3e00: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
3e10: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
3e20: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31  Size(aSyscall)-1
3e30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
3e40: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
3e50: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
3e60: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
3e70: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
3e80: 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  ++; i<ArraySize(
3e90: 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b  aSyscall); i++){
3ea0: 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c  .    if( aSyscal
3eb0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30  l[i].pCurrent!=0
3ec0: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
3ed0: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d  ll[i].zName;.  }
3ee0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3ef0: 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 6f 70 65 6e  /*.** Retry open
3f00: 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
3f10: 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a  il due to EINTR.
3f20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  */.static int ro
3f30: 62 75 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20  bust_open(const 
3f40: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20  char *z, int f, 
3f50: 69 6e 74 20 6d 29 7b 0a 20 20 69 6e 74 20 72 63  int m){.  int rc
3f60: 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 4f  ;.  do{ rc = osO
3f70: 70 65 6e 28 7a 2c 66 2c 6d 29 3b 20 7d 77 68 69  pen(z,f,m); }whi
3f80: 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
3f90: 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65  o==EINTR );.  re
3fa0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3fb0: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
3fc0: 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64  ns to obtain and
3fd0: 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20   relinquish the 
3fe0: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68  global mutex. Th
3ff0: 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65  e.** global mute
4000: 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  x is used to pro
4010: 74 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f  tect the unixIno
4020: 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78  deInfo and.** vx
4030: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
4040: 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69 73  cts used by this
4050: 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68   file, all of wh
4060: 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73  ich may be .** s
4070: 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c  hared by multipl
4080: 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a  e threads..**.**
4090: 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75   Function unixMu
40a0: 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65  texHeld() is use
40b0: 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  d to assert() th
40c0: 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  at the global mu
40d0: 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20  tex .** is held 
40e0: 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54  when required. T
40f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
4100: 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72  only used as par
4110: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a  t of assert() .*
4120: 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e  * statements. e.
4130: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45  g..**.**   unixE
4140: 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20  nterMutex().**  
4150: 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d     assert( unixM
4160: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a  utexHeld() );.**
4170: 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76     unixEnterLeav
4180: 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e().*/.static vo
4190: 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  id unixEnterMute
41a0: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
41b0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
41c0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
41d0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
41e0: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
41f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
4200: 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  xLeaveMutex(void
4210: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
4220: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
4230: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
4240: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
4250: 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65  ASTER));.}.#ifde
4260: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
4270: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75  tatic int unixMu
4280: 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a  texHeld(void) {.
4290: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
42a0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69  _mutex_held(sqli
42b0: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
42c0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
42d0: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65  C_MASTER));.}.#e
42e0: 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51  ndif...#ifdef SQ
42f0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
4300: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
4310: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75   for printing ou
4320: 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74  t trace informat
4330: 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69  ion from debuggi
4340: 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20  ng.** binaries. 
4350: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
4360: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74   string represet
4370: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70  ation of the sup
4380: 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  plied.** integer
4390: 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73   lock-type..*/.s
43a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
43b0: 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74   *azFileLock(int
43c0: 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73   eFileLock){.  s
43d0: 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b  witch( eFileLock
43e0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f   ){.    case NO_
43f0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f  LOCK: return "NO
4400: 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48  NE";.    case SH
4410: 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  ARED_LOCK: retur
4420: 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20  n "SHARED";.    
4430: 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f  case RESERVED_LO
4440: 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45  CK: return "RESE
4450: 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20  RVED";.    case 
4460: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65  PENDING_LOCK: re
4470: 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a  turn "PENDING";.
4480: 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49      case EXCLUSI
4490: 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  VE_LOCK: return 
44a0: 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d  "EXCLUSIVE";.  }
44b0: 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52  .  return "ERROR
44c0: 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ";.}.#endif..#if
44d0: 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  def SQLITE_LOCK_
44e0: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  TRACE./*.** Prin
44f0: 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f  t out informatio
4500: 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b  n about all lock
4510: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ing operations..
4520: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
4530: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
4540: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c  roubleshooting l
4550: 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72  ocks on multithr
4560: 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72  eaded.** platfor
4570: 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63  ms.  Enable by c
4580: 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68  ompiling with th
4590: 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  e -DSQLITE_LOCK_
45a0: 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64  TRACE.** command
45b0: 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20  -line option on 
45c0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54  the compiler.  T
45d0: 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d  his code is norm
45e0: 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f  ally.** turned o
45f0: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ff..*/.static in
4600: 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20  t lockTrace(int 
4610: 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75  fd, int op, stru
4620: 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20  ct flock *p){.  
4630: 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a  char *zOpName, *
4640: 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a  zType;.  int s;.
4650: 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f    int savedErrno
4660: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45  ;.  if( op==F_GE
4670: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
4680: 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20  me = "GETLK";.  
4690: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f  }else if( op==F_
46a0: 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70  SETLK ){.    zOp
46b0: 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a  Name = "SETLK";.
46c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d    }else{.    s =
46d0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
46e0: 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   p);.    sqlite3
46f0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
4700: 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64  tl unknown %d %d
4710: 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20   %d\n", fd, op, 
4720: 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  s);.    return s
4730: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c  ;.  }.  if( p->l
4740: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  _type==F_RDLCK )
4750: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52  {.    zType = "R
4760: 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  DLCK";.  }else i
4770: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
4780: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  WRLCK ){.    zTy
4790: 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20  pe = "WRLCK";.  
47a0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
47b0: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
47c0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c      zType = "UNL
47d0: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  CK";.  }else{.  
47e0: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
47f0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
4800: 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53  l_whence==SEEK_S
4810: 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63  ET );.  s = osFc
4820: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
4830: 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65    savedErrno = e
4840: 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44  rrno;.  sqlite3D
4850: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
4860: 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64  l %d %d %s %s %d
4870: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
4880: 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c     threadid, fd,
4890: 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c   zOpName, zType,
48a0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74   (int)p->l_start
48b0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c  , (int)p->l_len,
48c0: 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f  .     (int)p->l_
48d0: 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73  pid, s);.  if( s
48e0: 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f  ==(-1) && op==F_
48f0: 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74  SETLK && (p->l_t
4900: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20  ype==F_RDLCK || 
4910: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
4920: 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  CK) ){.    struc
4930: 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20  t flock l2;.    
4940: 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46  l2 = *p;.    osF
4950: 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b  cntl(fd, F_GETLK
4960: 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20  , &l2);.    if( 
4970: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  l2.l_type==F_RDL
4980: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
4990: 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20  e = "RDLCK";.   
49a0: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
49b0: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b  type==F_WRLCK ){
49c0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
49d0: 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  WRLCK";.    }els
49e0: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
49f0: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
4a00: 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b    zType = "UNLCK
4a10: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ";.    }else{.  
4a20: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
4a30: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4a40: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
4a50: 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61  cntl-failure-rea
4a60: 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64  son: %s %d %d %d
4a70: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70  \n",.       zTyp
4a80: 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61  e, (int)l2.l_sta
4a90: 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65  rt, (int)l2.l_le
4aa0: 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64  n, (int)l2.l_pid
4ab0: 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d  );.  }.  errno =
4ac0: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72   savedErrno;.  r
4ad0: 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65  eturn s;.}.#unde
4ae0: 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e  f osFcntl.#defin
4af0: 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72  e osFcntl lockTr
4b00: 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ace.#endif /* SQ
4b10: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20  LITE_LOCK_TRACE 
4b20: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20  */../*.** Retry 
4b30: 66 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c  ftruncate() call
4b40: 73 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20  s that fail due 
4b50: 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61 74  to EINTR.*/.stat
4b60: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74  ic int robust_ft
4b70: 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73  runcate(int h, s
4b80: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29  qlite3_int64 sz)
4b90: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  {.  int rc;.  do
4ba0: 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61  { rc = osFtrunca
4bb0: 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65  te(h,sz); }while
4bc0: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
4bd0: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75  =EINTR );.  retu
4be0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4bf0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61  This routine tra
4c00: 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61  nslates a standa
4c10: 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63  rd POSIX errno c
4c20: 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69  ode into somethi
4c30: 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20  ng.** useful to 
4c40: 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74  the clients of t
4c50: 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74  he sqlite3 funct
4c60: 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61  ions.  Specifica
4c70: 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e  lly, it is.** in
4c80: 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c  tended to transl
4c90: 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f 66  ate a variety of
4ca0: 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72 72   "try again" err
4cb0: 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f  ors into SQLITE_
4cc0: 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61  BUSY.** and a va
4cd0: 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65  riety of "please
4ce0: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
4cf0: 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20  descriptor NOW" 
4d00: 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20  errors into .** 
4d10: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20  SQLITE_IOERR.** 
4d20: 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e  .** Errors durin
4d30: 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  g initialization
4d40: 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69   of locks, or fi
4d50: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
4d60: 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t for locks,.** 
4d70: 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e  should handle EN
4d80: 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45  OLCK, ENOTSUP, E
4d90: 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61  OPNOTSUPP separa
4da0: 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
4db0: 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46  int sqliteErrorF
4dc0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e  romPosixError(in
4dd0: 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e  t posixError, in
4de0: 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b  t sqliteIOErr) {
4df0: 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73 69 78  .  switch (posix
4e00: 45 72 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20  Error) {.#if 0. 
4e10: 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   /* At one point
4e20: 20 74 68 69 73 20 63 6f 64 65 20 77 61 73 20 6e   this code was n
4e30: 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74  ot commented out
4e40: 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 69  . In theory, thi
4e50: 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68  s branch.  ** sh
4e60: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 68 69  ould never be hi
4e70: 74 2c 20 61 73 20 74 68 69 73 20 66 75 6e 63 74  t, as this funct
4e80: 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ion should only 
4e90: 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 0a  be called after.
4ea0: 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72    ** a locking-r
4eb0: 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20  elated function 
4ec0: 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20 68  (i.e. fcntl()) h
4ed0: 61 73 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d  as returned non-
4ee0: 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74  zero with.  ** t
4ef0: 68 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e  he value of errn
4f00: 6f 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  o as the first a
4f10: 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61  rgument. Since a
4f20: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 68 61 73   system call has
4f30: 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72   failed,.  ** er
4f40: 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f  rno should be no
4f50: 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a  n-zero..  **.  *
4f60: 2a 20 44 65 73 70 69 74 65 20 74 68 69 73 2c 20  * Despite this, 
4f70: 69 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20  if errno really 
4f80: 69 73 20 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c  is zero, we stil
4f90: 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  l don't want to 
4fa0: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
4fb0: 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74 65  TE_OK. The syste
4fc0: 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61  m call failed, a
4fd0: 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65  nd *some* SQLite
4fe0: 20 65 72 72 6f 72 20 73 68 6f 75 6c 64 20 62 65   error should be
4ff0: 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 65 64  .  ** propagated
5000: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c   back to the cal
5010: 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20  ler. Commenting 
5020: 74 68 69 73 20 62 72 61 6e 63 68 20 6f 75 74 20  this branch out 
5030: 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20  means errno==0. 
5040: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e 64   ** will be hand
5050: 6c 65 64 20 62 79 20 74 68 65 20 22 64 65 66 61  led by the "defa
5060: 75 6c 74 3a 22 20 63 61 73 65 20 62 65 6c 6f 77  ult:" case below
5070: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a  ..  */.  case 0:
5080: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
5090: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
50a0: 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20    case EAGAIN:. 
50b0: 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a   case ETIMEDOUT:
50c0: 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20  .  case EBUSY:. 
50d0: 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63   case EINTR:.  c
50e0: 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20  ase ENOLCK:  .  
50f0: 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20    /* random NFS 
5100: 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c  retry error, unl
5110: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
5120: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
5130: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
5140: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
5150: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
5160: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
5170: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5180: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20  TE_BUSY;.    .  
5190: 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20  case EACCES: .  
51a0: 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c    /* EACCES is l
51b0: 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e  ike EAGAIN durin
51c0: 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74  g locking operat
51d0: 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e  ions, but not an
51e0: 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20  y other time*/. 
51f0: 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f     if( (sqliteIO
5200: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
5210: 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28  ERR_LOCK) || ..(
5220: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
5230: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
5240: 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65  CK) || ..(sqlite
5250: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
5260: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c  IOERR_RDLOCK) ||
5270: 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ..(sqliteIOErr =
5280: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
5290: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
52a0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
52b0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
52c0: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65     }.    /* else
52d0: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   fall through */
52e0: 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a  .  case EPERM: .
52f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5300: 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 2f  E_PERM;.    .  /
5310: 2a 20 45 44 45 41 44 4c 4b 20 69 73 20 6f 6e 6c  * EDEADLK is onl
5320: 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 61 20  y possible if a 
5330: 63 61 6c 6c 20 74 6f 20 66 63 6e 74 6c 28 46 5f  call to fcntl(F_
5340: 53 45 54 4c 4b 57 29 20 69 73 20 6d 61 64 65 2e  SETLKW) is made.
5350: 20 41 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20 6d   And.  ** this m
5360: 6f 64 75 6c 65 20 6e 65 76 65 72 20 6d 61 6b 65  odule never make
5370: 73 20 73 75 63 68 20 61 20 63 61 6c 6c 2e 20 41  s such a call. A
5380: 6e 64 20 74 68 65 20 63 6f 64 65 20 69 6e 20 53  nd the code in S
5390: 51 4c 69 74 65 20 69 74 73 65 6c 66 20 0a 20 20  QLite itself .  
53a0: 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
53b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
53c0: 43 4b 45 44 20 69 73 20 6e 65 76 65 72 20 72 65  CKED is never re
53d0: 74 75 72 6e 65 64 2e 20 46 6f 72 20 74 68 65 73  turned. For thes
53e0: 65 20 72 65 61 73 6f 6e 73 0a 20 20 2a 2a 20 74  e reasons.  ** t
53f0: 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f  his case is also
5400: 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20   commented out. 
5410: 49 66 20 74 68 65 20 73 79 73 74 65 6d 20 64 6f  If the system do
5420: 65 73 20 73 65 74 20 65 72 72 6e 6f 20 74 6f 20  es set errno to 
5430: 45 44 45 41 44 4c 4b 2c 0a 20 20 2a 2a 20 74 68  EDEADLK,.  ** th
5440: 65 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54 45  e default SQLITE
5450: 5f 49 4f 45 52 52 5f 58 58 58 20 63 6f 64 65 20  _IOERR_XXX code 
5460: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
5470: 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 63 61 73  . */.#if 0.  cas
5480: 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72  e EDEADLK:.    r
5490: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
54a0: 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 23 65 6e 64  RR_BLOCKED;.#end
54b0: 69 66 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e  if.    .#if EOPN
54c0: 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a  OTSUPP!=ENOTSUP.
54d0: 20 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50    case EOPNOTSUP
54e0: 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74  P: .    /* somet
54f0: 68 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62  hing went terrib
5500: 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20  ly awry, unless 
5510: 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74  during file syst
5520: 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20  em support .    
5530: 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e   * introspection
5540: 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63  , in which it ac
5550: 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61  tually means wha
5560: 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e  t it says */.#en
5570: 64 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53  dif.#ifdef ENOTS
5580: 55 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55  UP.  case ENOTSU
5590: 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c  P: .    /* inval
55a0: 69 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75  id fd, unless du
55b0: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
55c0: 20 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70   support introsp
55d0: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
55e0: 20 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74 75   .     * it actu
55f0: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
5600: 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69  it says */.#endi
5610: 66 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20  f.  case EIO:.  
5620: 63 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61  case EBADF:.  ca
5630: 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73  se EINVAL:.  cas
5640: 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61  e ENOTCONN:.  ca
5650: 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73  se ENODEV:.  cas
5660: 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20  e ENXIO:.  case 
5670: 45 4e 4f 45 4e 54 3a 0a 20 20 63 61 73 65 20 45  ENOENT:.  case E
5680: 53 54 41 4c 45 3a 0a 20 20 63 61 73 65 20 45 4e  STALE:.  case EN
5690: 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65  OSYS:.    /* the
56a0: 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65 20  se should force 
56b0: 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c  the client to cl
56c0: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64  ose the file and
56d0: 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20   reconnect */.  
56e0: 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20    .  default: . 
56f0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
5700: 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a  IOErr;.  }.}....
5710: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
5720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
5760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5770: 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20  ** Begin Unique 
5780: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
5790: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
57a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
57b0: 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65  **.** On most ve
57c0: 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20  rsions of unix, 
57d0: 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69  we can get a uni
57e0: 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c  que ID for a fil
57f0: 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69  e by concatenati
5800: 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65  ng.** the device
5810: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
5820: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42  inode number.  B
5830: 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  ut this does not
5840: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
5850: 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c  ..** On VxWorks,
5860: 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69   a unique file i
5870: 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64 20  d must be based 
5880: 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  on the canonical
5890: 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a   filename..**.**
58a0: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   A pointer to an
58b0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
58c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
58d0: 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65 64  ture can be used
58e0: 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20   as a.** unique 
58f0: 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72  file ID in VxWor
5900: 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e  ks.  Each instan
5910: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
5920: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ture contains.**
5930: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
5940: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
5950: 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c 73  e.  There is als
5960: 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  o a reference co
5970: 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74  unt.  .** The st
5980: 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c 61  ructure is recla
5990: 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75  imed when the nu
59a0: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
59b0: 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a   to it drops to.
59c0: 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  ** zero..**.** T
59d0: 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 76  here are never v
59e0: 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f  ery many files o
59f0: 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20  pen at one time 
5a00: 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20  and lookups are 
5a10: 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d  not.** a perform
5a20: 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61  ance-critical pa
5a30: 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66  th, so it is suf
5a40: 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74  ficient to put t
5a50: 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  hese.** structur
5a60: 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  es on a linked l
5a70: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76  ist..*/.struct v
5a80: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20  xworksFileId {. 
5a90: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
5aa0: 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f  ileId *pNext;  /
5ab0: 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74  * Next in a list
5ac0: 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a   of them all */.
5ad0: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5af0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
5b00: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
5b10: 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  one */.  int nNa
5b20: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
5b30: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
5b40: 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63   of the zCanonic
5b50: 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20  alName[] string 
5b60: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f  */.  char *zCano
5b70: 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20  nicalName;      
5b80: 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20     /* Canonical 
5b90: 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a  filename */.};..
5ba0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f  #if OS_VXWORKS./
5bb0: 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65  * .** All unique
5bc0: 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68   filenames are h
5bd0: 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  eld on a linked 
5be0: 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20 74  list headed by t
5bf0: 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a  his.** variable:
5c00: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
5c10: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
5c20: 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  *vxworksFileList
5c30: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d   = 0;../*.** Sim
5c40: 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65  plify a filename
5c50: 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69   into its canoni
5c60: 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d  cal form.** by m
5c70: 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  aking the follow
5c80: 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a  ing changes:.**.
5c90: 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61  **  * removing a
5ca0: 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20  ny trailing and 
5cb0: 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20  duplicate /.**  
5cc0: 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e  * convert /./ in
5cd0: 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20  to just /.**  * 
5ce0: 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77  convert /A/../ w
5cf0: 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73 69  here A is any si
5d00: 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a  mple name into j
5d10: 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  ust /.**.** Chan
5d20: 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d  ges are made in-
5d30: 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74  place.  Return t
5d40: 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67  he new name leng
5d50: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  th..**.** The or
5d60: 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  iginal filename 
5d70: 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e  is in z[0..n-1].
5d80: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
5d90: 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63  ber of.** charac
5da0: 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70  ters in the simp
5db0: 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a  lified name..*/.
5dc0: 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72  static int vxwor
5dd0: 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63  ksSimplifyName(c
5de0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
5df0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68    int i, j;.  wh
5e00: 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d  ile( n>1 && z[n-
5e10: 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20  1]=='/' ){ n--; 
5e20: 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  }.  for(i=j=0; i
5e30: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <n; i++){.    if
5e40: 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ( z[i]=='/' ){. 
5e50: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
5e60: 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='/' ) continue;
5e70: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
5e80: 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20  ]=='.' && i+2<n 
5e90: 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29  && z[i+2]=='/' )
5ea0: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31  {.        i += 1
5eb0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
5ec0: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
5ed0: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
5ee0: 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b  ' && i+3<n && z[
5ef0: 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69  i+2]=='.' && z[i
5f00: 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +3]=='/' ){.    
5f10: 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26      while( j>0 &
5f20: 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b  & z[j-1]!='/' ){
5f30: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
5f40: 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20  if( j>0 ){ j--; 
5f50: 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  }.        i += 2
5f60: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
5f70: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
5f80: 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a  }.    z[j++] = z
5f90: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20  [i];.  }.  z[j] 
5fa0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b  = 0;.  return j;
5fb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
5fc0: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
5fd0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61 62  for the given ab
5fe0: 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e  solute pathname.
5ff0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
6000: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78 77  inter to the vxw
6010: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
6020: 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72  t.  This pointer
6030: 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a   is the unique.*
6040: 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a  * file ID..**.**
6050: 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20   The nRef field 
6060: 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69  of the vxworksFi
6070: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69  leId object is i
6080: 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72  ncremented befor
6090: 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20  e.** the object 
60a0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20  is returned.  A 
60b0: 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  new vxworksFileI
60c0: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  d object is crea
60d0: 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64  ted.** and added
60e0: 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c   to the global l
60f0: 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72 79  ist if necessary
6100: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
6110: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
6120: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
6130: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
6140: 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72  tic struct vxwor
6150: 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b  ksFileId *vxwork
6160: 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73  sFindFileId(cons
6170: 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74  t char *zAbsolut
6180: 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74  eName){.  struct
6190: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
61a0: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a  pNew;         /*
61b0: 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20   search key and 
61c0: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
61d0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
61e0: 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74  ileId *pCandidat
61f0: 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  e;   /* For loop
6200: 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e  ing over existin
6210: 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20  g file IDs */.  
6220: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6240: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
6250: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73   zAbsoluteName s
6260: 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65  tring */..  asse
6270: 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  rt( zAbsoluteNam
6280: 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e  e[0]=='/' );.  n
6290: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
62a0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20  AbsoluteName);. 
62b0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
62c0: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
62d0: 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b  pNew) + (n+1) );
62e0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
62f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
6300: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
6310: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
6320: 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e  [1];.  memcpy(pN
6330: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
6340: 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  me, zAbsoluteNam
6350: 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76  e, n+1);.  n = v
6360: 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61  xworksSimplifyNa
6370: 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  me(pNew->zCanoni
6380: 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20  calName, n);..  
6390: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
63a0: 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
63b0: 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68  that matching th
63c0: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65  e canonical name
63d0: 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c  ..  ** If found,
63e0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   increment the r
63f0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61  eference count a
6400: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
6410: 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ter to.  ** the 
6420: 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44  existing file ID
6430: 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  ..  */.  unixEnt
6440: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72  erMutex();.  for
6450: 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f  (pCandidate=vxwo
6460: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61  rksFileList; pCa
6470: 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64  ndidate; pCandid
6480: 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e  ate=pCandidate->
6490: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
64a0: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d  pCandidate->nNam
64b0: 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65  e==n .     && me
64c0: 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d  mcmp(pCandidate-
64d0: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
64e0: 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61   pNew->zCanonica
64f0: 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20  lName, n)==0.   
6500: 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74   ){.       sqlit
6510: 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
6520: 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65        pCandidate
6530: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
6540: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
6550: 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e  );.       return
6560: 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20   pCandidate;.   
6570: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20   }.  }..  /* No 
6580: 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e  match was found.
6590: 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61    We will make a
65a0: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
65b0: 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31    pNew->nRef = 1
65c0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20  ;.  pNew->nName 
65d0: 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  = n;.  pNew->pNe
65e0: 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65  xt = vxworksFile
65f0: 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46  List;.  vxworksF
6600: 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  ileList = pNew;.
6610: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
6620: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  ();.  return pNe
6630: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  w;.}../*.** Decr
6640: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
6650: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76  nce count on a v
6660: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
6670: 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68  ect.  Free.** th
6680: 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68  e object when th
6690: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
66a0: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a  t reaches zero..
66b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
66c0: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
66d0: 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72  eId(struct vxwor
66e0: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a  ksFileId *pId){.
66f0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
6700: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  ();.  assert( pI
6710: 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  d->nRef>0 );.  p
6720: 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Id->nRef--;.  if
6730: 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pId->nRef==0 )
6740: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77  {.    struct vxw
6750: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b  orksFileId **pp;
6760: 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77  .    for(pp=&vxw
6770: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70  orksFileList; *p
6780: 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70  p && *pp!=pId; p
6790: 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65  p = &((*pp)->pNe
67a0: 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72  xt)){}.    asser
67b0: 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20  t( *pp==pId );. 
67c0: 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e     *pp = pId->pN
67d0: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
67e0: 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a  _free(pId);.  }.
67f0: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
6800: 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ();.}.#endif /* 
6810: 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
6820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
6830: 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c  nd of Unique Fil
6840: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
6850: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
6860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
6870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
68c0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
68d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
6910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69  *********** Posi
6930: 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69  x Advisory Locki
6940: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
6950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
6960: 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69  **.** POSIX advi
6970: 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62  sory locks are b
6980: 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e  roken by design.
6990: 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e    ANSI STD 1003.
69a0: 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74  1 (1996).** sect
69b0: 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65  ion 6.5.2.2 line
69c0: 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39  s 483 through 49
69d0: 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77  0 specify that w
69e0: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a  hen a process.**
69f0: 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20   sets or clears 
6a00: 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65  a lock, that ope
6a10: 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73  ration overrides
6a20: 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73   any prior locks
6a30: 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73   set.** by the s
6a40: 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74  ame process.  It
6a50: 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63   does not explic
6a60: 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74  itly say so, but
6a70: 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a   this implies.**
6a80: 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64   that it overrid
6a90: 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20  es locks set by 
6aa0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
6ab0: 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65   using a differe
6ac0: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
6ad0: 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72  iptor.  Consider
6ae0: 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a   this test case:
6af0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  .**.**       int
6b00: 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd1 = open("./f
6b10: 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile1", O_RDWR|O_
6b20: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
6b30: 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d         int fd2 =
6b40: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c   open("./file2",
6b50: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
6b60: 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75   0644);.**.** Su
6b70: 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e  ppose ./file1 an
6b80: 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65  d ./file2 are re
6b90: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69  ally the same fi
6ba0: 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f  le (because.** o
6bb0: 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20  ne is a hard or 
6bc0: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f  symbolic link to
6bd0: 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e   the other) then
6be0: 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61   if you set.** a
6bf0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
6c00: 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72   on fd1, then tr
6c10: 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c  y to get an excl
6c20: 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e  usive lock.** on
6c30: 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20   fd2, it works. 
6c40: 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78   I would have ex
6c50: 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e  pected the secon
6c60: 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69  d lock to.** fai
6c70: 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61  l since there wa
6c80: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
6c90: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65   on the file due
6ca0: 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20   to fd1..** But 
6cb0: 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62  not so.  Since b
6cc0: 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66  oth locks came f
6cd0: 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f  rom the same pro
6ce0: 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63  cess, the.** sec
6cf0: 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68  ond overrides th
6d00: 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68  e first, even th
6d10: 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f  ough they were o
6d20: 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  n different.** f
6d30: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
6d40: 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72  opened on differ
6d50: 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a  ent file names..
6d60: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73  **.** This means
6d70: 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20   that we cannot 
6d80: 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  use POSIX locks 
6d90: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66  to synchronize f
6da0: 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d  ile access.** am
6db0: 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68  ong competing th
6dc0: 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d  reads of the sam
6dd0: 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49  e process.  POSI
6de0: 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72  X locks will wor
6df0: 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e  k fine.** to syn
6e00: 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20  chronize access 
6e10: 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73  for threads in s
6e20: 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65  eparate processe
6e30: 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68  s, but not.** th
6e40: 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65  reads within the
6e50: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a   same process..*
6e60: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
6e70: 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c  und the problem,
6e80: 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d   SQLite has to m
6e90: 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73  anage file locks
6ea0: 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f   internally.** o
6eb0: 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e  n its own.  When
6ec0: 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62  ever a new datab
6ed0: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77  ase is opened, w
6ee0: 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74  e have to find t
6ef0: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69  he.** specific i
6f00: 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61  node of the data
6f10: 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69  base file (the i
6f20: 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e  node is determin
6f30: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f  ed by the.** st_
6f40: 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66  dev and st_ino f
6f50: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61  ields of the sta
6f60: 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  t structure that
6f70: 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69   fstat() fills i
6f80: 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20  n).** and check 
6f90: 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64  for locks alread
6fa0: 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68  y existing on th
6fb0: 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20  at inode.  When 
6fc0: 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65  locks are.** cre
6fd0: 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c  ated or removed,
6fe0: 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b   we have to look
6ff0: 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65   at our own inte
7000: 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
7010: 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73  he.** locks to s
7020: 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68  ee if another th
7030: 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75  read has previou
7040: 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f  sly set a lock o
7050: 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69  n that same.** i
7060: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69  node..**.** (Asi
7070: 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69  de: The use of i
7080: 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20  node numbers as 
7090: 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20  unique IDs does 
70a0: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
70b0: 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f  rks..** For VxWo
70c0: 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20  rks, we have to 
70d0: 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74  use the alternat
70e0: 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79  ive unique ID sy
70f0: 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  stem based on.**
7100: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
7110: 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e  ame and implemen
7120: 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69  ted in the previ
7130: 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a  ous division.).*
7140: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
7150: 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  _file structure 
7160: 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20  for POSIX is no 
7170: 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69  longer just an i
7180: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
7190: 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69  escriptor.  It i
71a0: 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72  s now a structur
71b0: 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  e that holds the
71c0: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
71d0: 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20   descriptor and 
71e0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
71f0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
7200: 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65  scribes the inte
7210: 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e  rnal.** locks on
7220: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
7230: 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65  ng inode.  There
7240: 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20   is one locking 
7250: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72  structure.** per
7260: 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68   inode, so if th
7270: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20  e same inode is 
7280: 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f  opened twice, bo
7290: 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  th unixFile stru
72a0: 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20  ctures.** point 
72b0: 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b  to the same lock
72c0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
72d0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  The locking stru
72e0: 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61  cture keeps.** a
72f0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
7300: 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f   (so we will kno
7310: 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65  w when to delete
7320: 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22   it) and a "cnt"
7330: 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74  .** field that t
7340: 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65  ells us its inte
7350: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73  rnal lock status
7360: 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  .  cnt==0 means 
7370: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75  the.** file is u
7380: 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d  nlocked.  cnt==-
7390: 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65  1 means the file
73a0: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
73b0: 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30  e lock..** cnt>0
73c0: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
73d0: 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   cnt shared lock
73e0: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  s on the file..*
73f0: 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74  *.** Any attempt
7400: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
7410: 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20  ck a file first 
7420: 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69  checks the locki
7430: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
7440: 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79    The fcntl() sy
7450: 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c  stem call is onl
7460: 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  y invoked to set
7470: 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63   a .** POSIX loc
7480: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  k if the interna
7490: 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65  l lock structure
74a0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74   transitions bet
74b0: 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64  ween.** a locked
74c0: 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64   and an unlocked
74d0: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75   state..**.** Bu
74e0: 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61  t wait:  there a
74f0: 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62  re yet more prob
7500: 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20  lems with POSIX 
7510: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a  advisory locks..
7520: 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f  **.** If you clo
7530: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
7540: 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73  ptor that points
7550: 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20   to a file that 
7560: 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c  has locks,.** al
7570: 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20  l locks on that 
7580: 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77  file that are ow
7590: 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
75a0: 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a  nt process are.*
75b0: 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20  * released.  To 
75c0: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
75d0: 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75   problem, each u
75e0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
75f0: 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73  ect.** maintains
7600: 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20   a count of the 
7610: 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e  number of pendin
7620: 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69  g locks on tha i
7630: 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e  node..** When an
7640: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
7650: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69   to close an uni
7660: 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20  xFile, if there 
7670: 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69  are.** other uni
7680: 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68  xFile open on th
7690: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61  e same inode tha
76a0: 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f  t are holding lo
76b0: 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a  cks, the call.**
76c0: 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20   to close() the 
76d0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
76e0: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
76f0: 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63  l all of the loc
7700: 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65  ks clear..** The
7710: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73   unixInodeInfo s
7720: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61  tructure keeps a
7730: 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65   list of file de
7740: 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e  scriptors that n
7750: 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f  eed to.** be clo
7760: 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73  sed and that lis
7770: 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64  t is walked (and
7780: 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74   cleared) when t
7790: 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20  he last lock.** 
77a0: 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65  clears..**.** Ye
77b0: 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65  t another proble
77c0: 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73  m:  LinuxThreads
77d0: 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c   do not play wel
77e0: 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63  l with posix loc
77f0: 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f  ks..**.** Many o
7800: 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
7810: 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c   linux use the L
7820: 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62 72  inuxThreads libr
7830: 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ary which is.** 
7840: 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69  not posix compli
7850: 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75  ant.  Under Linu
7860: 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b  xThreads, a lock
7870: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65   created by thre
7880: 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62  ad.** A cannot b
7890: 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76  e modified or ov
78a0: 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64 69  erridden by a di
78b0: 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 42  fferent thread B
78c0: 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64  ..** Only thread
78d0: 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68   A can modify th
78e0: 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67  e lock.  Locking
78f0: 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72   behavior is cor
7900: 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61  rect.** if the a
7910: 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74  ppliation uses t
7920: 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20  he newer Native 
7930: 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69 62  Posix Thread Lib
7940: 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f  rary (NPTL).** o
7950: 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e  n linux - with N
7960: 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74  PTL a lock creat
7970: 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20 63  ed by thread A c
7980: 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  an override lock
7990: 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42  s.** in thread B
79a0: 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
79b0: 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61  no way to know a
79c0: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  t compile-time w
79d0: 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e  hich.** threadin
79e0: 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65 69  g library is bei
79f0: 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65  ng used.  So the
7a00: 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20  re is no way to 
7a10: 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69  know at.** compi
7a20: 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20  le-time whether 
7a30: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20  or not thread A 
7a40: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
7a50: 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a  ks on thread B..
7a60: 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f  ** One has to do
7a70: 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63   a run-time chec
7a80: 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  k to discover th
7a90: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
7aa0: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f  e.** current pro
7ab0: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  cess..**.** SQLi
7ac0: 74 65 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f  te used to suppo
7ad0: 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e  rt LinuxThreads.
7ae0: 20 20 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f    But support fo
7af0: 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a  r LinuxThreads.*
7b00: 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20 62 65  * was dropped be
7b10: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72  ginning with ver
7b20: 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c  sion 3.7.0.  SQL
7b30: 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77  ite will still w
7b40: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75  ork with.** Linu
7b50: 78 54 68 72 65 61 64 73 20 70 72 6f 76 69 64 65  xThreads provide
7b60: 64 20 74 68 61 74 20 28 31 29 20 74 68 65 72 65  d that (1) there
7b70: 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e   is no more than
7b80: 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   one connection 
7b90: 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73 65  .** per database
7ba0: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d   file in the sam
7bb0: 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32  e process and (2
7bc0: 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  ) database conne
7bd0: 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74  ctions.** do not
7be0: 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72   move across thr
7bf0: 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  eads..*/../*.** 
7c00: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
7c10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
7c20: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
7c30: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
7c40: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
7c50: 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64  ticular unixInod
7c60: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  eInfo object..*/
7c70: 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65  .struct unixFile
7c80: 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76  Id {.  dev_t dev
7c90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7ca0: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d     /* Device num
7cb0: 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58  ber */.#if OS_VX
7cc0: 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76  WORKS.  struct v
7cd0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49  xworksFileId *pI
7ce0: 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69  d;  /* Unique fi
7cf0: 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b  le ID for vxwork
7d00: 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e  s. */.#else.  in
7d10: 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20  o_t ino;        
7d20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f            /* Ino
7d30: 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e  de number */.#en
7d40: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  dif.};../*.** An
7d50: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
7d60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
7d70: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
7d80: 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a  d for each open.
7d90: 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f  ** inode.  Or, o
7da0: 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20  n LinuxThreads, 
7db0: 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20  there is one of 
7dc0: 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73  these structures
7dd0: 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f   for.** each ino
7de0: 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63  de opened by eac
7df0: 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  h thread..**.** 
7e00: 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63  A single inode c
7e10: 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65  an have multiple
7e20: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7e30: 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46  s, so each unixF
7e40: 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ile.** structure
7e50: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
7e60: 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  ter to an instan
7e70: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
7e80: 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62  t and this.** ob
7e90: 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75  ject keeps a cou
7ea0: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
7eb0: 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69   of unixFile poi
7ec0: 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a  nting to it..*/.
7ed0: 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65  struct unixInode
7ee0: 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20  Info {.  struct 
7ef0: 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49  unixFileId fileI
7f00: 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d;       /* The 
7f10: 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20  lookup key */.  
7f20: 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20  int nShared;    
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41  /* Number of SHA
7f50: 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  RED locks held *
7f60: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
7f70: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
7f80: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48      /* One of SH
7f90: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
7fa0: 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f  VED_LOCK etc. */
7fb0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
7fc0: 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20   bProcessLock;  
7fd0: 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69     /* An exclusi
7fe0: 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20  ve process lock 
7ff0: 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  is held */.  int
8000: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
8010: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8020: 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  Number of pointe
8030: 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63  rs to this struc
8040: 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ture */.  unixSh
8050: 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
8060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
8070: 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red memory assoc
8080: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
8090: 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  inode */.  int n
80a0: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
80b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
80c0: 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64  mber of outstand
80d0: 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a  ing file locks *
80e0: 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  /.  UnixUnusedFd
80f0: 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20   *pUnused;      
8100: 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69      /* Unused fi
8110: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
8120: 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69  o close */.  uni
8130: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78  xInodeInfo *pNex
8140: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
8150: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78  List of all unix
8160: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
8170: 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  s */.  unixInode
8180: 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20  Info *pPrev;    
8190: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e         /*    ...
81a0: 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20  . doubly linked 
81b0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
81c0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
81d0: 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  LE.  unsigned lo
81e0: 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79  ng long sharedBy
81f0: 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20  te;  /* for AFP 
8200: 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64  simulated shared
8210: 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a   lock */.#endif.
8220: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
8230: 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20   sem_t *pSem;   
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20   /* Named POSIX 
8260: 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63  semaphore */.  c
8270: 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58  har aSemName[MAX
8280: 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f  _PATHNAME+2];  /
8290: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73  * Name of that s
82a0: 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64  emaphore */.#end
82b0: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c  if.};../*.** A l
82c0: 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78  ists of all unix
82d0: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
82e0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69  s..*/.static uni
82f0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64  xInodeInfo *inod
8300: 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  eList = 0;../*.*
8310: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
8320: 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  on - unixLogErro
8330: 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65  r_x(), is only e
8340: 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74  ver called via t
8350: 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78  he macro.** unix
8360: 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a  LogError()..**.*
8370: 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  * It is invoked 
8380: 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f  after an error o
8390: 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66  ccurs in an OS f
83a0: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e  unction and errn
83b0: 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65  o has been.** se
83c0: 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73  t. It logs a mes
83d0: 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74  sage using sqlit
83e0: 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e  e3_log() contain
83f0: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
8400: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e  value of.** errn
8410: 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62  o and, if possib
8420: 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  le, the human-re
8430: 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e  adable equivalen
8440: 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28  t from strerror(
8450: 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72  ) or.** strerror
8460: 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  _r()..**.** The 
8470: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
8480: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63  assed to the mac
8490: 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ro should be the
84a0: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
84b0: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75  .** will be retu
84c0: 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28  rned to SQLite (
84d0: 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  e.g. SQLITE_IOER
84e0: 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45  R_DELETE, SQLITE
84f0: 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20  _CANTOPEN). .** 
8500: 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65  The two subseque
8510: 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f  nt arguments sho
8520: 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20  uld be the name 
8530: 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69  of the OS functi
8540: 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65  on that.** faile
8550: 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22  d (e.g. "unlink"
8560: 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68  , "open") and th
8570: 65 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  e the associated
8580: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74   file-system pat
8590: 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f  h,.** if any..*/
85a0: 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67  .#define unixLog
85b0: 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20 20 20  Error(a,b,c)    
85c0: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
85d0: 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45  ine(a,b,c,__LINE
85e0: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75  __).static int u
85f0: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
8600: 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65  e(.  int errcode
8610: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8620: 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65       /* SQLite e
8630: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63  rror code */.  c
8640: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
8650: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8660: 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e  * Name of OS fun
8670: 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65  ction that faile
8680: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
8690: 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
86a0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70         /* File p
86b0: 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77  ath associated w
86c0: 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69  ith error */.  i
86d0: 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20  nt iLine        
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
86f0: 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75  * Source line nu
8700: 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72  mber where error
8710: 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a   occurred */.){.
8720: 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20 20    char *zErr;   
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72 6f    /* Message fro
8750: 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 20  m strerror() or 
8760: 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20  equivalent */.  
8770: 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72 72  int iErrno = err
8780: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
8790: 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c 6c  /* Saved syscall
87a0: 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f   error number */
87b0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
87c0: 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73 61  s not a threadsa
87d0: 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54 45  fe build (SQLITE
87e0: 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29 2c  _THREADSAFE==0),
87f0: 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74   then use.  ** t
8800: 68 65 20 73 74 72 65 72 72 6f 72 28 29 20 66 75  he strerror() fu
8810: 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e  nction to obtain
8820: 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61   the human-reada
8830: 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ble error messag
8840: 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e  e.  ** equivalen
8850: 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65  t to errno. Othe
8860: 72 77 69 73 65 2c 20 75 73 65 20 73 74 72 65 72  rwise, use strer
8870: 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23  ror_r()..  */ .#
8880: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
8890: 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28  SAFE && defined(
88a0: 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52 29  HAVE_STRERROR_R)
88b0: 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38 30 5d  .  char aErr[80]
88c0: 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72 2c  ;.  memset(aErr,
88d0: 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29   0, sizeof(aErr)
88e0: 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72 72  );.  zErr = aErr
88f0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45 52  ;..  /* If STRER
8900: 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73 65  ROR_R_CHAR_P (se
8910: 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73 63  t by autoconf sc
8920: 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f  ripts) or __USE_
8930: 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c 0a  GNU is defined,.
8940: 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
8950: 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76   the system prov
8960: 69 64 65 73 20 74 68 65 20 74 68 65 20 47 4e 55  ides the the GNU
8970: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65   version of stre
8980: 72 72 6f 72 5f 72 28 29 20 74 68 61 74 20 0a 20  rror_r() that . 
8990: 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f   ** returns a po
89a0: 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
89b0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
89c0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
89d0: 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20  That pointer .  
89e0: 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  ** may point to 
89f0: 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61  aErr[], or it ma
8a00: 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  y point to some 
8a10: 73 74 61 74 69 63 20 73 74 6f 72 61 67 65 20 73  static storage s
8a20: 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20  omewhere. .  ** 
8a30: 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d  Otherwise, assum
8a40: 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65  e that the syste
8a50: 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 50  m provides the P
8a60: 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20  OSIX version of 
8a70: 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  .  ** strerror_r
8a80: 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73  (), which always
8a90: 20 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72   writes an error
8aa0: 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45   message into aE
8ab0: 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rr[]..  **.  ** 
8ac0: 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f  If the code inco
8ad0: 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20  rrectly assumes 
8ae0: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 50  that it is the P
8af0: 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61  OSIX version tha
8b00: 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61  t is.  ** availa
8b10: 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d  ble, the error m
8b20: 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65  essage will ofte
8b30: 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74  n be an empty st
8b40: 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a  ring. Not a.  **
8b50: 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49   huge problem. I
8b60: 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c  ncorrectly concl
8b70: 75 64 69 6e 67 20 74 68 61 74 20 74 68 65 20 47  uding that the G
8b80: 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  NU version is av
8b90: 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f  ailable .  ** co
8ba0: 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65  uld lead to a se
8bb0: 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20  gfault though.. 
8bc0: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
8bd0: 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f  STRERROR_R_CHAR_
8be0: 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  P) || defined(__
8bf0: 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20  USE_GNU).  zErr 
8c00: 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72  = .# endif.  str
8c10: 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20  error_r(iErrno, 
8c20: 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72  aErr, sizeof(aEr
8c30: 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51  r)-1);..#elif SQ
8c40: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
8c50: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74    /* This is a t
8c60: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c  hreadsafe build,
8c70: 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28   but strerror_r(
8c80: 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  ) is not availab
8c90: 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20  le. */.  zErr = 
8ca0: 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e  "";.#else.  /* N
8cb0: 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62 75  on-threadsafe bu
8cc0: 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f  ild, use strerro
8cd0: 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d  r(). */.  zErr =
8ce0: 20 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f   strerror(iErrno
8cf0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
8d00: 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51  ert( errcode!=SQ
8d10: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
8d20: 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74   zPath==0 ) zPat
8d30: 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65  h = "";.  sqlite
8d40: 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20  3_log(errcode,. 
8d50: 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a       "os_unix.c:
8d60: 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29 20  %d: (%d) %s(%s) 
8d70: 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69  - %s",.      iLi
8d80: 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e  ne, iErrno, zFun
8d90: 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20  c, zPath, zErr. 
8da0: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72   );..  return er
8db0: 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rcode;.}../*.** 
8dc0: 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  Close a file des
8dd0: 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57  criptor..**.** W
8de0: 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c  e assume that cl
8df0: 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77  ose() almost alw
8e00: 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65  ays works, since
8e10: 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61   it is only in a
8e20: 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70  .** very sick ap
8e30: 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20  plication or on 
8e40: 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74  a very sick plat
8e50: 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67  form that it mig
8e60: 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69  ht fail..** If i
8e70: 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d  t does fail, sim
8e80: 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c  ply leak the fil
8e90: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75  e descriptor, bu
8ea0: 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20  t do log the.** 
8eb0: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  error..**.** Not
8ec0: 65 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  e that it is not
8ed0: 20 73 61 66 65 20 74 6f 20 72 65 74 72 79 20 63   safe to retry c
8ee0: 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45 49 4e  lose() after EIN
8ef0: 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  TR since the.** 
8f00: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
8f10: 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72 65 61  might have alrea
8f20: 64 79 20 62 65 65 6e 20 72 65 75 73 65 64 20 62  dy been reused b
8f30: 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  y another thread
8f40: 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74  ..** So we don't
8f50: 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63   even try to rec
8f60: 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e  over from an EIN
8f70: 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68  TR.  Just log th
8f80: 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d  e error.** and m
8f90: 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ove on..*/.stati
8fa0: 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c  c void robust_cl
8fb0: 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ose(unixFile *pF
8fc0: 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20  ile, int h, int 
8fd0: 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f  lineno){.  if( o
8fe0: 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20  sClose(h) ){.   
8ff0: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
9000: 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ine(SQLITE_IOERR
9010: 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c  _CLOSE, "close",
9020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9030: 20 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20          pFile ? 
9040: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30  pFile->zPath : 0
9050: 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d  , lineno);.  }.}
9060: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
9070: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
9080: 72 73 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e  rs accumuated in
9090: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
90a0: 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74  fo->pUnused list
90b0: 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
90c0: 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64  d closePendingFd
90d0: 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  s(unixFile *pFil
90e0: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
90f0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
9100: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55  ile->pInode;.  U
9110: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a  nixUnusedFd *p;.
9120: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
9130: 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70  pNext;.  for(p=p
9140: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20  Inode->pUnused; 
9150: 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20  p; p=pNext){.   
9160: 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
9170: 74 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  t;.    robust_cl
9180: 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64  ose(pFile, p->fd
9190: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
91a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
91b0: 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e  ;.  }.  pInode->
91c0: 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a  pUnused = 0;.}..
91d0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
91e0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74  unixInodeInfo st
91f0: 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73  ructure previous
9200: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ly allocated by 
9210: 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e  findInodeInfo().
9220: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
9230: 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74   entered using t
9240: 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
9250: 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
9260: 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65  t be held.** whe
9270: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
9280: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
9290: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
92a0: 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46  eInodeInfo(unixF
92b0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
92c0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
92d0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
92e0: 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
92f0: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
9300: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
9310: 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70  pInode) ){.    p
9320: 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Inode->nRef--;. 
9330: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
9340: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
9350: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
9360: 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20  pShmNode==0 );. 
9370: 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e       closePendin
9380: 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20  gFds(pFile);.   
9390: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70     if( pInode->p
93a0: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
93b0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
93c0: 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49  pPrev->pNext==pI
93d0: 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20  node );.        
93e0: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70  pInode->pPrev->p
93f0: 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Next = pInode->p
9400: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Next;.      }els
9410: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
9420: 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49  t( inodeList==pI
9430: 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20  node );.        
9440: 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f  inodeList = pIno
9450: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  de->pNext;.     
9460: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e   }.      if( pIn
9470: 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ode->pNext ){.  
9480: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
9490: 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  node->pNext->pPr
94a0: 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  ev==pInode );.  
94b0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e        pInode->pN
94c0: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e  ext->pPrev = pIn
94d0: 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  ode->pPrev;.    
94e0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
94f0: 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a  3_free(pInode);.
9500: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
9510: 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20  ** Given a file 
9520: 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61  descriptor, loca
9530: 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  te the unixInode
9540: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  Info object that
9550: 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68  .** describes th
9560: 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  at file descript
9570: 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  or.  Create a ne
9580: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
9590: 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75  ry.  The.** retu
95a0: 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62  rn value might b
95b0: 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  e uninitialized 
95c0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
95d0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  rs..**.** The mu
95e0: 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e  tex entered usin
95f0: 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  g the unixEnterM
9600: 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20  utex() function 
9610: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
9620: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
9630: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
9640: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70  .** Return an ap
9650: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
9660: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
9670: 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  int findInodeInf
9680: 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  o(.  unixFile *p
9690: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
96a0: 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65      /* Unix file
96b0: 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20   with file desc 
96c0: 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20  used in the key 
96d0: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
96e0: 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20  fo **ppInode    
96f0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
9700: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
9710: 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29  object here */.)
9720: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9740: 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c     /* System cal
9750: 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  l return code */
9760: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
9790: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69  scriptor for pFi
97a0: 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  le */.  struct u
97b0: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
97c0: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70  ;      /* Lookup
97d0: 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69   key for the uni
97e0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20  xInodeInfo */.  
97f0: 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
9800: 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f  buf;           /
9810: 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65  * Low-level file
9820: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
9830: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
9840: 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20  *pInode = 0;    
9850: 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e   /* Candidate un
9860: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
9870: 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ct */..  assert(
9880: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
9890: 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f   );..  /* Get lo
98a0: 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74  w-level informat
98b0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69  ion about the fi
98c0: 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75  le that we can u
98d0: 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61  sed to.  ** crea
98e0: 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65  te a unique name
98f0: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20   for the file.. 
9900: 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65   */.  fd = pFile
9910: 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73  ->h;.  rc = osFs
9920: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
9930: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
9940: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
9950: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
9960: 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f 57  #ifdef EOVERFLOW
9970: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
9980: 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52  lastErrno==EOVER
9990: 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51  FLOW ) return SQ
99a0: 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64  LITE_NOLFS;.#end
99b0: 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
99c0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
99d0: 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f  .#ifdef __APPLE_
99e0: 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f  _.  /* On OS X o
99f0: 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73  n an msdos files
9a00: 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65  ystem, the inode
9a10: 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72   number is repor
9a20: 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65  ted.  ** incorre
9a30: 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69  ctly for zero-si
9a40: 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74  ze files.  See t
9a50: 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f  icket #3260.  To
9a60: 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e   work.  ** aroun
9a70: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  d this problem (
9a80: 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61  we consider it a
9a90: 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f   bug in OS X, no
9aa0: 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77  t SQLite).  ** w
9ab0: 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73  e always increas
9ac0: 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
9ad0: 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20  to 1 by writing 
9ae0: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20  a single byte.  
9af0: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65  ** prior to acce
9b00: 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20  ssing the inode 
9b10: 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65  number.  The one
9b20: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73   byte written is
9b30: 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27  .  ** an ASCII '
9b40: 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69  S' character whi
9b50: 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20  ch also happens 
9b60: 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
9b70: 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  byte.  ** in the
9b80: 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79   header of every
9b90: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
9ba0: 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
9bb0: 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  if there.  ** is
9bc0: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
9bd0: 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74  n such that anot
9be0: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61  her thread has a
9bf0: 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
9c00: 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
9c10: 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
9c20: 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20  base, no damage 
9c30: 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  is done..  */.  
9c40: 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73  if( statbuf.st_s
9c50: 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65  ize==0 && (pFile
9c60: 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  ->fsFlags & SQLI
9c70: 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53  TE_FSFLAGS_IS_MS
9c80: 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64  DOS)!=0 ){.    d
9c90: 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28  o{ rc = osWrite(
9ca0: 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68  fd, "S", 1); }wh
9cb0: 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
9cc0: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  no==EINTR );.   
9cd0: 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20   if( rc!=1 ){.  
9ce0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
9cf0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
9d00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9d10: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
9d20: 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28     rc = osFstat(
9d30: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
9d40: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
9d50: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
9d60: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
9d70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9d80: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
9d90: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d  .  }.#endif..  m
9da0: 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30  emset(&fileId, 0
9db0: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
9dc0: 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20  );.  fileId.dev 
9dd0: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76  = statbuf.st_dev
9de0: 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ;.#if OS_VXWORKS
9df0: 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20  .  fileId.pId = 
9e00: 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73  pFile->pId;.#els
9e10: 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d  e.  fileId.ino =
9e20: 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b   statbuf.st_ino;
9e30: 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65  .#endif.  pInode
9e40: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
9e50: 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26  while( pInode &&
9e60: 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c   memcmp(&fileId,
9e70: 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64   &pInode->fileId
9e80: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
9e90: 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20  ) ){.    pInode 
9ea0: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
9eb0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64  .  }.  if( pInod
9ec0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f  e==0 ){.    pIno
9ed0: 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  de = sqlite3_mal
9ee0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e  loc( sizeof(*pIn
9ef0: 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ode) );.    if( 
9f00: 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  pInode==0 ){.   
9f10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9f20: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
9f30: 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c    memset(pInode,
9f40: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f   0, sizeof(*pIno
9f50: 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  de));.    memcpy
9f60: 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64  (&pInode->fileId
9f70: 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f  , &fileId, sizeo
9f80: 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20  f(fileId));.    
9f90: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31  pInode->nRef = 1
9fa0: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e  ;.    pInode->pN
9fb0: 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ext = inodeList;
9fc0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72  .    pInode->pPr
9fd0: 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ev = 0;.    if( 
9fe0: 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64  inodeList ) inod
9ff0: 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70  eList->pPrev = p
a000: 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65  Inode;.    inode
a010: 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20  List = pInode;. 
a020: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f   }else{.    pIno
a030: 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  de->nRef++;.  }.
a040: 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e    *ppInode = pIn
a050: 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ode;.  return SQ
a060: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
a070: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a080: 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
a090: 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
a0a0: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
a0b0: 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
a0c0: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
a0d0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
a0e0: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
a0f0: 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
a100: 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
a110: 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
a120: 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
a130: 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
a140: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
a150: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
a160: 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
a170: 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
a180: 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
a190: 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
a1a0: 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52  c int unixCheckR
a1b0: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
a1c0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
a1d0: 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
a1e0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
a1f0: 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
a200: 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
a210: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
a220: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
a230: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
a240: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
a250: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
a260: 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72  OCK; );..  asser
a270: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e  t( pFile );.  un
a280: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
a290: 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65  /* Because pFile
a2a0: 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
a2b0: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
a2c0: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  s */..  /* Check
a2d0: 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
a2e0: 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
a2f0: 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
a300: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
a310: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
a320: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
a330: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
a340: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65  ;.  }..  /* Othe
a350: 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
a360: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
a370: 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23  holds it..  */.#
a380: 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  ifndef __DJGPP__
a390: 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
a3a0: 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f   && !pFile->pIno
a3b0: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
a3c0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66   ){.    struct f
a3d0: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c  lock lock;.    l
a3e0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
a3f0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63  EEK_SET;.    loc
a400: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
a410: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c  RVED_BYTE;.    l
a420: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  ock.l_len = 1;. 
a430: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
a440: 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66   F_WRLCK;.    if
a450: 28 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d  ( osFcntl(pFile-
a460: 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
a470: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ck) ){.      rc 
a480: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
a490: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
a4a0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
a4b0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
a4c0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
a4d0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f   lock.l_type!=F_
a4e0: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  UNLCK ){.      r
a4f0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
a500: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
a510: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
a520: 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
a530: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
a540: 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22   %d %d (unix)\n"
a550: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
a560: 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a  reserved));..  *
a570: 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
a580: 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
a590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
a5a0: 74 20 74 6f 20 73 65 74 20 61 20 73 79 73 74 65  t to set a syste
a5b0: 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  m-lock on the fi
a5c0: 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c  le pFile.  The l
a5d0: 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72  ock is .** descr
a5e0: 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a  ibed by pLock..*
a5f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c  *.** If the pFil
a600: 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61  e was opened rea
a610: 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69  d/write from uni
a620: 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65  x-excl, then the
a630: 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76   only lock.** ev
a640: 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61  er obtained is a
a650: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
a660: 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61  , and it is obta
a670: 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63  ined exactly onc
a680: 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  e.** the first t
a690: 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20  ime any lock is 
a6a0: 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20  attempted.  All 
a6b0: 73 75 62 73 65 71 75 65 6e 74 20 73 79 73 74 65  subsequent syste
a6c0: 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65  m locking.** ope
a6d0: 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e  rations become n
a6e0: 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20  o-ops.  Locking 
a6f0: 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c  operations still
a700: 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c   happen internal
a710: 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ly,.** in order 
a720: 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63  to coordinate ac
a730: 63 65 73 73 20 62 65 74 77 65 65 6e 20 73 65 70  cess between sep
a740: 61 72 61 74 65 20 64 61 74 61 62 61 73 65 20 63  arate database c
a750: 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69  onnections.** wi
a760: 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  thin this proces
a770: 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68  s, but all of th
a780: 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e  at is handled in
a790: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a   memory and the.
a7a0: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
a7b0: 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72  tem does not par
a7c0: 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ticipate..**.** 
a7d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
a7e0: 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20   a pass-through 
a7f0: 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b  to fcntl(F_SETLK
a800: 29 20 69 66 20 70 46 69 6c 65 20 69 73 20 75 73  ) if pFile is us
a810: 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f  ing.** any VFS o
a820: 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d  ther than "unix-
a830: 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c  excl" or if pFil
a840: 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22  e is opened on "
a850: 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e  unix-excl".** an
a860: 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a  d is read-only..
a870: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
a880: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 61  turned if the ca
a890: 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63  ll completes suc
a8a0: 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31  cessfully, or -1
a8b0: 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f   if a call.** to
a8c0: 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20   fcntl() fails. 
a8d0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65 72  In this case, er
a8e0: 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f  rno is set appro
a8f0: 70 72 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e  priately (by fcn
a900: 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tl())..*/.static
a910: 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63   int unixFileLoc
a920: 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
a930: 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  e, struct flock 
a940: 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  *pLock){.  int r
a950: 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  c;.  unixInodeIn
a960: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
a970: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
a980: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
a990: 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72  eld() );.  asser
a9a0: 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a  t( pInode!=0 );.
a9b0: 20 20 69 66 28 20 28 28 70 46 69 6c 65 2d 3e 63    if( ((pFile->c
a9c0: 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
a9d0: 49 4c 45 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20  ILE_EXCL)!=0 || 
a9e0: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
a9f0: 4c 6f 63 6b 29 0a 20 20 20 26 26 20 28 28 70 46  Lock).   && ((pF
aa00: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
aa10: 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59   UNIXFILE_RDONLY
aa20: 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 69  )==0).  ){.    i
aa30: 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
aa40: 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
aa50: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
aa60: 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73   lock;.      ass
aa70: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
aa80: 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c  ck==0 );.      l
aa90: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
aaa0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
aab0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
aac0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
aad0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
aae0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
aaf0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
ab00: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72  F_WRLCK;.      r
ab10: 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  c = osFcntl(pFil
ab20: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
ab30: 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  lock);.      if(
ab40: 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 72   rc<0 ) return r
ab50: 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  c;.      pInode-
ab60: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20  >bProcessLock = 
ab70: 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  1;.      pInode-
ab80: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65  >nLock++;.    }e
ab90: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
aba0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
abb0: 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e  {.    rc = osFcn
abc0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
abd0: 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20  ETLK, pLock);.  
abe0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
abf0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
ac00: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
ac10: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
ac20: 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
ac30: 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
ac40: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
ac50: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
ac60: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
ac70: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
ac80: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
ac90: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
aca0: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
acb0: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
acc0: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
acd0: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
ace0: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
acf0: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
ad00: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
ad10: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
ad20: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
ad30: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
ad40: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
ad50: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
ad60: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
ad70: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
ad80: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
ad90: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
ada0: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
adb0: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
adc0: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
add0: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
ade0: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
adf0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
ae00: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
ae10: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
ae20: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
ae30: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
ae40: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
ae50: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
ae60: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
ae70: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
ae80: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
ae90: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
aea0: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
aeb0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
aec0: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
aed0: 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
aee0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
aef0: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
af00: 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
af10: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
af20: 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65   unixLock(sqlite
af30: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
af40: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a  eFileLock){.  /*
af50: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   The following d
af60: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70  escribes the imp
af70: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
af80: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73  he various locks
af90: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74   and.  ** lock t
afa0: 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65  ransitions in te
afb0: 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58  rms of the POSIX
afc0: 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64   advisory shared
afd0: 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20   and exclusive. 
afe0: 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69   ** lock primiti
aff0: 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64  ves (called read
b000: 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65  -locks and write
b010: 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f  -locks below, to
b020: 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66   avoid.  ** conf
b030: 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74  usion with SQLit
b040: 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54  e lock names). T
b050: 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72  he algorithms ar
b060: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20  e complicated.  
b070: 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f  ** slightly in o
b080: 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61  rder to be compa
b090: 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f  tible with windo
b0a0: 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c  ws systems simul
b0b0: 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61  taneously.  ** a
b0c0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
b0d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
b0e0: 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73   in case that is
b0f0: 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a   ever required..
b100: 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c    **.  ** Symbol
b110: 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e  s defined in os.
b120: 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20  h indentify the 
b130: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61  'pending byte' a
b140: 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64  nd the 'reserved
b150: 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63  .  ** byte', eac
b160: 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61  h single bytes a
b170: 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  t well known off
b180: 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73  sets, and the 's
b190: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
b1a0: 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20  range', a range 
b1b0: 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20  of 510 bytes at 
b1c0: 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  a well known off
b1d0: 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  set..  **.  ** T
b1e0: 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45  o obtain a SHARE
b1f0: 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c  D lock, a read-l
b200: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
b210: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a  on the 'pending.
b220: 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20    ** byte'.  If 
b230: 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66  this is successf
b240: 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74  ul, a random byt
b250: 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72  e from the 'shar
b260: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
b270: 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b  ge' is read-lock
b280: 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  ed and the lock 
b290: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
b2a0: 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a  byte' released..
b2b0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
b2c0: 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
b2d0: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
b2e0: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
b2f0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a   a SHARED lock..
b300: 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20    ** A RESERVED 
b310: 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e  lock is implemen
b320: 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20  ted by grabbing 
b330: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
b340: 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76  the.  ** 'reserv
b350: 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a  ed byte'. .  **.
b360: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
b370: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
b380: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66   PENDING lock af
b390: 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69  ter it has obtai
b3a0: 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45  ned a.  ** SHARE
b3b0: 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e  D lock. A PENDIN
b3c0: 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d  G lock is implem
b3d0: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
b3e0: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a  ng a write-lock.
b3f0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e    ** on the 'pen
b400: 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73  ding byte'. This
b410: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
b420: 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b   new SHARED lock
b430: 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62  s can be.  ** ob
b440: 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73  tained, but exis
b450: 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b  ting SHARED lock
b460: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  s are allowed to
b470: 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63   persist. A proc
b480: 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  ess.  ** does no
b490: 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e  t have to obtain
b4a0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
b4b0: 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61   on the way to a
b4c0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20   PENDING lock.. 
b4d0: 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74   ** This propert
b4e0: 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  y is used by the
b4f0: 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72   algorithm for r
b500: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
b510: 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
b520: 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20  after a crash.. 
b530: 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c   **.  ** An EXCL
b540: 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61  USIVE lock, obta
b550: 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e  ined after a PEN
b560: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c  DING lock is hel
b570: 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65  d, is.  ** imple
b580: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
b590: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
b5a0: 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27   on the entire '
b5b0: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
b5c0: 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61   range'. Since a
b5d0: 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72  ll other locks r
b5e0: 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f  equire a read-lo
b5f0: 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ck on one of the
b600: 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68   bytes.  ** with
b610: 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74  in this range, t
b620: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
b630: 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20   no other locks 
b640: 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a  are held on the.
b650: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a    ** database. .
b660: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65    **.  ** The re
b670: 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  ason a single by
b680: 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  te cannot be use
b690: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  d instead of the
b6a0: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
b6b0: 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61  ** range' is tha
b6c0: 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  t some versions 
b6d0: 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f  of windows do no
b6e0: 74 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c  t support read-l
b6f0: 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f  ocks. By.  ** lo
b700: 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62  cking a random b
b710: 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65  yte from a range
b720: 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41  , concurrent SHA
b730: 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78  RED locks may ex
b740: 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66  ist.  ** even if
b750: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69   the locking pri
b760: 6d 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61  mitive used is a
b770: 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f  lways a write-lo
b780: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72  ck..  */.  int r
b790: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b7a0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
b7b0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
b7c0: 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
b7d0: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
b7e0: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72  e->pInode;.  str
b7f0: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
b800: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30    int tErrno = 0
b810: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
b820: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
b830: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
b840: 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69  was %s(%s,%d) pi
b850: 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d=%d (unix)\n", 
b860: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
b870: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
b880: 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63  Lock), azFileLoc
b890: 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  k(pFile->eFileLo
b8a0: 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c  ck),.      azFil
b8b0: 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46  eLock(pInode->eF
b8c0: 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65  ileLock), pInode
b8d0: 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70  ->nShared , getp
b8e0: 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  id()));..  /* If
b8f0: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
b900: 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
b910: 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
b920: 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
b930: 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
b940: 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
b950: 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
b960: 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
b970: 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72  s.  ** unixEnter
b980: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
b990: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
b9a0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
b9b0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69  ->eFileLock>=eFi
b9c0: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53  leLock ){.    OS
b9d0: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
b9e0: 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
b9f0: 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e  y held) (unix)\n
ba00: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
ba10: 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
ba20: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29  ock(eFileLock)))
ba30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
ba40: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
ba50: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
ba60: 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
ba70: 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
ba80: 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
ba90: 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
baa0: 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
bab0: 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
bac0: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
bad0: 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
bae0: 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
baf0: 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
bb00: 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
bb10: 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
bb20: 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
bb30: 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
bb40: 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
bb50: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
bb60: 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
bb70: 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
bb80: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
bb90: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
bba0: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
bbb0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
bbc0: 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52  eFileLock!=RESER
bbd0: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
bbe0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
bbf0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
bc00: 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
bc10: 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
bc20: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
bc30: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
bc40: 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e  hreads.  */.  un
bc50: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
bc60: 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
bc70: 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  ->pInode;..  /* 
bc80: 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
bc90: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
bca0: 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
bcb0: 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
bcc0: 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
bcd0: 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
bce0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
bcf0: 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
bd00: 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
bd10: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
bd20: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
bd30: 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  & .          (pI
bd40: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
bd50: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
bd60: 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
bd70: 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
bd80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
bd90: 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  SY;.    goto end
bda0: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
bdb0: 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
bdc0: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
bdd0: 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
bde0: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
bdf0: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
be00: 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
be10: 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
be20: 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
be30: 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
be40: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
be50: 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
be60: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
be70: 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
be80: 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
be90: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
bea0: 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
beb0: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
bec0: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
bed0: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
bee0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
bef0: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
bf00: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
bf10: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
bf20: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
bf30: 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
bf40: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
bf50: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
bf60: 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
bf70: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
bf80: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  ++;.    goto end
bf90: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  _lock;.  }...  /
bfa0: 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
bfb0: 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
bfc0: 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
bfd0: 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
bfe0: 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
bff0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
c000: 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
c010: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
c020: 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
c030: 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
c040: 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65    */.  lock.l_le
c050: 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c  n = 1L;.  lock.l
c060: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
c070: 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c  ET;.  if( eFileL
c080: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
c090: 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
c0a0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
c0b0: 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
c0c0: 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
c0d0: 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
c0e0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28   lock.l_type = (
c0f0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
c100: 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46  D_LOCK?F_RDLCK:F
c110: 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63  _WRLCK);.    loc
c120: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
c130: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66  ING_BYTE;.    if
c140: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
c150: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
c160: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
c170: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
c180: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
c190: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
c1a0: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
c1b0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
c1c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
c1d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
c1e0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
c1f0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
c200: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f       goto end_lo
c210: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  ck;.    }.  }...
c220: 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
c230: 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69  gets to this poi
c240: 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c  nt, then actuall
c250: 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d  y go ahead and m
c260: 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  ake.  ** operati
c270: 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ng system calls 
c280: 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
c290: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d lock..  */.  i
c2a0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
c2b0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
c2c0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
c2d0: 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
c2e0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
c2f0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
c300: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
c310: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
c320: 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
c330: 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  the read-lock */
c340: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
c350: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
c360: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
c370: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
c380: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
c390: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
c3a0: 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  k) ){.      tErr
c3b0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
c3c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
c3d0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
c3e0: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
c3f0: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
c400: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   }..    /* Drop 
c410: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
c420: 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
c430: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c440: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
c450: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
c460: 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  1L;.    lock.l_t
c470: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
c480: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
c490: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
c4a0: 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ) && rc==SQLITE_
c4b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  OK ){.      /* T
c4c0: 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  his could happen
c4d0: 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20   with a network 
c4e0: 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74  mount */.      t
c4f0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
c500: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
c510: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a  _IOERR_UNLOCK; .
c520: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
c530: 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  c ){.      if( r
c540: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
c550: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
c560: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
c570: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
c580: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
c590: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c5a0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
c5b0: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
c5c0: 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  K;.      pInode-
c5d0: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
c5e0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
c5f0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
c600: 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
c610: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
c620: 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   && pInode->nSha
c630: 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  red>1 ){.    /* 
c640: 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
c650: 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
c660: 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
c670: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
c680: 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
c690: 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
c6a0: 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
c6b0: 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
c6c0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
c6d0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
c6e0: 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
c6f0: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
c700: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
c710: 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
c720: 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
c730: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
c740: 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
c750: 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
c760: 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
c770: 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69    assert( 0!=pFi
c780: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b  le->eFileLock );
c790: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
c7a0: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20   = F_WRLCK;..   
c7b0: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
c7c0: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
c7d0: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
c7e0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
c7f0: 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c  ;.    if( eFileL
c800: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
c810: 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  CK ){.      lock
c820: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
c830: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20  VED_BYTE;.      
c840: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
c850: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c860: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c870: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
c880: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
c890: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
c8a0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e     }..    if( un
c8b0: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
c8c0: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
c8d0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
c8e0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
c8f0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
c900: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
c910: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
c920: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
c930: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
c940: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
c950: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
c960: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
c970: 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 6e 64 65 66  .  }.  ..#ifndef
c980: 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74   NDEBUG.  /* Set
c990: 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
c9a0: 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion-counter chan
c9b0: 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67  ge checking flag
c9c0: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e  s when.  ** tran
c9d0: 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61  sitioning from a
c9e0: 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53   SHARED to a RES
c9f0: 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65  ERVED lock.  The
ca00: 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f   change.  ** fro
ca10: 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  m SHARED to RESE
ca20: 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62  RVED marks the b
ca30: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f  eginning of a no
ca40: 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20  rmal.  ** write 
ca50: 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61  operation (not a
ca60: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot journal rol
ca70: 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69  lback)..  */.  i
ca80: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ca90: 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  .   && pFile->eF
caa0: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
cab0: 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65  LOCK.   && eFile
cac0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
cad0: 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69  OCK.  ){.    pFi
cae0: 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
caf0: 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  g = 0;.    pFile
cb00: 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a  ->dbUpdate = 0;.
cb10: 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
cb20: 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20  malWrite = 1;.  
cb30: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28  }.#endif...  if(
cb40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
cb50: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
cb60: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
cb70: 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
cb80: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
cb90: 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
cba0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
cbb0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
cbc0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
cbd0: 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
cbe0: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
cbf0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
cc00: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  DING_LOCK;.  }..
cc10: 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
cc20: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
cc30: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
cc40: 20 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78    %d %s %s (unix
cc50: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
cc60: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
cc70: 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63  Lock), .      rc
cc80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
cc90: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
cca0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ccb0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66  ./*.** Add the f
ccc0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75  ile descriptor u
ccd0: 73 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64  sed by file hand
cce0: 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20  le pFile to the 
ccf0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
cd00: 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a   pUnused list..*
cd10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
cd20: 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46  tPendingFd(unixF
cd30: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
cd40: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
cd50: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
cd60: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
cd70: 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d  edFd *p = pFile-
cd80: 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70  >pUnused;.  p->p
cd90: 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Next = pInode->p
cda0: 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65  Unused;.  pInode
cdb0: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20  ->pUnused = p;. 
cdc0: 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
cdd0: 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64    pFile->pUnused
cde0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   = 0;.}../*.** L
cdf0: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
ce00: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
ce10: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
ce20: 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
ce30: 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
ce40: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
ce50: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
ce60: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
ce70: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
ce80: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
ce90: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
cea0: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
ceb0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
cec0: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
ced0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
cee0: 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68  -op..** .** If h
cef0: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69  andleNFSUnlock i
cf00: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20  s true, then on 
cf10: 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45  downgrading an E
cf20: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f  XCLUSIVE_LOCK to
cf30: 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62   SHARED.** the b
cf40: 79 74 65 20 72 61 6e 67 65 20 69 73 20 64 69 76  yte range is div
cf50: 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74  ided into 2 part
cf60: 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  s and the first 
cf70: 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64  part is unlocked
cf80: 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20   then.** set to 
cf90: 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65  a read lock, the
cfa0: 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61 72 74  n the other part
cfb0: 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63   is simply unloc
cfc0: 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  ked.  This works
cfd0: 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75   .** around a bu
cfe0: 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63  g in BSD NFS loc
cff0: 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e  kd (also seen on
d000: 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74   MacOSX 10.3+) t
d010: 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a  hat fails to .**
d020: 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74   remove the writ
d030: 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69  e lock on a regi
d040: 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  on when a read l
d050: 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73  ock is set..*/.s
d060: 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55  tatic int posixU
d070: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
d080: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
d090: 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c  eLock, int handl
d0a0: 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75  eNFSUnlock){.  u
d0b0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
d0c0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
d0d0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
d0e0: 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63  *pInode;.  struc
d0f0: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
d100: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d110: 4f 4b 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20  OK;.  int h;..  
d120: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
d130: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
d140: 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
d150: 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
d160: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
d170: 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
d180: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
d190: 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
d1a0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
d1b0: 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
d1c0: 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
d1d0: 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61  getpid()));..  a
d1e0: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
d1f0: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
d200: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
d210: 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
d220: 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
d230: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
d240: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
d250: 28 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65 2d  ();.  h = pFile-
d260: 3e 68 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  >h;.  pInode = p
d270: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
d280: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
d290: 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
d2a0: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
d2b0: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
d2c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d2d0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d2e0: 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
d2f0: 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c  ock );.    Simul
d300: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
d310: 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  (1);.    Simulat
d320: 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
d330: 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49   ).    SimulateI
d340: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
d350: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
d360: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
d370: 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
d380: 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
d390: 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
d3a0: 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
d3b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d3c0: 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
d3d0: 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
d3e0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
d3f0: 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
d400: 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
d410: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
d420: 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
d430: 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
d440: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
d450: 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
d460: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
d470: 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
d480: 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
d490: 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
d4a0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
d4b0: 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
d4c0: 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
d4d0: 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
d4e0: 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
d4f0: 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
d500: 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
d510: 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
d520: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
d530: 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 20 20 61    */.#if 0.    a
d540: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e  ssert( pFile->in
d550: 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20  NormalWrite==0. 
d560: 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
d570: 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20  ->dbUpdate==0.  
d580: 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
d590: 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
d5a0: 31 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1 );.#endif.    
d5b0: 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
d5c0: 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  rite = 0;.#endif
d5d0: 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61  ..    /* downgra
d5e0: 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64  ding to a shared
d5f0: 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76   lock on NFS inv
d600: 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74  olves clearing t
d610: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20  he write lock.  
d620: 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61    ** before esta
d630: 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65 61  blishing the rea
d640: 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64  dlock - to avoid
d650: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
d660: 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20  n we downgrade. 
d670: 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69     ** the lock i
d680: 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74  n 2 blocks, so t
d690: 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  hat part of the 
d6a0: 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f  range will be co
d6b0: 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20 20  vered by a .    
d6c0: 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e  ** write lock un
d6d0: 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73 20  til the rest is 
d6e0: 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65 61  covered by a rea
d6f0: 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20  d lock:.    **  
d700: 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20  1:   [WWWWW].   
d710: 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57   **  2:   [....W
d720: 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b  ].    **  3:   [
d730: 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34  RRRRW].    **  4
d740: 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20  :   [RRRR.].    
d750: 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65  */.    if( eFile
d760: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
d770: 4b 20 29 7b 0a 0a 23 69 66 20 21 64 65 66 69 6e  K ){..#if !defin
d780: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
d790: 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   !SQLITE_ENABLE_
d7a0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
d7b0: 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65      (void)handle
d7c0: 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  NFSUnlock;.     
d7d0: 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e   assert( handleN
d7e0: 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23  FSUnlock==0 );.#
d7f0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
d800: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
d810: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
d820: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
d830: 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55    if( handleNFSU
d840: 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  nlock ){.       
d850: 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20   int tErrno;    
d860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
d870: 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79  ror code from sy
d880: 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73  stem call errors
d890: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f   */.        off_
d8a0: 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52  t divSize = SHAR
d8b0: 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20  ED_SIZE - 1;.   
d8c0: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f       .        lo
d8d0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
d8e0: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
d8f0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
d900: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
d910: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
d920: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
d930: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
d940: 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
d950: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
d960: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
d970: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
d980: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
d990: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
d9a0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
d9b0: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
d9c0: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
d9d0: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
d9e0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
d9f0: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
da00: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
da10: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
da20: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
da30: 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
da40: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
da50: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
da60: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
da70: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
da80: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
da90: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
daa0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
dab0: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
dac0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
dad0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
dae0: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
daf0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
db00: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
db10: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
db20: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
db30: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  , SQLITE_IOERR_R
db40: 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
db50: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
db60: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
db70: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
db80: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
db90: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
dba0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
dbb0: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
dbc0: 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
dbd0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
dbe0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
dbf0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
dc00: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
dc10: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
dc20: 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b  D_FIRST+divSize;
dc30: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
dc40: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
dc50: 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  E-divSize;.     
dc60: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
dc70: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
dc80: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
dc90: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
dca0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
dcb0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
dcc0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
dcd0: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
dce0: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
dcf0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
dd00: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
dd10: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
dd20: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
dd30: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
dd40: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a    }.      }else.
dd50: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
dd60: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
dd70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
dd80: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20  CKING_STYLE */. 
dd90: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6c       {.        l
dda0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  ock.l_type = F_R
ddb0: 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  DLCK;.        lo
ddc0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
ddd0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
dde0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
ddf0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
de00: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
de10: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
de20: 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
de30: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
de40: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 20  lock) ){.       
de50: 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c     /* In theory,
de60: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69   the call to uni
de70: 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e  xFileLock() cann
de80: 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73 65 20  ot fail because 
de90: 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  another.        
dea0: 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20    ** process is 
deb0: 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d  holding an incom
dec0: 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66  patible lock. If
ded0: 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73 20 0a   it does, this .
dee0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64            ** ind
def0: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
df00: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
df10: 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   not following t
df20: 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20  he locking.     
df30: 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c       ** protocol
df40: 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
df50: 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
df60: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52  _IOERR_RDLOCK. R
df70: 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20  eturning.       
df80: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
df90: 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20  Y would confuse 
dfa0: 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
dfb0: 28 69 6e 20 70 72 61 63 74 69 63 65 20 69 74 20  (in practice it 
dfc0: 63 61 75 73 65 73 20 0a 20 20 20 20 20 20 20 20  causes .        
dfd0: 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74 20 74    ** an assert t
dfe0: 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20  o fail). */ .   
dff0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
e000: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b  TE_IOERR_RDLOCK;
e010: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
e020: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
e030: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 67  rno;.          g
e040: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
e050: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e060: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b  }.    }.    lock
e070: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
e080: 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  K;.    lock.l_wh
e090: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
e0a0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
e0b0: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
e0c0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
e0d0: 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20   = 2L;  assert( 
e0e0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d  PENDING_BYTE+1==
e0f0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b  RESERVED_BYTE );
e100: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
e110: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
e120: 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)==0 ){.      
e130: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
e140: 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
e150: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e160: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
e170: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
e180: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
e190: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
e1a0: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
e1b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
e1c0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  f( eFileLock==NO
e1d0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
e1e0: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68  Decrement the sh
e1f0: 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65  ared lock counte
e200: 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20  r.  Release the 
e210: 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20  lock using an.  
e220: 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c    ** OS call onl
e230: 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61  y when all threa
e240: 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20  ds in this same 
e250: 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c  process have rel
e260: 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65  eased.    ** the
e270: 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
e280: 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
e290: 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
e2a0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
e2b0: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
e2c0: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
e2d0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
e2e0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
e2f0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
e300: 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  rt = lock.l_len 
e310: 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75  = 0L;.      Simu
e320: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
e330: 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  n(1);.      Simu
e340: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
e350: 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75  -1) ).      Simu
e360: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
e370: 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
e380: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
e390: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b  le, &lock)==0 ){
e3a0: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
e3b0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
e3c0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  LOCK;.      }els
e3d0: 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
e3e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
e3f0: 4f 43 4b 3b 0a 09 70 46 69 6c 65 2d 3e 6c 61 73  OCK;..pFile->las
e400: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
e410: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
e420: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
e430: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
e440: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
e450: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
e460: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
e470: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  ecrement the cou
e480: 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69  nt of locks agai
e490: 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69  nst this same fi
e4a0: 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20  le.  When the.  
e4b0: 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68    ** count reach
e4c0: 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61  es zero, close a
e4d0: 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ny other file de
e4e0: 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20  scriptors whose 
e4f0: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73  close.    ** was
e500: 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73   deferred becaus
e510: 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  e of outstanding
e520: 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20   locks..    */. 
e530: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
e540: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
e550: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
e560: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
e570: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
e580: 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
e590: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
e5a0: 20 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e    }.  }...end_un
e5b0: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
e5c0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
e5d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
e5e0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e5f0: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
e600: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e610: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
e620: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
e630: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
e640: 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
e650: 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
e660: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
e670: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
e680: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
e690: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
e6a0: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
e6b0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
e6c0: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
e6d0: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
e6e0: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
e6f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
e700: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
e710: 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f  tic int unixUnlo
e720: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
e730: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
e740: 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f  ck){.  return po
e750: 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46  sixUnlock(id, eF
e760: 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a  ileLock, 0);.}..
e770: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
e780: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
e790: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
e7a0: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
e7b0: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
e7c0: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
e7d0: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
e7e0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
e7f0: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
e800: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
e810: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
e820: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
e830: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
e840: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
e850: 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
e860: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
e870: 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
e880: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
e890: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
e8a0: 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
e8b0: 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
e8c0: 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
e8d0: 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
e8e0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
e8f0: 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
e900: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
e910: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
e920: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
e930: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
e940: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
e950: 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66   if( pFile->dirf
e960: 64 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75  d>=0 ){.    robu
e970: 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
e980: 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 20 5f 5f  pFile->dirfd, __
e990: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69  LINE__);.    pFi
e9a0: 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20 20  le->dirfd=-1;.  
e9b0: 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  }.  if( pFile->h
e9c0: 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75 73  >=0 ){.    robus
e9d0: 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
e9e0: 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  File->h, __LINE_
e9f0: 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68  _);.    pFile->h
ea00: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f   = -1;.  }.#if O
ea10: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
ea20: 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20  pFile->pId ){.  
ea30: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73 44    if( pFile->isD
ea40: 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 75  elete ){.      u
ea50: 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64  nlink(pFile->pId
ea60: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
ea70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77  );.    }.    vxw
ea80: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
ea90: 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20  d(pFile->pId);. 
eaa0: 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20     pFile->pId = 
eab0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
eac0: 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
ead0: 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
eae0: 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  ->h));.  OpenCou
eaf0: 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69  nter(-1);.  sqli
eb00: 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
eb10: 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73  pUnused);.  mems
eb20: 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
eb30: 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
eb40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
eb50: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
eb60: 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
eb70: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f  atic int unixClo
eb80: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
eb90: 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *id){.  int rc =
eba0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
ebb0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
ebc0: 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
ebd0: 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c    unixUnlock(id,
ebe0: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69   NO_LOCK);.  uni
ebf0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a  xEnterMutex();..
ec00: 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49    /* unixFile.pI
ec10: 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 76  node is always v
ec20: 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65 72  alid here. Other
ec30: 77 69 73 65 2c 20 61 20 64 69 66 66 65 72 65 6e  wise, a differen
ec40: 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75  t close.  ** rou
ec50: 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63  tine (e.g. noloc
ec60: 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64 20  kClose()) would 
ec70: 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61  be called instea
ec80: 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
ec90: 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
eca0: 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c  >nLock>0 || pFil
ecb0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  e->pInode->bProc
ecc0: 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  essLock==0 );.  
ecd0: 69 66 28 20 41 4c 57 41 59 53 28 70 46 69 6c 65  if( ALWAYS(pFile
ece0: 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70 46 69  ->pInode) && pFi
ecf0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
ed00: 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  k ){.    /* If t
ed10: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
ed20: 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
ed30: 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
ed40: 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
ed50: 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
ed60: 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
ed70: 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
ed80: 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
ed90: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64  he file.    ** d
eda0: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
edb0: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73  ode->pUnused lis
edc0: 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  t.  It will be a
edd0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
ede0: 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sed .    ** when
edf0: 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
ee00: 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  s cleared..    *
ee10: 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67  /.    setPending
ee20: 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  Fd(pFile);.  }. 
ee30: 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
ee40: 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d  o(pFile);.  rc =
ee50: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
ee60: 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  d);.  unixLeaveM
ee70: 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
ee80: 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   rc;.}../*******
ee90: 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
eea0: 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
eeb0: 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  y lock implement
eec0: 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
eed0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
eee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef20: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
ef30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef70: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
ef80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef90: 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f  ******* No-op Lo
efa0: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
efb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efc0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f  ********.**.** O
efd0: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
efe0: 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
eff0: 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c  tions available,
f000: 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72 20   this is by far 
f010: 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a  the.** simplest:
f020: 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e    locking is ign
f030: 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70  ored.  No attemp
f040: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63  t is made to loc
f050: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  k the database.*
f060: 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  * file for readi
f070: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  ng or writing..*
f080: 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e  *.** This lockin
f090: 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70  g mode is approp
f0a0: 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e  riate for use on
f0b0: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
f0c0: 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74  ases.** (ex: dat
f0d0: 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65 20  abases that are 
f0e0: 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52  burned into CD-R
f0f0: 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  OM, for example.
f100: 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73  )  It can.** als
f110: 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  o be used if the
f120: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70   application emp
f130: 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e  loys some extern
f140: 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a  al mechanism to.
f150: 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c  ** prevent simul
f160: 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f  taneous access o
f170: 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  f the same datab
f180: 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f  ase by two or mo
f190: 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  re.** database c
f1a0: 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74  onnections.  But
f1b0: 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72 69   there is a seri
f1c0: 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61  ous risk of data
f1d0: 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69  base.** corrupti
f1e0: 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69  on if this locki
f1f0: 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
f200: 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68  in situations wh
f210: 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ere multiple.** 
f220: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
f230: 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73 69  ions are accessi
f240: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
f250: 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
f260: 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e   same.** time an
f270: 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  d one or more of
f280: 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f   those connectio
f290: 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a  ns are writing..
f2a0: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  */..static int n
f2b0: 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
f2c0: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
f2d0: 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
f2e0: 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55  t *pResOut){.  U
f2f0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
f300: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65  NotUsed);.  *pRe
f310: 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  sOut = 0;.  retu
f320: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f330: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
f340: 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
f350: 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
f360: 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
f370: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
f380: 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
f390: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
f3a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
f3b0: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63   int nolockUnloc
f3c0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f3d0: 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
f3e0: 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
f3f0: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
f400: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
f410: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f420: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
f430: 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  se the file..*/.
f440: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
f450: 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
f460: 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74  ile *id) {.  ret
f470: 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
f480: 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  e(id);.}../*****
f490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
f4a0: 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20  nd of the no-op 
f4b0: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
f4c0: 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
f4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
f4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f520: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
f530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
f580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f590: 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66  **** Begin dot-f
f5a0: 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ile Locking ****
f5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
f5d0: 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63   The dotfile loc
f5e0: 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
f5f0: 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78 69  ion uses the exi
f600: 73 74 61 6e 63 65 20 6f 66 20 73 65 70 61 72 61  stance of separa
f610: 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73  te lock.** files
f620: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
f630: 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74  trol access to t
f640: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
f650: 69 73 20 77 6f 72 6b 73 20 6f 6e 20 6a 75 73 74  is works on just
f660: 0a 2a 2a 20 61 62 6f 75 74 20 65 76 65 72 79 20  .** about every 
f670: 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69  filesystem imagi
f680: 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72  nable.  But ther
f690: 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f  e are serious do
f6a0: 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  wnsides:.**.**  
f6b0: 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20    (1)  There is 
f6c0: 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79  zero concurrency
f6d0: 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64  .  A single read
f6e0: 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74  er blocks all ot
f6f0: 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  her.**         c
f700: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
f710: 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
f720: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
f730: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41  .**.**    (2)  A
f740: 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72  n application cr
f750: 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73  ash or power los
f760: 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c  s can leave stal
f770: 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20  e lock files.** 
f780: 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20          sitting 
f790: 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64  around that need
f7a0: 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d   to be cleared m
f7b0: 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  anually..**.** N
f7c0: 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64  evertheless, a d
f7d0: 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70  otlock is an app
f7e0: 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
f7f0: 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66   mode for use if
f800: 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63   no.** other loc
f810: 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73  king strategy is
f820: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
f830: 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
f840: 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74  g works by creat
f850: 69 6e 67 20 61 20 66 69 6c 65 20 69 6e 20 74 68  ing a file in th
f860: 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
f870: 20 61 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   as the.** datab
f880: 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65  ase and with the
f890: 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77   same name but w
f8a0: 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78  ith a ".lock" ex
f8b0: 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  tension added..*
f8c0: 2a 20 54 68 65 20 65 78 69 73 74 61 6e 63 65 20  * The existance 
f8d0: 6f 66 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 69  of a lock file i
f8e0: 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53  mplies an EXCLUS
f8f0: 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f  IVE lock.  All o
f900: 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70  ther lock.** typ
f910: 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45  es (SHARED, RESE
f920: 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61  RVED, PENDING) a
f930: 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45  re mapped into E
f940: 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a  XCLUSIVE..*/../*
f950: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66  .** The file suf
f960: 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65  fix added to the
f970: 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e   data base filen
f980: 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ame in order to 
f990: 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f  create the.** lo
f9a0: 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66  ck file..*/.#def
f9b0: 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  ine DOTLOCK_SUFF
f9c0: 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a  IX ".lock"../*.*
f9d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
f9e0: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
f9f0: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
fa00: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
fa10: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
fa20: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
fa30: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
fa40: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
fa50: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
fa60: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
fa70: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
fa80: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
fa90: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
faa0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
fab0: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
fac0: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
fad0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
fae0: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
faf0: 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  cking..**.** In 
fb00: 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
fb10: 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65   either a lock e
fb20: 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73  xists or it does
fb30: 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69   not.  So in thi
fb40: 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f  s.** variation o
fb50: 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  f CheckReservedL
fb60: 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20  ock(), *pResOut 
fb70: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69  is set to true i
fb80: 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f any lock.** is
fb90: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
fba0: 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74  e and false if t
fbb0: 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  he file is unloc
fbc0: 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ked..*/.static i
fbd0: 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  nt dotlockCheckR
fbe0: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
fbf0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
fc00: 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
fc10: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
fc20: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
fc30: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
fc40: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
fc50: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
fc60: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
fc70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
fc80: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
fc90: 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
fca0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
fcb0: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
fcc0: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
fcd0: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
fce0: 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
fcf0: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
fd00: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
fd10: 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
fd20: 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
fd30: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f  or some other co
fd40: 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nnection in the 
fd50: 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20  same process.   
fd60: 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b   ** holds a lock
fd70: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e   on the file.  N
fd80: 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
fd90: 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  further. */.    
fda0: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
fdb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
fdc0: 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69  e lock is held i
fdd0: 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68  f and only if th
fde0: 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74  e lockfile exist
fdf0: 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  s */.    const c
fe00: 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
fe10: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46   (const char*)pF
fe20: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
fe30: 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65  ext;.    reserve
fe40: 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c 6f  d = osAccess(zLo
fe50: 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20  ckFile, 0)==0;. 
fe60: 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
fe70: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
fe80: 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d %d (dotlock)\n
fe90: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
fea0: 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a   reserved));.  *
feb0: 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
fec0: 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
fed0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
fee0: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
fef0: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
ff00: 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
ff10: 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
ff20: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
ff30: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
ff40: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
ff50: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
ff60: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
ff70: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
ff80: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
ff90: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
ffa0: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
ffb0: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
ffc0: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
ffd0: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
ffe0: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
fff0: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
10000 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
10010 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
10020 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
10030 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
10040 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
10050 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
10060 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
10070 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
10080 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
10090 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
100a0 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
100b0 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
100c0 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
100d0 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
100e0 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
100f0 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
10100 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
10110 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
10120 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
10130 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
10140 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
10150 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
10160 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
10170 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
10180 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
10190 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
101a0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
101b0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
101c0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
101d0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
101e0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
101f0 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  vel..**.** With 
10200 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
10210 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20   we really only 
10220 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34  support state (4
10230 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a  ): EXCLUSIVE..**
10240 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68   But we track th
10250 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  e other locking 
10260 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c  levels internall
10270 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
10280 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c   dotlockLock(sql
10290 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
102a0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
102b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
102c0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
102d0 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63  d;.  int fd;.  c
102e0 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
102f0 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
10300 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
10310 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10320 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20  E_OK;...  /* If 
10330 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b  we have any lock
10340 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
10350 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  file already exi
10360 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76  sts.  All we hav
10370 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
10380 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72  adjust our inter
10390 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
103a0 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20  e lock level..  
103b0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
103c0 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
103d0 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
103e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
103f0 69 6c 65 4c 6f 63 6b 3b 0a 23 69 66 20 21 4f 53  ileLock;.#if !OS
10400 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 2f 2a 20  _VXWORKS.    /* 
10410 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68  Always update th
10420 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74  e timestamp on t
10430 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20  he old file */. 
10440 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46     utimes(zLockF
10450 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  ile, NULL);.#end
10460 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
10470 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
10480 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
10490 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
104a0 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
104b0 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52 44  n(zLockFile,O_RD
104c0 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45  ONLY|O_CREAT|O_E
104d0 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66 28  XCL,0600);.  if(
104e0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20   fd<0 ){.    /* 
104f0 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63  failed to open/c
10500 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20  reate the file, 
10510 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79  someone else may
10520 20 68 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65   have stolen the
10530 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74   lock */.    int
10540 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
10550 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54 20  .    if( EEXIST 
10560 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  == tErrno ){.   
10570 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
10580 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  USY;.    } else 
10590 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
105a0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
105b0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
105c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
105d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
105e0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
105f0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
10600 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
10610 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
10620 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
10630 3b 0a 20 20 7d 20 0a 20 20 72 6f 62 75 73 74 5f  ;.  } .  robust_
10640 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c  close(pFile, fd,
10650 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 0a 20   __LINE__);.  . 
10660 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
10670 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
10680 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
10690 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
106a0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
106b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
106c0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
106d0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
106e0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
106f0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
10700 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
10710 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
10720 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
10730 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
10740 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
10750 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
10760 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
10770 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
10780 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
10790 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
107a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
107b0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  o-op..**.** When
107c0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
107d0 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f  el reaches NO_LO
107e0 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  CK, delete the l
107f0 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ock file..*/.sta
10800 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
10810 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
10820 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
10830 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
10840 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10850 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68  ixFile*)id;.  ch
10860 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
10870 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
10880 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a  ockingContext;..
10890 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
108a0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
108b0 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
108c0 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c   %d pid=%d (dotl
108d0 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
108e0 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20  h, eFileLock,.. 
108f0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
10900 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
10910 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
10920 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
10930 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
10940 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
10950 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
10960 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
10970 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
10980 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
10990 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61  .  /* To downgra
109a0 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69  de to shared, si
109b0 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20  mply update our 
109c0 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20  internal notion 
109d0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b  of the.  ** lock
109e0 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64   state.  No need
109f0 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68   to mess with th
10a00 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
10a10 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
10a20 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
10a30 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
10a40 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
10a50 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  ED_LOCK;.    ret
10a60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10a70 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75   }.  .  /* To fu
10a80 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64  lly unlock the d
10a90 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20  atabase, delete 
10aa0 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  the lock file */
10ab0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
10ac0 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b  Lock==NO_LOCK );
10ad0 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b 28 7a 4c  .  if( unlink(zL
10ae0 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  ockFile) ){.    
10af0 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 20 20  int rc = 0;.    
10b00 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
10b10 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45  no;.    if( ENOE
10b20 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  NT != tErrno ){.
10b30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10b40 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
10b50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
10b60 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
10b70 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
10b80 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
10b90 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  no;.    }.    re
10ba0 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20  turn rc; .  }.  
10bb0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10bc0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
10bd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10be0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
10bf0 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72   file.  Make sur
10c00 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62  e the lock has b
10c10 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66  een released bef
10c20 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a  ore closing..*/.
10c30 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
10c40 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
10c50 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
10c60 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20 29  t rc;.  if( id )
10c70 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
10c80 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
10c90 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f  e*)id;.    dotlo
10ca0 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
10cb0 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74  LOCK);.    sqlit
10cc0 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
10cd0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
10ce0 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65    }.  rc = close
10cf0 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
10d00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a  return rc;.}./**
10d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d20 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d   End of the dot-
10d30 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  file lock implem
10d40 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
10d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
10d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
10db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
10e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e10 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66  ******** Begin f
10e20 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  lock Locking ***
10e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
10e50 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63  .** Use the floc
10e60 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  k() system call 
10e70 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69  to do file locki
10e80 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28  ng..**.** flock(
10e90 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b  ) locking is lik
10ea0 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69  e dot-file locki
10eb0 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76  ng in that the v
10ec0 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67  arious.** fine-g
10ed0 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  rain locking lev
10ee0 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79  els supported by
10ef0 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c   SQLite are coll
10f00 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20  apsed into.** a 
10f10 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65  single exclusive
10f20 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72   lock.  In other
10f30 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20   words, SHARED, 
10f40 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a  RESERVED, and.**
10f50 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61   PENDING locks a
10f60 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  re the same thin
10f70 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56  g as an EXCLUSIV
10f80 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a  E lock.  SQLite.
10f90 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77  ** still works w
10fa0 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c  hen you do this,
10fb0 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79   but concurrency
10fc0 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63   is reduced sinc
10fd0 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e.** only a sing
10fe0 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62  le process can b
10ff0 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  e reading the da
11000 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65  tabase at a time
11010 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69  ..**.** Omit thi
11020 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c  s section if SQL
11030 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
11040 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e  NG_STYLE is turn
11050 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20  ed off or if.** 
11060 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56 58  compiling for VX
11070 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51  WORKS..*/.#if SQ
11080 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
11090 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
110a0 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20  _VXWORKS../*.** 
110b0 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61  Retry flock() ca
110c0 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77 69  lls that fail wi
110d0 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64  th EINTR.*/.#ifd
110e0 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20  ef EINTR.static 
110f0 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  int robust_flock
11100 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29  (int fd, int op)
11110 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  {.  int rc;.  do
11120 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c  { rc = flock(fd,
11130 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  op); }while( rc<
11140 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
11150 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
11160 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
11170 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  ne robust_flock(
11180 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a  a,b) flock(a,b).
11190 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a  #endif.     ../*
111a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
111b0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
111c0 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
111d0 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
111e0 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
111f0 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
11200 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
11210 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
11220 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
11230 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
11240 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
11250 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
11260 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
11270 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
11280 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
11290 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
112a0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
112b0 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
112c0 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
112d0 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63  ic int flockChec
112e0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
112f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11300 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
11310 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11320 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
11330 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
11340 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11350 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
11360 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
11370 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
11380 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
11390 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
113a0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
113b0 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ;.  .  /* Check 
113c0 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
113d0 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
113e0 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
113f0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
11400 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
11410 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
11420 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
11430 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
11440 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
11450 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
11460 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
11470 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
11480 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74  attempt to get t
11490 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  he lock */.    i
114a0 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f  nt lrc = robust_
114b0 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
114c0 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
114d0 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
114e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
114f0 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
11500 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
11510 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
11520 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
11530 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  UN);.      if ( 
11540 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20  lrc ) {.        
11550 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
11560 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75  no;.        /* u
11570 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74  nlock failed wit
11580 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  h an error */.  
11590 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49        lrc = SQLI
115a0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
115b0 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53   .        if( IS
115c0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
115d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
115e0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
115f0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
11600 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
11610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11620 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
11630 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
11640 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65  rrno;.      rese
11650 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
11660 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
11670 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65  might have it re
11680 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20  served */.      
11690 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
116a0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
116b0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
116c0 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20  OERR_LOCK); .   
116d0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
116e0 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
116f0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11700 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
11710 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
11720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11730 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
11740 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
11750 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  %d %d (flock)\n"
11760 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
11770 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66  reserved));..#if
11780 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
11790 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
117a0 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20  ORS.  if( (rc & 
117b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
117c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
117d0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
117e0 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65  _OK;.    reserve
117f0 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d=1;.  }.#endif 
11800 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
11810 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
11820 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74  RS */.  *pResOut
11830 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
11840 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11850 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
11860 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
11870 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
11880 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
11890 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
118a0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
118b0 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
118c0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
118d0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
118e0 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
118f0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
11900 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
11910 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
11920 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
11930 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
11940 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
11950 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
11960 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
11970 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
11980 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
11990 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
119a0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
119b0 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
119c0 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
119d0 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
119e0 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
119f0 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
11a00 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
11a10 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
11a20 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
11a30 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
11a40 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
11a50 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
11a60 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
11a70 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
11a80 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
11a90 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
11aa0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
11ab0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
11ac0 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
11ad0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
11ae0 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
11af0 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
11b00 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e  **.** flock() on
11b10 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
11b20 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
11b30 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
11b40 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
11b50 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
11b60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
11b70 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
11b80 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
11b90 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
11ba0 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
11bb0 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
11bc0 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
11bd0 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
11be0 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
11bf0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11c00 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
11c10 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
11c20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
11c30 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
11c40 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
11c50 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
11c60 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f  atic int flockLo
11c70 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11c80 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
11c90 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ck) {.  int rc =
11ca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
11cb0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11cc0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
11cd0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
11ce0 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  );..  /* if we a
11cf0 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
11d00 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
11d10 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
11d20 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
11d30 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
11d40 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
11d50 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
11d60 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
11d70 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11d80 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
11d90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11da0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
11db0 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
11dc0 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20  ve lock */.  .  
11dd0 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  if (robust_flock
11de0 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
11df0 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b  EX | LOCK_NB)) {
11e00 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
11e10 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20  = errno;.    /* 
11e20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74  didn't get, must
11e30 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20   be busy */.    
11e40 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
11e50 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
11e60 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
11e70 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  ERR_LOCK);.    i
11e80 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
11e90 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
11ea0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11eb0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
11ec0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a   } else {.    /*
11ed0 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
11ee0 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
11ef0 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65   ok */.    pFile
11f00 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
11f10 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f  ileLock;.  }.  O
11f20 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
11f30 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b   %d %s %s (flock
11f40 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
11f50 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
11f60 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
11f70 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
11f80 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
11f90 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  d"));.#ifdef SQL
11fa0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
11fb0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
11fc0 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f  f( (rc & SQLITE_
11fd0 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
11fe0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
11ff0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
12000 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
12010 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
12020 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
12030 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12040 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
12050 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
12060 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
12070 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
12080 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
12090 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
120a0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
120b0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
120c0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
120d0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
120e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
120f0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
12100 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
12110 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
12120 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
12130 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
12140 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
12150 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
12160 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
12170 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
12180 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
12190 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
121a0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
121b0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
121c0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
121d0 73 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f  s %d pid=%d (flo
121e0 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
121f0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
12200 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
12210 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64  FileLock, getpid
12220 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
12230 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
12240 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
12250 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
12260 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
12270 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
12280 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
12290 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
122a0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
122b0 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
122c0 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
122d0 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
122e0 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
122f0 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
12300 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
12310 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12320 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
12330 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12340 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
12350 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f  no, really, unlo
12360 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62  ck. */.  if( rob
12370 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
12380 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a  >h, LOCK_UN) ){.
12390 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
123a0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
123b0 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72  ERRORS.    retur
123c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
123d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
123e0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
123f0 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65  ERRORS */.    re
12400 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
12410 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73  R_UNLOCK;.  }els
12420 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  e{.    pFile->eF
12430 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
12440 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
12450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
12460 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
12470 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
12480 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c  t flockClose(sql
12490 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
124a0 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
124b0 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c   flockUnlock(id,
124c0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20   NO_LOCK);.  }. 
124d0 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
124e0 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65  xFile(id);.}..#e
124f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
12500 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12510 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
12520 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  K */../*********
12530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
12540 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b  f the flock lock
12550 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12570 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
12580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125c0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
125d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12610 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
12620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
12630 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61  Begin Named Sema
12640 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a  phore Locking **
12650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12660 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d  ******.**.** Nam
12670 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
12680 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70  king is only sup
12690 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b  ported on VxWork
126a0 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f  s..**.** Semapho
126b0 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  re locking is li
126c0 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20  ke dot-lock and 
126d0 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74  flock in that it
126e0 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20   really only.** 
126f0 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49  supports EXCLUSI
12700 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c  VE locking.  Onl
12710 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  y a single proce
12720 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77  ss can read or w
12730 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  rite.** the data
12740 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20 74  base file at a t
12750 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75 63  ime.  This reduc
12760 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e  es potential con
12770 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a  currency, but.**
12780 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20   makes the lock 
12790 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
127a0 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23  uch easier..*/.#
127b0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f  if OS_VXWORKS../
127c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
127d0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
127e0 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
127f0 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
12800 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
12810 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
12820 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
12830 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
12840 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
12850 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
12860 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
12870 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
12880 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
12890 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
128a0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
128b0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
128c0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
128d0 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
128e0 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
128f0 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65 63 6b  tic int semCheck
12900 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
12910 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
12920 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
12930 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12940 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
12950 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
12960 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
12970 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
12980 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
12990 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
129a0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
129b0 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
129c0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
129d0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
129e0 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
129f0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
12a00 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
12a10 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
12a20 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
12a30 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
12a40 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
12a50 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
12a60 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
12a70 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
12a80 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
12a90 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a  d ){.    sem_t *
12aa0 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
12ab0 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20  node->pSem;.    
12ac0 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
12ad0 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20 73 65  Buf;..    if( se
12ae0 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
12af0 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =-1 ){.      int
12b00 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
12b10 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41 49  .      if( EAGAI
12b20 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  N != tErrno ){. 
12b30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12b40 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
12b50 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
12b60 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
12b70 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20  RESERVEDLOCK);. 
12b80 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
12b90 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
12ba0 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
12bb0 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65  .        /* some
12bc0 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68 65  one else has the
12bd0 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72   lock when we ar
12be0 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a  e in NO_LOCK */.
12bf0 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
12c00 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65   = (pFile->eFile
12c10 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f  Lock < SHARED_LO
12c20 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
12c30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
12c40 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69   we could have i
12c50 74 20 69 66 20 77 65 20 77 61 6e 74 20 69 74 20  t if we want it 
12c60 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73  */.      sem_pos
12c70 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  t(pSem);.    }. 
12c80 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
12c90 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
12ca0 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70  d %d (sem)\n", p
12cb0 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
12cc0 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
12cd0 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
12ce0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12cf0 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
12d00 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
12d10 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
12d20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
12d30 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
12d40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
12d50 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
12d60 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
12d70 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
12d80 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
12d90 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
12da0 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
12db0 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
12dc0 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
12dd0 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
12de0 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
12df0 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
12e00 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
12e10 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
12e20 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
12e30 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
12e40 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
12e50 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
12e60 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
12e70 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
12e80 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
12e90 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
12ea0 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
12eb0 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
12ec0 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
12ed0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
12ee0 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
12ef0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
12f00 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
12f10 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
12f20 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
12f30 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
12f40 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
12f50 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
12f60 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
12f70 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
12f80 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
12f90 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
12fa0 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68  IVE.**.** Semaph
12fb0 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72  ore locks only r
12fc0 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
12fd0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
12fe0 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
12ff0 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
13000 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
13010 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
13020 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
13030 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
13040 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
13050 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
13060 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
13070 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
13080 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
13090 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
130a0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
130b0 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
130c0 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
130d0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
130e0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
130f0 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
13100 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
13110 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c   int semLock(sql
13120 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13130 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
13140 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
13150 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
13160 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 73  d;.  int fd;.  s
13170 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
13180 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
13190 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
131a0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66  ITE_OK;..  /* if
131b0 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
131c0 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
131d0 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
131e0 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
131f0 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
13200 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
13210 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if (pFile->eFile
13220 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  Lock > NO_LOCK) 
13230 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
13240 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
13250 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ck;.    rc = SQL
13260 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
13270 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
13280 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20   }.  .  /* lock 
13290 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75  semaphore now bu
132a0 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20  t bail out when 
132b0 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20  already locked. 
132c0 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79  */.  if( sem_try
132d0 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  wait(pSem)==-1 )
132e0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
132f0 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
13300 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
13310 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c   }..  /* got it,
13320 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
13330 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
13340 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13350 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a  k = eFileLock;..
13360 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20   sem_end_lock:. 
13370 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13380 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
13390 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
133a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
133b0 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
133c0 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
133d0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
133e0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
133f0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
13400 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
13410 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
13420 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
13430 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
13440 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
13450 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
13460 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
13470 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
13480 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f  atic int semUnlo
13490 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
134a0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
134b0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
134c0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
134d0 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
134e0 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
134f0 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20  pInode->pSem;.. 
13500 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
13510 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d  ;.  assert( pSem
13520 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
13530 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
13540 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d  s %d pid=%d (sem
13550 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
13560 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70  eFileLock,..   p
13570 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
13580 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61   getpid()));.  a
13590 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
135a0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
135b0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
135c0 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
135d0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
135e0 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
135f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13600 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
13610 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
13620 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
13630 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
13640 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
13650 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f  */.  if (eFileLo
13660 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
13670 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
13680 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
13690 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
136a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
136b0 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
136c0 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  y unlock. */.  i
136d0 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65  f ( sem_post(pSe
136e0 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  m)==-1 ) {.    i
136f0 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20  nt rc, tErrno = 
13700 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  errno;.    rc = 
13710 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
13720 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
13730 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
13740 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  NLOCK);.    if( 
13750 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
13760 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
13770 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
13780 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
13790 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
137a0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
137b0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
137c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
137d0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
137e0 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74  e a file.. */.st
137f0 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73  atic int semClos
13800 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
13810 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
13820 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
13830 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13840 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e  e*)id;.    semUn
13850 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
13860 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
13870 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78  File );.    unix
13880 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
13890 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
138a0 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75  fo(pFile);.    u
138b0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
138c0 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69  .    closeUnixFi
138d0 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  le(id);.  }.  re
138e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
138f0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  }..#endif /* OS_
13900 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a  VXWORKS */./*.**
13910 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
13920 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
13930 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78   available on Vx
13940 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  Works..**.******
13950 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
13960 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70   the named semap
13970 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  hore lock implem
13980 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
13990 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
139a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139e0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a  ********/.../***
139f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
13a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a50 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46  ******* Begin AF
13a60 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  P Locking ******
13a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
13a90 2a 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70  * AFP is the App
13aa0 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63  le Filing Protoc
13ab0 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65  ol.  AFP is a ne
13ac0 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d  twork filesystem
13ad0 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70   found.** on App
13ae0 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d  le Macintosh com
13af0 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53  puters - both OS
13b00 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a  9 and OSX..**.**
13b10 20 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70   Third-party imp
13b20 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
13b30 41 46 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c  AFP are availabl
13b40 65 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f 64  e.  But this cod
13b50 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77  e here.** only w
13b60 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a  orks on OSX..*/.
13b70 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
13b80 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
13b90 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
13ba0 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _STYLE./*.** The
13bb0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13bc0 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  xt structure con
13bd0 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f  tains all afp lo
13be0 63 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74  ck specific stat
13bf0 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
13c00 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
13c10 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67  ntext afpLocking
13c20 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
13c30 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
13c40 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  t {.  int reserv
13c50 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed;.  const char
13c60 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
13c70 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
13c80 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
13c90 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74  /.};..struct Byt
13ca0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a  eRangeLockPB2.{.
13cb0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
13cc0 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20  long offset;    
13cd0 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f      /* offset to
13ce0 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c   first byte to l
13cf0 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
13d00 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
13d10 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62  th;        /* nb
13d20 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
13d30 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
13d40 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61   long long retRa
13d50 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72  ngeStart; /* nbr
13d60 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63   of 1st byte loc
13d70 6b 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ked if successfu
13d80 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
13d90 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b  char unLockFlag;
13da0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20           /* 1 = 
13db0 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b  unlock, 0 = lock
13dc0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
13dd0 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67  har startEndFlag
13de0 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c  ;       /* 1=rel
13df0 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c   to end of fork,
13e00 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20   0=rel to start 
13e10 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
13e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e30 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64         /* file d
13e40 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69  esc to assoc thi
13e50 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d  s lock with */.}
13e60 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73  ;..#define afpfs
13e70 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
13e80 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52  CTL        _IOWR
13e90 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
13ea0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
13eb0 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  2)../*.** This i
13ec0 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20  s a utility for 
13ed0 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72  setting or clear
13ee0 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20  ing a bit-range 
13ef0 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46  lock on an.** AF
13f00 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a  P filesystem..**
13f10 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49   .** Return SQLI
13f20 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
13f30 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e  , SQLITE_BUSY on
13f40 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
13f50 74 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f  tic int afpSetLo
13f60 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ck(.  const char
13f70 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20   *path,         
13f80 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
13f90 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c  the file to be l
13fa0 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65  ocked or unlocke
13fb0 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  d */.  unixFile 
13fc0 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
13fd0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
13fe0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
13ff0 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67   path */.  unsig
14000 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
14010 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72  fset,     /* Fir
14020 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
14030 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cked */.  unsign
14040 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e  ed long long len
14050 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  gth,     /* Numb
14060 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
14070 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74  ock */.  int set
14080 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20  LockFlag        
14090 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
140a0 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61  to set lock.  Fa
140b0 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63  lse to clear loc
140c0 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  k */.){.  struct
140d0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
140e0 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b  2 pb;.  int err;
140f0 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46  .  .  pb.unLockF
14100 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61  lag = setLockFla
14110 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e  g ? 0 : 1;.  pb.
14120 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30  startEndFlag = 0
14130 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20  ;.  pb.offset = 
14140 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e  offset;.  pb.len
14150 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20  gth = length; . 
14160 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e   pb.fd = pFile->
14170 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28  h;.  .  OSTRACE(
14180 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73  ("AFPSETLOCK [%s
14190 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61  ] for %d%s in ra
141a0 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22  nge %llx:%llx\n"
141b0 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46  , .    (setLockF
141c0 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c  lag?"ON":"OFF"),
141d0 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66   pFile->h, (pb.f
141e0 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d  d==-1?"[testval-
141f0 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66  1]":""),.    off
14200 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20  set, length));. 
14210 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74   err = fsctl(pat
14220 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  h, afpfsByteRang
14230 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62  eLock2FSCTL, &pb
14240 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72  , 0);.  if ( err
14250 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
14260 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72   rc;.    int tEr
14270 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
14280 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45   OSTRACE(("AFPSE
14290 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20  TLOCK failed to 
142a0 66 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20  fsctl() '%s' %d 
142b0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
142c0 20 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f      path, tErrno
142d0 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e  , strerror(tErrn
142e0 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  o)));.#ifdef SQL
142f0 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c  ITE_IGNORE_AFP_L
14300 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72  OCK_ERRORS.    r
14310 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
14320 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20  .#else.    rc = 
14330 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
14340 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
14350 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14360 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61        setLockFla
14370 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  g ? SQLITE_IOERR
14380 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49  _LOCK : SQLITE_I
14390 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
143a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
143b0 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
143c0 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28  RRORS */.    if(
143d0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
143e0 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
143f0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
14400 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
14410 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
14420 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
14430 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14440 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
14450 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
14460 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
14470 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
14480 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
14490 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
144a0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
144b0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
144c0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
144d0 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
144e0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
144f0 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
14500 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
14510 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
14520 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
14530 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
14540 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
14550 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
14560 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
14570 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
14580 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
14590 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
145a0 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
145b0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
145c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
145d0 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
145e0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
145f0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14600 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45    .  SimulateIOE
14610 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
14620 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
14630 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
14640 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
14650 6c 65 20 29 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  le );.  afpLocki
14660 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
14670 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
14680 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
14690 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
146a0 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d  ;.  if( context-
146b0 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  >reserved ){.   
146c0 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20   *pResOut = 1;. 
146d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
146e0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
146f0 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20  nterMutex(); /* 
14700 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  Because pFile->p
14710 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
14720 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a  across threads *
14730 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  /.  .  /* Check 
14740 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
14750 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
14760 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
14770 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
14780 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
14790 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
147a0 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
147b0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
147c0 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
147d0 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
147e0 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f   holds it..   */
147f0 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
14800 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20   ){.    /* lock 
14810 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74  the RESERVED byt
14820 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  e */.    int lrc
14830 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
14840 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
14850 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
14860 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20  YTE, 1,1);  .   
14870 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
14880 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lrc ){.      /* 
14890 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20  if we succeeded 
148a0 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65  in taking the re
148b0 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c  served lock, unl
148c0 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72  ock it to restor
148d0 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f  e.      ** the o
148e0 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f  riginal state */
148f0 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70  .      lrc = afp
14900 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
14910 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
14920 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
14930 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  , 0);.    } else
14940 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77   {.      /* if w
14950 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  e failed to get 
14960 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f  the lock then so
14970 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20  meone else must 
14980 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20  have it */.     
14990 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
149a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f     }.    if( IS_
149b0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
149c0 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b  ){.      rc=lrc;
149d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
149e0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
149f0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
14a00 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
14a10 20 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46   %d (afp)\n", pF
14a20 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
14a30 72 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52  rved));.  .  *pR
14a40 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
14a50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14a60 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
14a70 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
14a80 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
14a90 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
14aa0 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
14ab0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
14ac0 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
14ad0 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
14ae0 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
14af0 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
14b00 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
14b10 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
14b20 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
14b30 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
14b40 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
14b50 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
14b60 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
14b70 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
14b80 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
14b90 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
14ba0 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
14bb0 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
14bc0 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
14bd0 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
14be0 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
14bf0 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
14c00 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
14c10 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
14c20 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
14c30 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
14c40 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
14c50 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
14c60 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
14c70 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
14c80 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
14c90 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
14ca0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
14cb0 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
14cc0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
14cd0 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
14ce0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
14cf0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
14d00 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
14d10 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
14d20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
14d30 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
14d40 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
14d50 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
14d60 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
14d70 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
14d80 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
14d90 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33   afpLock(sqlite3
14da0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
14db0 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  FileLock){.  int
14dc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14dd0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
14de0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
14df0 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
14e00 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
14e10 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
14e20 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
14e30 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
14e40 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
14e50 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
14e60 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73  Context;.  .  as
14e70 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
14e80 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
14e90 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28     %d %s was %s(
14ea0 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61  %s,%d) pid=%d (a
14eb0 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
14ec0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  ,.           azF
14ed0 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
14ee0 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70  k), azFileLock(p
14ef0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  File->eFileLock)
14f00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  ,.           azF
14f10 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e  ileLock(pInode->
14f20 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f  eFileLock), pIno
14f30 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65  de->nShared , ge
14f40 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20  tpid()));..  /* 
14f50 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
14f60 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
14f70 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
14f80 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
14f90 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65  he.  ** unixFile
14fa0 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
14fb0 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f  n't use the afp_
14fc0 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
14fd0 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69  ath, as.  ** uni
14fe0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  xEnterMutex() ha
14ff0 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
15000 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
15010 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
15020 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k>=eFileLock ){.
15030 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
15040 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28  CK    %d %s ok (
15050 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61  already held) (a
15060 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
15070 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  ,.           azF
15080 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
15090 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  k)));.    return
150a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
150b0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
150c0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
150d0 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
150e0 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
150f0 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
15100 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
15110 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
15120 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
15130 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
15140 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
15150 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
15160 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
15170 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
15180 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
15190 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
151a0 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
151b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
151c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
151d0 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
151e0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
151f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
15200 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
15210 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
15220 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
15230 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
15240 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
15250 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
15260 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74    .  /* This mut
15270 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63  ex is needed bec
15280 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
15290 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
152a0 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f  oss threads.  */
152b0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
152c0 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
152d0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a  pFile->pInode;..
152e0 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
152f0 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
15300 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
15310 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e  a a different un
15320 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  ixFile*.  ** han
15330 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
15340 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
15350 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
15360 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
15370 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15380 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  !=pInode->eFileL
15390 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28  ock && .       (
153a0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
153b0 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
153c0 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  || eFileLock>SHA
153d0 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20  RED_LOCK)).     
153e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
153f0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
15400 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
15410 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61    }.  .  /* If a
15420 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
15430 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
15440 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
15450 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
15460 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
15470 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
15480 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
15490 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
154a0 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
154b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
154c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
154d0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
154e0 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e  CK && .     (pIn
154f0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
15500 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
15510 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
15520 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
15530 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15540 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
15550 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  D_LOCK );.    as
15560 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
15570 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
15580 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
15590 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20  >nShared>0 );.  
155a0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
155b0 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
155c0 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
155d0 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e  hared++;.    pIn
155e0 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
155f0 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
15600 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20  ock;.  }.    .  
15610 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
15620 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
15630 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
15640 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
15650 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
15660 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
15670 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
15680 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
15690 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
156a0 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
156b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
156c0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
156d0 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46  CK .      || (eF
156e0 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
156f0 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
15700 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44  ->eFileLock<PEND
15710 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20  ING_LOCK).  ){. 
15720 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20     int failed;. 
15730 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
15740 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15750 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
15760 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
15770 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c  1);.    if (fail
15780 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed) {.      rc =
15790 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67   failed;.      g
157a0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
157b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
157c0 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67   /* If control g
157d0 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ets to this poin
157e0 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79  t, then actually
157f0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61   go ahead and ma
15800 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  ke.  ** operatin
15810 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66  g system calls f
15820 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
15830 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   lock..  */.  if
15840 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
15850 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
15860 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20  int lrc1, lrc2, 
15870 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 6c  lrc1Errno;.    l
15880 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20  ong lk, mask;.  
15890 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
158a0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
158b0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
158c0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
158d0 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ck==0 );.       
158e0 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69   .    mask = (si
158f0 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f  zeof(long)==8) ?
15900 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a   LARGEST_INT64 :
15910 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20   0x7fffffff;.   
15920 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20   /* Now get the 
15930 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44  read-lock SHARED
15940 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20  _LOCK */.    /* 
15950 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75  note that the qu
15960 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e  ality of the ran
15970 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20  domness doesn't 
15980 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68  matter that much
15990 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e   */.    lk = ran
159a0 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f  dom(); .    pIno
159b0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d  de->sharedByte =
159c0 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48   (lk & mask)%(SH
159d0 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a  ARED_SIZE - 1);.
159e0 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65      lrc1 = afpSe
159f0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
15a00 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20  bPath, pFile, . 
15a10 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
15a20 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
15a30 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b  aredByte, 1, 1);
15a40 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
15a50 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a  _ERROR(lrc1) ){.
15a60 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20        lrc1Errno 
15a70 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  = pFile->lastErr
15a80 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  no;.    }.    /*
15a90 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72   Drop the tempor
15aa0 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  ary PENDING lock
15ab0 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61   */.    lrc2 = a
15ac0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
15ad0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
15ae0 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
15af0 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20  1, 0);.    .    
15b00 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
15b10 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20  R(lrc1) ) {.    
15b20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
15b30 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a  no = lrc1Errno;.
15b40 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
15b50 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
15b60 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20  end_lock;.    } 
15b70 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b  else if( IS_LOCK
15b80 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a  _ERROR(lrc2) ){.
15b90 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b        rc = lrc2;
15ba0 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
15bb0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20  end_lock;.    } 
15bc0 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d  else if( lrc1 !=
15bd0 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20   SQLITE_OK ) {. 
15be0 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
15bf0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
15c00 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
15c10 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
15c20 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  K;.      pInode-
15c30 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
15c40 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
15c50 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
15c60 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
15c70 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
15c80 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   && pInode->nSha
15c90 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  red>1 ){.    /* 
15ca0 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
15cb0 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
15cc0 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
15cd0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
15ce0 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
15cf0 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
15d00 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
15d10 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
15d20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
15d30 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
15d40 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
15d50 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
15d60 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
15d70 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
15d80 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
15d90 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
15da0 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
15db0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
15dc0 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
15dd0 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20     int failed = 
15de0 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  0;.    assert( 0
15df0 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  !=pFile->eFileLo
15e00 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46  ck );.    if (eF
15e10 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52  ileLock >= RESER
15e20 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  VED_LOCK && pFil
15e30 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52  e->eFileLock < R
15e40 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a  ESERVED_LOCK) {.
15e50 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69          /* Acqui
15e60 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  re a RESERVED lo
15e70 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61  ck */.        fa
15e80 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
15e90 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
15ea0 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
15eb0 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20  ED_BYTE, 1,1);. 
15ec0 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64       if( !failed
15ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   ){.        cont
15ee0 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  ext->reserved = 
15ef0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
15f00 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64  .    if (!failed
15f10 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d   && eFileLock ==
15f20 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
15f30 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75   {.      /* Acqu
15f40 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ire an EXCLUSIVE
15f50 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
15f60 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76   .      /* Remov
15f70 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  e the shared loc
15f80 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20  k before trying 
15f90 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c  the range.  we'l
15fa0 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20  l need to .     
15fb0 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20   ** reestablish 
15fc0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
15fd0 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20  if we can't get 
15fe0 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20  the  afpUnlock. 
15ff0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
16000 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70  ( !(failed = afp
16010 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
16020 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
16030 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20  SHARED_FIRST +. 
16040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16050 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
16060 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30  sharedByte, 1, 0
16070 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  )) ){.        in
16080 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49  t failed2 = SQLI
16090 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f  TE_OK;.        /
160a0 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74  * now attemmpt t
160b0 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73  o get the exclus
160c0 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a  ive lock range *
160d0 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
160e0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
160f0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
16100 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
16110 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ST, .           
16120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16130 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
16140 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
16150 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c   failed && (fail
16160 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  ed2 = afpSetLock
16170 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16180 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20  , pFile, .      
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
161b0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
161c0 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20  te, 1, 1)) ){.  
161d0 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74          /* Can't
161e0 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65   reestablish the
161f0 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53   shared lock.  S
16200 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c  qlite can't deal
16210 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20  , this is.      
16220 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61      ** a critica
16230 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20  l I/O error.    
16240 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16250 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64     rc = ((failed
16260 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
16270 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
16280 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20  ) ? failed2 : . 
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
162a0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
162b0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
162c0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
162d0 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
162e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
162f0 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20   = failed; .    
16300 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
16310 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ( failed ){.    
16320 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
16330 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66     }.  }.  .  if
16340 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16350 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
16360 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
16370 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  ock;.    pInode-
16380 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
16390 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20  leLock;.  }else 
163a0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
163b0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
163c0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
163d0 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
163e0 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
163f0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
16400 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  NDING_LOCK;.  }.
16410 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a    .afp_end_lock:
16420 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
16430 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
16440 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
16450 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  s (afp)\n", pFil
16460 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  e->h, azFileLock
16470 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20  (eFileLock), .  
16480 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
16490 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
164a0 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75  ailed"));.  retu
164b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
164c0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
164d0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
164e0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
164f0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
16500 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
16510 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
16520 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
16530 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
16540 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
16550 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
16560 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
16570 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
16580 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
16590 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
165a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
165b0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
165c0 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71  int afpUnlock(sq
165d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
165e0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
165f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16600 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
16610 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
16620 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
16630 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
16640 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  e;.  afpLockingC
16650 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
16660 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
16670 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
16680 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
16690 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20   int skipShared 
166a0 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
166b0 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20  TE_TEST.  int h 
166c0 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64  = pFile->h;.#end
166d0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  if..  assert( pF
166e0 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
166f0 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
16700 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70   was %d(%d,%d) p
16710 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  id=%d (afp)\n", 
16720 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
16730 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
16740 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16750 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
16760 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
16770 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  e->pInode->nShar
16780 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 67  ed,.           g
16790 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73  etpid()));..  as
167a0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
167b0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
167c0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
167d0 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63  leLock<=eFileLoc
167e0 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
167f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
16800 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
16810 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
16820 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
16830 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
16840 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69  Shared!=0 );.  i
16850 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
16860 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
16870 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16880 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
16890 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ==pFile->eFileLo
168a0 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  ck );.    Simula
168b0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
168c0 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  1);.    Simulate
168d0 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
168e0 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ).    SimulateIO
168f0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
16900 20 20 20 20 0a 23 69 66 6e 64 65 66 20 4e 44 45      .#ifndef NDE
16910 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  BUG.    /* When 
16920 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20  reducing a lock 
16930 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20  such that other 
16940 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74  processes can st
16950 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  art.    ** readi
16960 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
16970 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65  file again, make
16980 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20   sure that the. 
16990 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
169a0 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70  n counter was up
169b0 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72  dated if any par
169c0 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
169d0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68  e.    ** file ch
169e0 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
169f0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
16a00 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65  er is not update
16a10 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  d,.    ** other 
16a20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74  connections to t
16a30 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67  he same file mig
16a40 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74  ht not realize t
16a50 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  hat.    ** the f
16a60 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20  ile has changed 
16a70 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20  and hence might 
16a80 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73  not know to flus
16a90 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63  h their.    ** c
16aa0 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f  ache.  The use o
16ab0 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20  f a stale cache 
16ac0 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
16ad0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
16ae0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
16af0 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  rt( pFile->inNor
16b00 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20  malWrite==0.    
16b10 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
16b20 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20  >dbUpdate==0.   
16b30 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
16b40 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d  ->transCntrChng=
16b50 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  =1 );.    pFile-
16b60 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
16b70 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a   0;.#endif.    .
16b80 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65      if( pFile->e
16b90 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
16ba0 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
16bb0 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
16bc0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
16bd0 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
16be0 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53  _FIRST, SHARED_S
16bf0 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  IZE, 0);.      i
16c00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16c10 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   && (eFileLock==
16c20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
16c30 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
16c40 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
16c50 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73  only re-establis
16c60 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
16c70 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  k if necessary *
16c80 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68  /.        int sh
16c90 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
16ca0 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
16cb0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  de->sharedByte;.
16cc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70          rc = afp
16cd0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
16ce0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
16cf0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
16d00 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65  1, 1);.      } e
16d10 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b  lse {.        sk
16d20 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  ipShared = 1;.  
16d30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16d40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16d50 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
16d60 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c  eLock>=PENDING_L
16d70 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OCK ){.      rc 
16d80 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16d90 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16da0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
16db0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
16dc0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16dd0 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
16de0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45  >eFileLock>=RESE
16df0 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e  RVED_LOCK && con
16e00 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29  text->reserved )
16e10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70  {.      rc = afp
16e20 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
16e30 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
16e40 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
16e50 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
16e60 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20  !rc ){ .        
16e70 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
16e80 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a  d = 0; .      }.
16e90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
16ea0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
16eb0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16ec0 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
16ed0 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20  ->nShared>1)){. 
16ee0 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
16ef0 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
16f00 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
16f10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16f20 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  _OK && eFileLock
16f30 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20  ==NO_LOCK ){..  
16f40 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
16f50 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63  he shared lock c
16f60 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65  ounter.  Release
16f70 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
16f80 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c  an.    ** OS cal
16f90 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20  l only when all 
16fa0 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20  threads in this 
16fb0 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76  same process hav
16fc0 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a  e released.    *
16fd0 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20  * the lock..    
16fe0 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
16ff0 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
17000 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45  LockByte = SHARE
17010 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
17020 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20  sharedByte;.    
17030 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d  pInode->nShared-
17040 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  -;.    if( pInod
17050 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b  e->nShared==0 ){
17060 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
17070 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
17080 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
17090 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
170a0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
170b0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
170c0 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70  .      if( !skip
170d0 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20  Shared ){.      
170e0 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
170f0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17100 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64  h, pFile, shared
17110 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b  LockByte, 1, 0);
17120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17130 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20  f( !rc ){.      
17140 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
17150 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
17160 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
17170 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
17180 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
17190 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
171a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
171b0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
171c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
171d0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20  Inode->nLock>=0 
171e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
171f0 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  ode->nLock==0 ){
17200 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65  .        closePe
17210 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b  ndingFds(pFile);
17220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17230 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76   }.  .  unixLeav
17240 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
17250 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
17260 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17270 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
17280 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17290 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
172a0 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73   & cleanup AFP s
172b0 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20  pecific locking 
172c0 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74  context .*/.stat
172d0 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28  ic int afpClose(
172e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
172f0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
17300 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
17310 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
17320 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
17330 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61  xFile*)id;.    a
17340 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  fpUnlock(id, NO_
17350 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45  LOCK);.    unixE
17360 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
17370 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
17380 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e  de && pFile->pIn
17390 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20  ode->nLock ){.  
173a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
173b0 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
173c0 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63  locks, do not ac
173d0 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65  tually close the
173e0 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20   file just.     
173f0 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
17400 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
17410 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
17420 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
17430 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65  file.      ** de
17440 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f  scriptor to pIno
17450 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49  de->aPending.  I
17460 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
17470 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77  tically closed w
17480 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  hen.      ** the
17490 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
174a0 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  eared..      */.
174b0 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67        setPending
174c0 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  Fd(pFile);.    }
174d0 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
174e0 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
174f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17500 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
17510 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  text);.    rc = 
17520 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
17530 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65  );.    unixLeave
17540 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72  Mutex();.  }.  r
17550 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e  eturn rc;.}..#en
17560 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
17570 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
17580 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
17590 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
175a0 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65  * The code above
175b0 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b   is the AFP lock
175c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
175d0 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70    The code is sp
175e0 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63  ecific.** to Mac
175f0 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  OSX and does not
17600 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75   work on other u
17610 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  nix platforms.  
17620 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  No alternative.*
17630 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  * is available. 
17640 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f   If you don't co
17650 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c  mpile for a mac,
17660 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d   then the "unix-
17670 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e  afp".** VFS is n
17680 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ot available..**
17690 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
176a0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
176b0 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65  e AFP lock imple
176c0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
176d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176e0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
176f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
17730 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
17740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17780 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
17790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
177a0 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20  gin NFS Locking 
177b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177d0 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
177e0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
177f0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
17800 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20  NG_STYLE./*. ** 
17810 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
17820 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
17830 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
17840 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
17850 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75  eFileLock. ** mu
17860 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
17870 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
17880 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20  OCK.. **. ** If 
17890 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
178a0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
178b0 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
178c0 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
178d0 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65   ** the requeste
178e0 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
178f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
17900 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74   a no-op.. */.st
17910 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f  atic int nfsUnlo
17920 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
17930 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
17940 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f  ck){.  return po
17950 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46  sixUnlock(id, eF
17960 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a  ileLock, 1);.}..
17970 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
17980 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
17990 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
179a0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
179b0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62  *.** The code ab
179c0 6f 76 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c  ove is the NFS l
179d0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
179e0 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73  on.  The code is
179f0 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
17a00 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20  MacOSX and does 
17a10 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65  not work on othe
17a20 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73  r unix platforms
17a30 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76  .  No alternativ
17a40 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
17a50 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  e.  .**.********
17a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
17a70 64 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63  d of the NFS loc
17a80 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
17a90 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
17aa0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
17ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17af0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
17b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b40 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
17b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f  ********* Non-lo
17b60 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69  cking sqlite3_fi
17b70 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  le methods *****
17b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b90 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
17ba0 68 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e  he next division
17bb0 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d   contains implem
17bc0 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c  entations for al
17bd0 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65  l methods of the
17be0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c   .** sqlite3_fil
17bf0 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74  e object other t
17c00 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  han the locking 
17c10 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f  methods.  The lo
17c20 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73  cking.** methods
17c30 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e   were defined in
17c40 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65   divisions above
17c50 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65   (one locking me
17c60 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69  thod per.** divi
17c70 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65  sion).  Those me
17c80 74 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63  thods that are c
17c90 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
17ca0 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72  king modes.** ar
17cb0 65 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65  e gather togethe
17cc0 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69  r into this divi
17cd0 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  sion..*/../*.** 
17ce0 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
17cf0 65 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  et passed as the
17d00 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
17d10 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20  , then read cnt 
17d20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70  .** bytes into p
17d30 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20  Buf. Return the 
17d40 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
17d50 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a  actually read..*
17d60 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75  *.** NB:  If you
17d70 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41   define USE_PREA
17d80 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34  D or USE_PREAD64
17d90 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
17da0 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73  also.** be neces
17db0 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f  sary to define _
17dc0 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20  XOPEN_SOURCE to 
17dd0 62 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61  be 500.  This va
17de0 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65  ries from.** one
17df0 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68   system to anoth
17e00 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74  er.  Since SQLit
17e10 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e  e does not defin
17e20 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61  e USE_PREAD.** a
17e30 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64  ny any form by d
17e40 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20  efault, we will 
17e50 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64  not attempt to d
17e60 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
17e70 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b  RCE..** See tick
17e80 65 74 73 20 23 32 37 34 31 20 61 6e 64 20 23 32  ets #2741 and #2
17e90 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  681..**.** To av
17ea0 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
17eb0 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
17ec0 61 20 66 61 69 6c 65 64 20 72 65 61 64 20 74 68  a failed read th
17ed0 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75  e lastErrno valu
17ee0 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f  e.** is set befo
17ef0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
17f00 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
17f10 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65  AndRead(unixFile
17f20 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
17f30 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64  t64 offset, void
17f40 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29   *pBuf, int cnt)
17f50 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66  {.  int got;.#if
17f60 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50   (!defined(USE_P
17f70 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65  READ) && !define
17f80 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a  d(USE_PREAD64)).
17f90 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b    i64 newOffset;
17fa0 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
17fb0 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e  START;.#if defin
17fc0 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
17fd0 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 72 65 61  do{ got = osPrea
17fe0 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
17ff0 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68  nt, offset); }wh
18000 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
18010 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
18020 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18030 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
18040 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
18050 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f  READ64).  do{ go
18060 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64  t = osPread64(id
18070 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
18080 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65 28  offset); }while(
18090 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d   got<0 && errno=
180a0 3d 45 49 4e 54 52 29 3b 0a 20 20 53 69 6d 75 6c  =EINTR);.  Simul
180b0 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20  ateIOError( got 
180c0 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20  = -1 );.#else.  
180d0 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65  newOffset = lsee
180e0 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  k(id->h, offset,
180f0 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53 69   SEEK_SET);.  Si
18100 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e  mulateIOError( n
18110 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20  ewOffset-- );.  
18120 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f  if( newOffset!=o
18130 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66 28  ffset ){.    if(
18140 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31   newOffset == -1
18150 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78   ){.      ((unix
18160 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
18170 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
18180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 28    }else{.      (
18190 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
181a0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09  lastErrno = 0;..
181b0 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ..    }.    retu
181c0 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 64 6f 7b  rn -1;.  }.  do{
181d0 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64   got = osRead(id
181e0 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b  ->h, pBuf, cnt);
181f0 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26   }while( got<0 &
18200 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
18210 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
18220 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c  _END;.  if( got<
18230 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  0 ){.    ((unixF
18240 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
18250 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  rno = errno;.  }
18260 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
18270 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  D    %-3d %5d %7
18280 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d  lld %llu\n", id-
18290 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c  >h, got, offset,
182a0 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
182b0 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a  ;.  return got;.
182c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
182d0 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
182e0 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
182f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
18300 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
18310 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
18320 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
18330 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
18340 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
18350 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
18360 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c   unixRead(.  sql
18370 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a  ite3_file *id, .
18380 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20    void *pBuf, . 
18390 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69   int amt,.  sqli
183a0 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
183b0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
183c0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
183d0 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f  e *)id;.  int go
183e0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  t;.  assert( id 
183f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
18400 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
18410 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
18420 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
18430 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
18440 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
18450 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
18460 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
18470 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
18480 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
18490 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
184a0 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
184b0 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
184c0 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
184d0 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
184e0 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
184f0 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
18500 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52    got = seekAndR
18510 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ead(pFile, offse
18520 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  t, pBuf, amt);. 
18530 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b   if( got==amt ){
18540 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18550 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
18560 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
18570 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
18580 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
18590 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
185a0 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
185b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
185c0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
185d0 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73   0; /* not a sys
185e0 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  tem error */.   
185f0 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73   /* Unread parts
18600 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d   of the buffer m
18610 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c  ust be zero-fill
18620 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
18630 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b  (&((char*)pBuf)[
18640 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74  got], 0, amt-got
18650 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
18660 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
18670 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _READ;.  }.}../*
18680 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
18690 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
186a0 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
186b0 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
186c0 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
186d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
186e0 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
186f0 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
18700 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  set..**.** To av
18710 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
18720 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
18730 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74  a failed write t
18740 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
18750 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
18760 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
18770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
18780 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
18790 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
187a0 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
187b0 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
187c0 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28    int got;.#if (
187d0 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
187e0 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  AD) && !defined(
187f0 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20  USE_PREAD64)).  
18800 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23  i64 newOffset;.#
18810 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54  endif.  TIMER_ST
18820 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ART;.#if defined
18830 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f  (USE_PREAD).  do
18840 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65  { got = osPwrite
18850 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
18860 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69  t, offset); }whi
18870 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
18880 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c  no==EINTR );.#el
18890 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
188a0 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f  READ64).  do{ go
188b0 74 20 3d 20 6f 73 50 77 72 69 74 65 36 34 28 69  t = osPwrite64(i
188c0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
188d0 20 6f 66 66 73 65 74 29 3b 7d 77 68 69 6c 65 28   offset);}while(
188e0 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d   got<0 && errno=
188f0 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20  =EINTR);.#else. 
18900 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65   newOffset = lse
18910 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  ek(id->h, offset
18920 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53  , SEEK_SET);.  S
18930 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
18940 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20  newOffset-- );. 
18950 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d   if( newOffset!=
18960 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66  offset ){.    if
18970 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d  ( newOffset == -
18980 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  1 ){.      ((uni
18990 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
189a0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
189b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
189c0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
189d0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09  >lastErrno = 0;.
189e0 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  ...    }.    ret
189f0 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 64 6f  urn -1;.  }.  do
18a00 7b 20 67 6f 74 20 3d 20 6f 73 57 72 69 74 65 28  { got = osWrite(
18a10 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
18a20 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  ); }while( got<0
18a30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
18a40 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d   );.#endif.  TIM
18a50 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f  ER_END;.  if( go
18a60 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  t<0 ){.    ((uni
18a70 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
18a80 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
18a90 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
18aa0 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64  WRITE   %-3d %5d
18ab0 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
18ac0 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
18ad0 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
18ae0 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  D));.  return go
18af0 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  t;.}.../*.** Wri
18b00 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
18b10 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
18b20 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
18b30 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
18b40 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
18b50 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
18b60 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
18b70 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
18b80 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
18b90 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  *id, .  const vo
18ba0 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
18bb0 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
18bc0 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b  int64 offset .){
18bd0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
18be0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
18bf0 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  id;.  int wrote 
18c00 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
18c10 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
18c20 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
18c30 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
18c40 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
18c50 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
18c60 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
18c70 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
18c80 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
18c90 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
18ca0 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
18cb0 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
18cc0 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
18cd0 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
18ce0 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
18cf0 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
18d00 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
18d10 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
18d20 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
18d30 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  dif..#ifndef NDE
18d40 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61  BUG.  /* If we a
18d50 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61  re doing a norma
18d60 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74  l write to a dat
18d70 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f  abase file (as o
18d80 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64  pposed to.  ** d
18d90 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
18da0 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
18db0 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
18dc0 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
18dd0 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74  .  ** normal dat
18de0 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e  abase file) then
18df0 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
18e00 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
18e10 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e  se.  ** has chan
18e20 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
18e30 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
18e40 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65   is modified, re
18e50 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66  cord that.  ** f
18e60 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  act too..  */.  
18e70 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
18e80 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20  malWrite ){.    
18e90 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
18ea0 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  = 1;  /* The dat
18eb0 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d  abase has been m
18ec0 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69  odified */.    i
18ed0 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26  f( offset<=24 &&
18ee0 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20   offset+amt>=27 
18ef0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
18f00 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43  .      char oldC
18f10 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69  ntr[4];.      Si
18f20 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
18f30 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63  ign(1);.      rc
18f40 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70   = seekAndRead(p
18f50 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74  File, 24, oldCnt
18f60 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d  r, 4);.      Sim
18f70 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
18f80 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
18f90 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70   rc!=4 || memcmp
18fa0 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61  (oldCntr, &((cha
18fb0 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73  r*)pBuf)[24-offs
18fc0 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20  et], 4)!=0 ){.  
18fd0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
18fe0 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20  nsCntrChng = 1; 
18ff0 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
19000 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20  ion counter has 
19010 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20  changed */.     
19020 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
19030 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d  dif..  while( am
19040 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20  t>0 && (wrote = 
19050 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
19060 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
19070 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20  , amt))>0 ){.   
19080 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20   amt -= wrote;. 
19090 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f     offset += wro
190a0 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
190b0 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
190c0 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75  ote];.  }.  Simu
190d0 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72  lateIOError(( wr
190e0 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20  ote=(-1), amt=1 
190f0 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  ));.  SimulateDi
19100 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72  skfullError(( wr
19110 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b  ote=0, amt=1 ));
19120 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b  ..  if( amt>0 ){
19130 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30  .    if( wrote<0
19140 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45   && pFile->lastE
19150 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a  rrno!=ENOSPC ){.
19160 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72        /* lastErr
19170 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
19180 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  dWrite */.      
19190 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
191a0 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d  ERR_WRITE;.    }
191b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
191c0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  e->lastErrno = 0
191d0 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65  ; /* not a syste
191e0 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  m error */.     
191f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
19200 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ULL;.    }.  }..
19210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19220 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  OK;.}..#ifdef SQ
19230 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
19240 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
19250 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e   of fullsyncs an
19260 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20  d normal syncs. 
19270 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
19280 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79   test.** that sy
19290 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63  ncs and fullsync
192a0 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20  s are occurring 
192b0 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
192c0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
192d0 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
192e0 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
192f0 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
19300 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
19310 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73 74   We do not trust
19320 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f 76   systems to prov
19330 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66 64  ide a working fd
19340 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65  atasync().  Some
19350 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64   do..** Others d
19360 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61 66  o no.  To be saf
19370 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63 6b  e, we will stick
19380 20 77 69 74 68 20 74 68 65 20 28 73 6c 6f 77 65   with the (slowe
19390 72 29 20 66 73 79 6e 63 28 29 2e 0a 2a 2a 20 49  r) fsync()..** I
193a0 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20  f you know that 
193b0 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73  your system does
193c0 20 73 75 70 70 6f 72 74 20 66 64 61 74 61 73 79   support fdatasy
193d0 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a  nc() correctly,.
193e0 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63  ** then simply c
193f0 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64  ompile with -Dfd
19400 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e  atasync=fdatasyn
19410 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  c.*/.#if !define
19420 64 28 66 64 61 74 61 73 79 6e 63 29 20 26 26 20  d(fdatasync) && 
19430 21 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78  !defined(__linux
19440 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20 66 64 61  __).# define fda
19450 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e  tasync fsync.#en
19460 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  dif../*.** Defin
19470 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
19480 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e   to 0 or 1 depen
19490 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
194a0 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f  or not.** the F_
194b0 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20  FULLFSYNC macro 
194c0 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46  is defined.  F_F
194d0 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72  ULLFSYNC is curr
194e0 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76  ently.** only av
194f0 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f  ailable on Mac O
19500 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63  S X.  But that c
19510 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a  ould change..*/.
19520 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59  #ifdef F_FULLFSY
19530 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  NC.# define HAVE
19540 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c  _FULLFSYNC 1.#el
19550 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  se.# define HAVE
19560 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e  _FULLFSYNC 0.#en
19570 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
19580 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63  fsync() system c
19590 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  all does not wor
195a0 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20  k as advertised 
195b0 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20  on many.** unix 
195c0 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f  systems.  The fo
195d0 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72  llowing procedur
195e0 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  e is an attempt 
195f0 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f  to make.** it wo
19600 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a  rk better..**.**
19610 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   The SQLITE_NO_S
19620 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c  YNC macro disabl
19630 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e  es all fsync()s.
19640 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c    This is useful
19650 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20  .** for testing 
19660 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
19670 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  run through the 
19680 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b  test suite quick
19690 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73  ly..** You are s
196a0 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20  trongly advised 
196b0 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20  *not* to deploy 
196c0 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
196d0 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  YNC.** enabled, 
196e0 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77  however, since w
196f0 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
19700 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f  NC enabled, an O
19710 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f  S crash.** or po
19720 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c  wer failure will
19730 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20   likely corrupt 
19740 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19750 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  e..**.** SQLite 
19760 73 65 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c  sets the dataOnl
19770 79 20 66 6c 61 67 20 69 66 20 74 68 65 20 73 69  y flag if the si
19780 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ze of the file i
19790 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  s unchanged..** 
197a0 54 68 65 20 69 64 65 61 20 62 65 68 69 6e 64 20  The idea behind 
197b0 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74  dataOnly is that
197c0 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20   it should only 
197d0 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 63  write the file c
197e0 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73  ontent.** to dis
197f0 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65  k, not the inode
19800 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64  .  We only set d
19810 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66  ataOnly if the f
19820 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20  ile size is .** 
19830 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20  unchanged since 
19840 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73  the file size is
19850 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f   part of the ino
19860 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a  de.  However, .*
19870 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73  * Ted Ts'o tells
19880 20 75 73 20 74 68 61 74 20 66 64 61 74 61 73 79   us that fdatasy
19890 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77  nc() will also w
198a0 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69  rite the inode i
198b0 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69  f the.** file si
198c0 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20  ze has changed. 
198d0 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64   The only real d
198e0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
198f0 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a  n fdatasync().**
19900 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65   and fsync(), Te
19910 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74  d tells us, is t
19920 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  hat fdatasync() 
19930 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74  will not flush t
19940 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74  he.** inode if t
19950 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65  he mtime or owne
19960 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65  r or other inode
19970 20 61 74 74 72 69 62 75 74 65 73 20 68 61 76 65   attributes have
19980 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20   changed..** We 
19990 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20  only care about 
199a0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e  the file size, n
199b0 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c  ot the other fil
199c0 65 20 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f  e attributes, so
199d0 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20 53 51  .** as far as SQ
199e0 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65  Lite is concerne
199f0 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28  d, an fdatasync(
19a00 29 20 69 73 20 61 6c 77 61 79 73 20 61 64 65 71  ) is always adeq
19a10 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20  uate..** So, we 
19a20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61 74 61  always use fdata
19a30 73 79 6e 63 28 29 20 69 66 20 69 74 20 69 73 20  sync() if it is 
19a40 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72  available, regar
19a50 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20  dless of.** the 
19a60 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
19a70 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73  aOnly flag..*/.s
19a80 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66  tatic int full_f
19a90 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74  sync(int fd, int
19aa0 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64   fullSync, int d
19ab0 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  ataOnly){.  int 
19ac0 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  rc;..  /* The fo
19ad0 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65  llowing "ifdef/e
19ae0 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b  lif/else/" block
19af0 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 73 74   has the same st
19b00 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20  ructure as.  ** 
19b10 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49  the one below. I
19b20 74 20 69 73 20 72 65 70 6c 69 63 61 74 65 64 20  t is replicated 
19b30 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61  here solely to a
19b40 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20  void cluttering 
19b50 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61  .  ** up the rea
19b60 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68 65 20  l code with the 
19b70 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19b80 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a  () macros..  */.
19b90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
19ba0 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50  _SYNC.  UNUSED_P
19bb0 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
19bc0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19bd0 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e  (fullSync);.  UN
19be0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
19bf0 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20  ataOnly);.#elif 
19c00 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
19c10 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
19c20 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
19c30 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
19c40 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b  METER(fullSync);
19c50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
19c60 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
19c70 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f  endif..  /* Reco
19c80 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rd the number of
19c90 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20 64   times that we d
19ca0 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63  o a normal fsync
19cb0 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c  () and .  ** FUL
19cc0 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20  LSYNC.  This is 
19cd0 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74  used during test
19ce0 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68  ing to verify th
19cf0 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  at this procedur
19d00 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c  e.  ** gets call
19d10 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  ed with the corr
19d20 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20  ect arguments.. 
19d30 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
19d40 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c  E_TEST.  if( ful
19d50 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f  lSync ) sqlite3_
19d60 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
19d70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  ;.  sqlite3_sync
19d80 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
19d90 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d  ..  /* If we com
19da0 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53  piled with the S
19db0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c  QLITE_NO_SYNC fl
19dc0 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67  ag, then syncing
19dd0 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70   is a.  ** no-op
19de0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
19df0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63  ITE_NO_SYNC.  rc
19e00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65   = SQLITE_OK;.#e
19e10 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
19e20 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  NC.  if( fullSyn
19e30 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73  c ){.    rc = os
19e40 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  Fcntl(fd, F_FULL
19e50 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
19e60 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
19e70 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
19e80 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64  FULLFSYNC failed
19e90 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61  , fall back to a
19ea0 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79  ttempting an fsy
19eb0 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68  nc()..  ** It sh
19ec0 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69  ouldn't be possi
19ed0 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e  ble for fullfsyn
19ee0 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65  c to fail on the
19ef0 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c   local .  ** fil
19f00 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58  e system (on OSX
19f10 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e  ), so failure in
19f20 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c  dicates that FUL
19f30 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27  LFSYNC.  ** isn'
19f40 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  t supported for 
19f50 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d  this file system
19f60 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e  . So, attempt an
19f70 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64   fsync .  ** and
19f80 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72   (for now) ignor
19f90 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  e the overhead o
19fa0 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20  f a superfluous 
19fb0 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20  fcntl call.  .  
19fc0 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65  ** It'd be bette
19fd0 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c  r to detect full
19fe0 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e  fsync support on
19ff0 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20  ce and avoid .  
1a000 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c  ** the fcntl cal
1a010 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e  l every time syn
1a020 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a  c is called..  *
1a030 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20  /.  if( rc ) rc 
1a040 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65  = fsync(fd);..#e
1a050 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  lif defined(__AP
1a060 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74  PLE__).  /* fdat
1a070 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20  async() on HFS+ 
1a080 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73  doesn't yet flus
1a090 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  h the file size 
1a0a0 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f  if it changed co
1a0b0 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20  rrectly.  ** so 
1a0c0 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66  currently we def
1a0d0 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72  ault to the macr
1a0e0 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73  o that redefines
1a0f0 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73   fdatasync to fs
1a100 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ync.  */.  rc = 
1a110 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65  fsync(fd);.#else
1a120 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79   .  rc = fdatasy
1a130 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56  nc(fd);.#if OS_V
1a140 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d  XWORKS.  if( rc=
1a150 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  =-1 && errno==EN
1a160 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20  OTSUP ){.    rc 
1a170 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d  = fsync(fd);.  }
1a180 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
1a190 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20  WORKS */.#endif 
1a1a0 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
1a1b0 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56  NO_SYNC elif HAV
1a1c0 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a  E_FULLFSYNC */..
1a1d0 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53    if( OS_VXWORKS
1a1e0 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20   && rc!= -1 ){. 
1a1f0 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20     rc = 0;.  }. 
1a200 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a210 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61  *.** Make sure a
1a220 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70  ll writes to a p
1a230 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61  articular file a
1a240 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
1a250 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  disk..**.** If d
1a260 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20  ataOnly==0 then 
1a270 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69 74  both the file it
1a280 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74  self and its met
1a290 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73  adata (file.** s
1a2a0 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65  ize, access time
1a2b0 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65  , etc) are synce
1a2c0 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21  d.  If dataOnly!
1a2d0 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =0 then only the
1a2e0 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73  .** file data is
1a2f0 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55   synced..**.** U
1a300 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20  nder Unix, also 
1a310 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
1a320 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74  he directory ent
1a330 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a  ry for the file.
1a340 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ** has been crea
1a350 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67  ted by fsync-ing
1a360 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
1a370 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
1a380 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20   file..** If we 
1a390 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61  do not do this a
1a3a0 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20  nd we encounter 
1a3b0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
1a3c0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a   the directory.*
1a3d0 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
1a3e0 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
1a3f0 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65  t exist after we
1a400 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65   reboot.  The ne
1a410 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20  xt.** SQLite to 
1a420 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20  access the file 
1a430 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68  will not know th
1a440 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65  at the journal e
1a450 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a  xists (because.*
1a460 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  * the directory 
1a470 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
1a480 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20  urnal was never 
1a490 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65  created) and the
1a4a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
1a4b0 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61  will not roll ba
1a4c0 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65  ck - possibly le
1a4d0 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73  ading to databas
1a4e0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  e corruption..*/
1a4f0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1a500 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c  Sync(sqlite3_fil
1a510 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73  e *id, int flags
1a520 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
1a530 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1a540 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1a550 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c  .  int isDataOnl
1a560 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54  y = (flags&SQLIT
1a570 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29  E_SYNC_DATAONLY)
1a580 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79  ;.  int isFullsy
1a590 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46  nc = (flags&0x0F
1a5a0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
1a5b0 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ULL;..  /* Check
1a5c0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c   that one of SQL
1a5d0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
1a5e0 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73  or FULL was pass
1a5f0 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  ed */.  assert((
1a600 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1a610 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a  ITE_SYNC_NORMAL.
1a620 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26        || (flags&
1a630 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1a640 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20  NC_FULL.  );..  
1a650 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20  /* Unix cannot, 
1a660 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  but some systems
1a670 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
1a680 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72  TE_FULL from her
1a690 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e  e. This.  ** lin
1a6a0 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61  e is to test tha
1a6b0 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20  t doing so does 
1a6c0 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72  not cause any pr
1a6d0 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53  oblems..  */.  S
1a6e0 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
1a6f0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1a700 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61  ITE_FULL );..  a
1a710 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
1a720 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
1a730 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69      %-3d\n", pFi
1a740 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20  le->h));.  rc = 
1a750 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65  full_fsync(pFile
1a760 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c  ->h, isFullsync,
1a770 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20   isDataOnly);.  
1a780 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1a790 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
1a7a0 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  c ){.    pFile->
1a7b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1a7c0 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  o;.    return un
1a7d0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1a7e0 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22  E_IOERR_FSYNC, "
1a7f0 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69  full_fsync", pFi
1a800 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
1a810 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
1a820 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  fd>=0 ){.    OST
1a830 52 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25  RACE(("DIRSYNC %
1a840 2d 33 64 20 28 68 61 76 65 5f 66 75 6c 6c 66 73  -3d (have_fullfs
1a850 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d  ync=%d fullsync=
1a860 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64  %d)\n", pFile->d
1a870 69 72 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  irfd,.          
1a880 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43    HAVE_FULLFSYNC
1a890 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a  , isFullsync));.
1a8a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
1a8b0 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20  ISABLE_DIRSYNC. 
1a8c0 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74     /* The direct
1a8d0 6f 72 79 20 73 79 6e 63 20 69 73 20 6f 6e 6c 79  ory sync is only
1a8e0 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 66 75   attempted if fu
1a8f0 6c 6c 5f 66 73 79 6e 63 20 69 73 0a 20 20 20 20  ll_fsync is.    
1a900 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72  ** turned off or
1a910 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 49   unavailable.  I
1a920 66 20 61 20 66 75 6c 6c 5f 66 73 79 6e 63 20 6f  f a full_fsync o
1a930 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 0a 20  ccurred above,. 
1a940 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 64     ** then the d
1a950 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73  irectory sync is
1a960 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 0a 20 20   superfluous..  
1a970 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 48    */.    if( (!H
1a980 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 7c  AVE_FULLFSYNC ||
1a990 20 21 69 73 46 75 6c 6c 73 79 6e 63 29 20 26 26   !isFullsync) &&
1a9a0 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c   full_fsync(pFil
1a9b0 65 2d 3e 64 69 72 66 64 2c 30 2c 30 29 20 29 7b  e->dirfd,0,0) ){
1a9c0 0a 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20  .       /*.     
1a9d0 20 20 2a 2a 20 57 65 20 68 61 76 65 20 72 65 63    ** We have rec
1a9e0 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 72  eived multiple r
1a9f0 65 70 6f 72 74 73 20 6f 66 20 66 73 79 6e 63 28  eports of fsync(
1aa00 29 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20  ) returning.    
1aa10 20 20 20 2a 2a 20 65 72 72 6f 72 73 20 77 68 65     ** errors whe
1aa20 6e 20 61 70 70 6c 69 65 64 20 74 6f 20 64 69 72  n applied to dir
1aa30 65 63 74 6f 72 69 65 73 20 6f 6e 20 63 65 72 74  ectories on cert
1aa40 61 69 6e 20 66 69 6c 65 20 73 79 73 74 65 6d 73  ain file systems
1aa50 2e 0a 20 20 20 20 20 20 20 2a 2a 20 41 20 66 61  ..       ** A fa
1aa60 69 6c 65 64 20 64 69 72 65 63 74 6f 72 79 20 73  iled directory s
1aa70 79 6e 63 20 69 73 20 6e 6f 74 20 61 20 62 69 67  ync is not a big
1aa80 20 64 65 61 6c 2e 20 20 53 6f 20 69 74 20 73 65   deal.  So it se
1aa90 65 6d 73 0a 20 20 20 20 20 20 20 2a 2a 20 62 65  ems.       ** be
1aaa0 74 74 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74  tter to ignore t
1aab0 68 65 20 65 72 72 6f 72 2e 20 20 54 69 63 6b 65  he error.  Ticke
1aac0 74 20 23 31 36 35 37 0a 20 20 20 20 20 20 20 2a  t #1657.       *
1aad0 2f 0a 20 20 20 20 20 20 20 2f 2a 20 70 46 69 6c  /.       /* pFil
1aae0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1aaf0 72 72 6e 6f 3b 20 2a 2f 0a 20 20 20 20 20 20 20  rrno; */.       
1ab00 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  /* return SQLITE
1ab10 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d  _IOERR; */.    }
1ab20 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 4f  .#endif.    /* O
1ab30 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63  nly need to sync
1ab40 20 6f 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20   once, so close 
1ab50 74 68 65 20 20 64 69 72 65 63 74 6f 72 79 20 77  the  directory w
1ab60 68 65 6e 20 77 65 20 61 72 65 20 64 6f 6e 65 20  hen we are done 
1ab70 2a 2f 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  */.    robust_cl
1ab80 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65  ose(pFile, pFile
1ab90 2d 3e 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f  ->dirfd, __LINE_
1aba0 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64  _);.    pFile->d
1abb0 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  irfd = -1;.  }. 
1abc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1abd0 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e  *.** Truncate an
1abe0 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20   open file to a 
1abf0 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a  specified size.*
1ac00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1ac10 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  xTruncate(sqlite
1ac20 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
1ac30 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69  nByte){.  unixFi
1ac40 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1ac50 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e  xFile *)id;.  in
1ac60 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
1ac70 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c  pFile );.  Simul
1ac80 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
1ac90 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1aca0 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f  TRUNCATE );..  /
1acb0 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
1acc0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63  s configured a c
1acd0 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68  hunk-size for th
1ace0 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74  is file, truncat
1acf0 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20  e the.  ** file 
1ad00 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69  so that it consi
1ad10 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65  sts of an intege
1ad20 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e  r number of chun
1ad30 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a  ks (i.e. the.  *
1ad40 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69  * actual file si
1ad50 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65  ze after the ope
1ad60 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61  ration may be la
1ad70 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  rger than the re
1ad80 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a  quested.  ** siz
1ad90 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  e)..  */.  if( p
1ada0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 29 7b  File->szChunk ){
1adb0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e  .    nByte = ((n
1adc0 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a  Byte + pFile->sz
1add0 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65  Chunk - 1)/pFile
1ade0 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69  ->szChunk) * pFi
1adf0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d  le->szChunk;.  }
1ae00 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f  ..  rc = robust_
1ae10 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d  ftruncate(pFile-
1ae20 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65  >h, (off_t)nByte
1ae30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1ae40 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1ae50 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1ae60 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1ae70 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1ae80 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72  R_TRUNCATE, "ftr
1ae90 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e  uncate", pFile->
1aea0 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
1aeb0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1aec0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1aed0 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20   doing a normal 
1aee0 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62  write to a datab
1aef0 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70  ase file (as opp
1af00 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64  osed to.    ** d
1af10 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
1af20 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
1af30 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
1af40 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
1af50 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64  .    ** normal d
1af60 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e  atabase file) an
1af70 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74 68  d we truncate th
1af80 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c  e file to zero l
1af90 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68  ength,.    ** th
1afa0 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20 75  at effectively u
1afb0 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67  pdates the chang
1afc0 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73  e counter.  This
1afd0 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20   might happen.  
1afe0 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72    ** when restor
1aff0 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 75  ing a database u
1b000 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20  sing the backup 
1b010 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d  API from a zero-
1b020 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f  length.    ** so
1b030 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  urce..    */.   
1b040 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f   if( pFile->inNo
1b050 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79  rmalWrite && nBy
1b060 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  te==0 ){.      p
1b070 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
1b080 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  hng = 1;.    }.#
1b090 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72  endif..    retur
1b0a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1b0b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
1b0c0 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
1b0d0 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
1b0e0 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
1b0f0 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69  c int unixFileSi
1b100 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
1b110 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  *id, i64 *pSize)
1b120 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74  {.  int rc;.  st
1b130 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
1b140 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
1b150 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 28 28   rc = osFstat(((
1b160 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
1b170 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c  , &buf);.  Simul
1b180 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
1b190 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20   );.  if( rc!=0 
1b1a0 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c  ){.    ((unixFil
1b1b0 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
1b1c0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
1b1d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1b1e0 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20  RR_FSTAT;.  }.  
1b1f0 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f  *pSize = buf.st_
1b200 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  size;..  /* When
1b210 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d   opening a zero-
1b220 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74  size database, t
1b230 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  he findInodeInfo
1b240 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  () procedure.  *
1b250 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c  * writes a singl
1b260 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74  e byte into that
1b270 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74   file in order t
1b280 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20  o work around a 
1b290 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  bug.  ** in the 
1b2a0 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73  OS-X msdos files
1b2b0 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72  ystem.  In order
1b2c0 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   to avoid proble
1b2d0 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20 20  ms with upper.  
1b2e0 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65  ** layers, we ne
1b2f0 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69  ed to report thi
1b300 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a  s file size as z
1b310 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20  ero even though 
1b320 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c  it is.  ** reall
1b330 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33  y 1.   Ticket #3
1b340 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  260..  */.  if( 
1b350 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69  *pSize==1 ) *pSi
1b360 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75  ze = 0;...  retu
1b370 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b380 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1b390 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1b3a0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1b3b0 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e  PLE__)./*.** Han
1b3c0 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c  dler for proxy-l
1b3d0 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74  ocking file-cont
1b3e0 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69  rol verbs.  Defi
1b3f0 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65  ned below in the
1b400 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63  .** proxying loc
1b410 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  king division..*
1b420 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
1b430 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  xyFileControl(sq
1b440 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
1b450 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  void*);.#endif..
1b460 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
1b470 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1b480 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51 4c  o handle the SQL
1b490 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
1b4a0 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e  INT .** file-con
1b4b0 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  trol operation..
1b4c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65  **.** If the use
1b4d0 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64  r has configured
1b4e0 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f   a chunk-size fo
1b4f0 72 20 74 68 69 73 20 66 69 6c 65 2c 20 69 74 20  r this file, it 
1b500 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 74 68 61 74  could be.** that
1b510 20 74 68 65 20 66 69 6c 65 20 6e 65 65 64 73 20   the file needs 
1b520 74 6f 20 62 65 20 65 78 74 65 6e 64 65 64 20 61  to be extended a
1b530 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 4f 74  t this point. Ot
1b540 68 65 72 77 69 73 65 2c 20 74 68 65 0a 2a 2a 20  herwise, the.** 
1b550 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
1b560 45 5f 48 49 4e 54 20 6f 70 65 72 61 74 69 6f 6e  E_HINT operation
1b570 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
1b580 55 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Unix..*/.static 
1b590 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e  int fcntlSizeHin
1b5a0 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  t(unixFile *pFil
1b5b0 65 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  e, i64 nByte){. 
1b5c0 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
1b5d0 75 6e 6b 20 29 7b 0a 20 20 20 20 69 36 34 20 6e  unk ){.    i64 n
1b5e0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1b5f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1b600 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
1b610 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
1b620 74 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  t buf;          
1b630 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68      /* Used to h
1b640 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65  old return value
1b650 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a  s of fstat() */.
1b660 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73     .    if( osFs
1b670 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62  tat(pFile->h, &b
1b680 75 66 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  uf) ) return SQL
1b690 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
1b6a0 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28  ..    nSize = ((
1b6b0 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43  nByte+pFile->szC
1b6c0 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d  hunk-1) / pFile-
1b6d0 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
1b6e0 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20  e->szChunk;.    
1b6f0 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62  if( nSize>(i64)b
1b700 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23  uf.st_size ){..#
1b710 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
1b720 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29  POSIX_FALLOCATE)
1b730 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46   && HAVE_POSIX_F
1b740 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f  ALLOCATE.      /
1b750 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77  * The code below
1b760 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65   is handling the
1b770 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
1b780 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a   osFallocate() .
1b790 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74        ** correct
1b7a0 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ly. posix_falloc
1b7b0 61 74 65 28 29 20 69 73 20 64 65 66 69 6e 65 64  ate() is defined
1b7c0 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72   to "returns zer
1b7d0 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20  o on success, . 
1b7e0 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72       ** or an er
1b7f0 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66  ror number on  f
1b800 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65  ailure". See the
1b810 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74   manpage for det
1b820 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ails. */.      i
1b830 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f  nt err;.      do
1b840 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d 20  {.        err = 
1b850 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c  osFallocate(pFil
1b860 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a  e->h, buf.st_siz
1b870 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f  e, nSize-buf.st_
1b880 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68  size);.      }wh
1b890 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20  ile( err==EINTR 
1b8a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  );.      if( err
1b8b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1b8c0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65  _IOERR_WRITE;.#e
1b8d0 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  lse.      /* If 
1b8e0 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20  the OS does not 
1b8f0 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  have posix_fallo
1b900 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e  cate(), fake it.
1b910 20 46 69 72 73 74 20 75 73 65 0a 20 20 20 20 20   First use.     
1b920 20 2a 2a 20 66 74 72 75 6e 63 61 74 65 28 29 20   ** ftruncate() 
1b930 74 6f 20 73 65 74 20 74 68 65 20 66 69 6c 65 20  to set the file 
1b940 73 69 7a 65 2c 20 74 68 65 6e 20 77 72 69 74 65  size, then write
1b950 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74   a single byte t
1b960 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  o.      ** the l
1b970 61 73 74 20 62 79 74 65 20 69 6e 20 65 61 63 68  ast byte in each
1b980 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74 68   block within th
1b990 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f  e extended regio
1b9a0 6e 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a  n. This.      **
1b9b0 20 69 73 20 74 68 65 20 73 61 6d 65 20 74 65 63   is the same tec
1b9c0 68 6e 69 71 75 65 20 75 73 65 64 20 62 79 20 67  hnique used by g
1b9d0 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  libc to implemen
1b9e0 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  t posix_fallocat
1b9f0 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  e().      ** on 
1ba00 73 79 73 74 65 6d 73 20 74 68 61 74 20 64 6f 20  systems that do 
1ba10 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20  not have a real 
1ba20 66 61 6c 6c 6f 63 61 74 65 28 29 20 73 79 73 74  fallocate() syst
1ba30 65 6d 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a  em call..      *
1ba40 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b  /.      int nBlk
1ba50 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a   = buf.st_blksiz
1ba60 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74  e;  /* File-syst
1ba70 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f  em block size */
1ba80 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74  .      i64 iWrit
1ba90 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1baa0 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65     /* Next offse
1bab0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  t to write to */
1bac0 0a 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62 75  ..      if( robu
1bad0 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69  st_ftruncate(pFi
1bae0 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65 29 20 29 7b  le->h, nSize) ){
1baf0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
1bb00 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1bb10 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
1bb20 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1bb30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1bb40 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65  CATE, "ftruncate
1bb50 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1bb60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bb70 69 57 72 69 74 65 20 3d 20 28 28 62 75 66 2e 73  iWrite = ((buf.s
1bb80 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b 20  t_size + 2*nBlk 
1bb90 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d  - 1)/nBlk)*nBlk-
1bba0 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  1;.      while( 
1bbb0 69 57 72 69 74 65 3c 6e 53 69 7a 65 20 29 7b 0a  iWrite<nSize ){.
1bbc0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69          int nWri
1bbd0 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
1bbe0 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c  e(pFile, iWrite,
1bbf0 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   "", 1);.       
1bc00 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29   if( nWrite!=1 )
1bc10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1bc20 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
1bc30 20 20 20 20 69 57 72 69 74 65 20 2b 3d 20 6e 42      iWrite += nB
1bc40 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  lk;.      }.#end
1bc50 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
1bc60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bc70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72  ;.}../*.** Infor
1bc80 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72  mation and contr
1bc90 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69  ol of an open fi
1bca0 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
1bcb0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
1bcc0 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1bcd0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f  _file *id, int o
1bce0 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
1bcf0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1bd00 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1bd10 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
1bd20 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1bd30 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69 6c  pArg = ((unixFil
1bd40 65 2a 29 69 64 29 2d 3e 65 46 69 6c 65 4c 6f 63  e*)id)->eFileLoc
1bd50 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  k;.      return 
1bd60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1bd70 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1bd80 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20  _LAST_ERRNO: {. 
1bd90 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
1bda0 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69   = ((unixFile*)i
1bdb0 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  d)->lastErrno;. 
1bdc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1bdd0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1bde0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1bdf0 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b  TL_CHUNK_SIZE: {
1be00 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
1be10 65 2a 29 69 64 29 2d 3e 73 7a 43 68 75 6e 6b 20  e*)id)->szChunk 
1be20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a  = *(int *)pArg;.
1be30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1be40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1be50 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1be60 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b  NTL_SIZE_HINT: {
1be70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 63  .      return fc
1be80 6e 74 6c 53 69 7a 65 48 69 6e 74 28 28 75 6e 69  ntlSizeHint((uni
1be90 78 46 69 6c 65 20 2a 29 69 64 2c 20 2a 28 69 36  xFile *)id, *(i6
1bea0 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 7d  4 *)pArg);.    }
1beb0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1bec0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1bed0 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68   calls this meth
1bee0 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61  od to signal tha
1bef0 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20  t it has done.  
1bf00 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
1bf10 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74  and that the dat
1bf20 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66 6f  abase is therefo
1bf30 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  re unchanged and
1bf40 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65  .    ** it hence
1bf50 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68   it is OK for th
1bf60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68  e transaction ch
1bf70 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20  ange counter to 
1bf80 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e  be.    ** unchan
1bf90 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ged..    */.    
1bfa0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1bfb0 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20  L_DB_UNCHANGED: 
1bfc0 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
1bfd0 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74  le*)id)->dbUpdat
1bfe0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
1bff0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c000 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
1c010 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1c020 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1c030 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1c040 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
1c050 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
1c060 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51  ILE:.    case SQ
1c070 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
1c080 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
1c090 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65  return proxyFile
1c0a0 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41  Control(id,op,pA
1c0b0 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rg);.    }.#endi
1c0c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
1c0d0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1c0e0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1c0f0 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 20 20 63 61  PLE__) */.    ca
1c100 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1c110 53 59 4e 43 5f 4f 4d 49 54 54 45 44 3a 20 7b 0a  SYNC_OMITTED: {.
1c120 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c130 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 41 20 6e 6f  ITE_OK;  /* A no
1c140 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  -op */.    }.  }
1c150 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c160 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
1c170 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
1c180 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
1c190 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
1c1a0 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
1c1b0 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
1c1c0 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
1c1d0 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
1c1e0 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
1c1f0 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
1c200 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
1c210 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
1c220 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
1c230 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
1c240 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
1c250 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
1c260 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
1c270 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
1c280 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
1c290 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
1c2a0 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
1c2b0 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
1c2c0 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
1c2d0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
1c2e0 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
1c2f0 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
1c300 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63  atic int unixSec
1c310 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1c320 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  file *NotUsed){.
1c330 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1c340 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
1c350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46  eturn SQLITE_DEF
1c360 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1c370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1c380 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61  n the device cha
1c390 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72  racteristics for
1c3a0 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
1c3b0 69 73 20 61 6c 77 61 79 73 20 30 20 66 6f 72 20  is always 0 for 
1c3c0 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unix..*/.static 
1c3d0 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
1c3e0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
1c3f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
1c400 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
1c410 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
1c420 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
1c430 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1c440 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a  _OMIT_WAL.../*.*
1c450 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
1c460 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68   represent an sh
1c470 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66  ared memory buff
1c480 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  er.  .**.** When
1c490 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
1c4a0 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
1c4b0 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64  the same wal-ind
1c4c0 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a  ex, each thread.
1c4d0 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75  ** has its own u
1c4e0 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62  nixShm object, b
1c4f0 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e  ut they all poin
1c500 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
1c510 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69  stance.** of thi
1c520 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
1c530 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
1c540 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d  words, each wal-
1c550 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a  index is opened.
1c560 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ** only once per
1c570 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
1c580 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  Each unixShmNode
1c590 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65   object is conne
1c5a0 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65  cted to a single
1c5b0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
1c5c0 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75  bject..** We cou
1c5d0 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73  ld coalesce this
1c5e0 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69   object into uni
1c5f0 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20  xInodeInfo, but 
1c600 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a  that would mean.
1c610 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69  ** every open fi
1c620 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
1c630 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   use shared memo
1c640 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  ry (in other wor
1c650 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e  ds, most.** open
1c660 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61   files) would ha
1c670 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75  ve to carry arou
1c680 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69 6e  nd this extra in
1c690 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a  formation.  So.*
1c6a0 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * the unixInodeI
1c6b0 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  nfo object conta
1c6c0 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
1c6d0 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
1c6e0 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20  e object.** and 
1c6f0 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
1c700 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
1c710 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64  d only when need
1c720 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75  ed..**.** unixMu
1c730 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
1c740 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
1c750 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
1c760 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
1c770 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
1c780 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
1c790 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
1c7a0 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
1c7b0 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  Ref.**.** The fo
1c7c0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
1c7d0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
1c7e0 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
1c7f0 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
1c800 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
1c810 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
1c820 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d  * Either unixShm
1c830 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
1c840 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53  be held or unixS
1c850 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61  hmNode.nRef==0 a
1c860 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  nd.** unixMutexH
1c870 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
1c880 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
1c890 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
1c8a0 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
1c8b0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1c8c0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
1c8d0 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e {.  unixInodeI
1c8e0 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
1c8f0 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66   /* unixInodeInf
1c900 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73  o that owns this
1c910 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73   SHM node */.  s
1c920 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
1c930 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
1c940 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
1c950 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
1c960 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
1c970 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1c980 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20   of the mmapped 
1c990 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  file */.  int h;
1c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9b0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
1c9c0 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
1c9d0 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c9f0 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
1ca00 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
1ca10 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20  .  int nRegion; 
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca30 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
1ca40 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 63 68 61  pRegion */.  cha
1ca50 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
1ca60 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
1ca70 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
1ca80 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
1ca90 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cab0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
1cac0 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
1cad0 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
1cae0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
1caf0 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
1cb00 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
1cb10 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
1cb20 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
1cb30 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1cb40 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
1cb50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1cb60 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
1cb70 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
1cb80 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
1cb90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1cba0 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
1cbb0 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
1cbc0 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
1cbd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1cbe0 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
1cbf0 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
1cc00 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
1cc10 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
1cc20 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
1cc30 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
1cc40 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
1cc50 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
1cc60 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
1cc70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
1cc80 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
1cc90 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
1cca0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
1ccb0 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
1ccc0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
1ccd0 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
1cce0 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a    unixShm.pFile.
1ccf0 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64  **    unixShm.id
1cd00 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
1cd10 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
1cd20 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69  /write.  The uni
1cd30 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65  xShm.pFile->mute
1cd40 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
1cd50 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
1cd60 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
1cd70 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
1cd80 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75  ct unixShm {.  u
1cd90 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
1cda0 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  Node;     /* The
1cdb0 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78   underlying unix
1cdc0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
1cdd0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65  /.  unixShm *pNe
1cde0 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  xt;            /
1cdf0 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77  * Next unixShm w
1ce00 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69  ith the same uni
1ce10 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  xShmNode */.  u8
1ce20 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
1ce30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1ce40 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
1ce50 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65  unixShmNode mute
1ce60 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  x */.  u16 share
1ce70 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
1ce80 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
1ce90 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
1cea0 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
1ceb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1cec0 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
1ced0 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
1cee0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1cef0 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20  DEBUG.  u8 id;  
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf10 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73     /* Id of this
1cf20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
1cf30 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f  in its unixShmNo
1cf40 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  de */.#endif.};.
1cf50 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
1cf60 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
1cf70 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  g.*/.#define UNI
1cf80 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32  X_SHM_BASE   ((2
1cf90 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  2+SQLITE_SHM_NLO
1cfa0 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f  CK)*4)         /
1cfb0 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74  * first lock byt
1cfc0 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  e */.#define UNI
1cfd0 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e  X_SHM_DMS    (UN
1cfe0 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49  IX_SHM_BASE+SQLI
1cff0 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f  TE_SHM_NLOCK)  /
1d000 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68  * deadman switch
1d010 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79   */../*.** Apply
1d020 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
1d030 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79  locks for all by
1d040 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68  tes from ofst th
1d050 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a  rough ofst+n-1..
1d060 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63  **.** Locks bloc
1d070 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73  k if the mask is
1d080 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48   exactly UNIX_SH
1d090 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d  M_C and are non-
1d0a0 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65  blocking.** othe
1d0b0 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
1d0c0 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74   int unixShmSyst
1d0d0 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68  emLock(.  unixSh
1d0e0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c  mNode *pShmNode,
1d0f0 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20   /* Apply locks 
1d100 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61  to this open sha
1d110 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
1d120 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b  nt */.  int lock
1d130 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Type,          /
1d140 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c  * F_UNLCK, F_RDL
1d150 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a  CK, or F_WRLCK *
1d160 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
1d170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1d180 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
1d190 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f  locking range */
1d1a0 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20  .  int n        
1d1b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d1c0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
1d1d0 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
1d1e0 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20  uct flock f;    
1d1f0 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20     /* The posix 
1d200 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67  advisory locking
1d210 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
1d220 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1d230 4f 4b 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74 20  OK;   /* Result 
1d240 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28  code form fcntl(
1d250 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  ) */..  /* Acces
1d260 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d  s to the unixShm
1d270 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73  Node object is s
1d280 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
1d290 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73   caller */.  ass
1d2a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1d2b0 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65  ex_held(pShmNode
1d2c0 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d  ->mutex) || pShm
1d2d0 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  Node->nRef==0 );
1d2e0 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f  ..  /* Shared lo
1d2f0 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d  cks never span m
1d300 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74  ore than one byt
1d310 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
1d320 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21  ==1 || lockType!
1d330 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f  =F_RDLCK );..  /
1d340 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68  * Locks are with
1d350 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73  in range */.  as
1d360 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c  sert( n>=1 && n<
1d370 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1d380 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
1d390 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
1d3a0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1d3b0 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
1d3c0 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d  eters */.    mem
1d3d0 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f  set(&f, 0, sizeo
1d3e0 66 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74  f(f));.    f.l_t
1d3f0 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a  ype = lockType;.
1d400 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d      f.l_whence =
1d410 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66   SEEK_SET;.    f
1d420 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b  .l_start = ofst;
1d430 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e  .    f.l_len = n
1d440 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  ;..    rc = osFc
1d450 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ntl(pShmNode->h,
1d460 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20   F_SETLK, &f);. 
1d470 20 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31     rc = (rc!=(-1
1d480 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  )) ? SQLITE_OK :
1d490 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1d4a0 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
1d4b0 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73  he global lock s
1d4c0 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75  tate and do debu
1d4d0 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66  g tracing */.#if
1d4e0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1d4f0 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20  .  { u16 mask;. 
1d500 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
1d510 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20  OCK "));.  mask 
1d520 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  = (1<<(ofst+n)) 
1d530 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69  - (1<<ofst);.  i
1d540 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d550 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
1d560 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
1d570 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1d580 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  "unlock %d ok", 
1d590 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
1d5a0 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
1d5b0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
1d5c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
1d5d0 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
1d5e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
1d5f0 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
1d600 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
1d610 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20  (("read-lock %d 
1d620 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
1d630 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
1d640 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
1d650 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1d660 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
1d670 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  sk;.    }else{. 
1d680 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
1d690 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
1d6a0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
1d6b0 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
1d6c0 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
1d6d0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
1d6e0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
1d6f0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
1d700 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
1d710 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
1d720 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  e{.    if( lockT
1d730 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
1d740 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1d750 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  unlock %d failed
1d760 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
1d770 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
1d780 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
1d790 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
1d7a0 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29  ad-lock failed")
1d7b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1d7c0 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
1d7d0 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
1d7e0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1d7f0 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66  "write-lock %d f
1d800 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
1d810 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
1d820 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61  ACE((" - afterwa
1d830 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  rds %03x,%03x\n"
1d840 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68  ,.           pSh
1d850 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
1d860 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63  k, pShmNode->exc
1d870 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e  lMask));.  }.#en
1d880 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
1d890 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a  ;        .}.../*
1d8a0 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e  .** Purge the un
1d8b0 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  ixShmNodeList li
1d8c0 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
1d8d0 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f  s with unixShmNo
1d8e0 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
1d8f0 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
1d900 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1d910 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
1d920 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
1d930 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
1d940 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1d950 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
1d960 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
1d970 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20  mPurge(unixFile 
1d980 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d  *pFd){.  unixShm
1d990 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70  Node *p = pFd->p
1d9a0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
1d9b0 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
1d9c0 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
1d9d0 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66  if( p && p->nRef
1d9e0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
1d9f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
1da00 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49  >pInode==pFd->pI
1da10 6e 6f 64 65 20 29 3b 0a 20 20 20 20 69 66 28 20  node );.    if( 
1da20 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69 74  p->mutex ) sqlit
1da30 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
1da40 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72  >mutex);.    for
1da50 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69  (i=0; i<p->nRegi
1da60 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  on; i++){.      
1da70 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20  if( p->h>=0 ){. 
1da80 20 20 20 20 20 20 20 6d 75 6e 6d 61 70 28 70 2d         munmap(p-
1da90 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d  >apRegion[i], p-
1daa0 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >szRegion);.    
1dab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1dac0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1dad0 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20  >apRegion[i]);. 
1dae0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1daf0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1db00 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >apRegion);.    
1db10 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20  if( p->h>=0 ){. 
1db20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
1db30 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c  e(pFd, p->h, __L
1db40 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d  INE__);.      p-
1db50 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  >h = -1;.    }. 
1db60 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53     p->pInode->pS
1db70 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  hmNode = 0;.    
1db80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
1db90 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  .  }.}../*.** Op
1dba0 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  en a shared-memo
1dbb0 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74  ry area associat
1dbc0 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74  ed with open dat
1dbd0 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64  abase file pDbFd
1dbe0 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74  .  .** This part
1dbf0 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74  icular implement
1dc00 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70  ation uses mmapp
1dc10 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ed files..**.** 
1dc20 54 68 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f  The file used to
1dc30 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65   implement share
1dc40 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74  d-memory is in t
1dc50 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
1dc60 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e  y.** as the open
1dc70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1dc80 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  nd has the same 
1dc90 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e  name as the open
1dca0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1dcb0 65 20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d  e with the "-shm
1dcc0 22 20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20  " suffix added. 
1dcd0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
1dce0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1dcf0 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f  le.** is "/home/
1dd00 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22  user1/config.db"
1dd10 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74   then the file t
1dd20 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61  hat is created a
1dd30 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f  nd mmapped.** fo
1dd40 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  r shared memory 
1dd50 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22  will be called "
1dd60 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
1dd70 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a  ig.db-shm".  .**
1dd80 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72  .** Another appr
1dd90 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73  oach to is to us
1dda0 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f  e files in /dev/
1ddb0 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20  shm or /dev/tmp 
1ddc0 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74  or an.** some ot
1ddd0 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e  her tmpfs mount.
1dde0 20 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69   But if a file i
1ddf0 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69  n a different di
1de00 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20  rectory.** from 
1de10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1de20 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20  e is used, then 
1de30 64 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73  differing access
1de40 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20   permissions.** 
1de50 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69  or a chroot() mi
1de60 67 68 74 20 63 61 75 73 65 20 74 77 6f 20 64 69  ght cause two di
1de70 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65  fferent processe
1de80 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  s on the same.**
1de90 20 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64   database to end
1dea0 20 75 70 20 75 73 69 6e 67 20 64 69 66 66 65 72   up using differ
1deb0 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68  ent files for sh
1dec0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a  ared memory - .*
1ded0 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74  * meaning that t
1dee0 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c  heir memory woul
1def0 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  d not really be 
1df00 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69  shared - resulti
1df10 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73  ng.** in databas
1df20 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e  e corruption.  N
1df30 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69  evertheless, thi
1df40 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61  s tmpfs file usa
1df50 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61  ge.** can be ena
1df60 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
1df70 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c  time using -DSQL
1df80 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
1df90 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20  Y="/dev/shm".** 
1dfa0 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  or the equivalen
1dfb0 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 74  t.  The use of t
1dfc0 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  he SQLITE_SHM_DI
1dfd0 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d  RECTORY compile-
1dfe0 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72  time.** option r
1dff0 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63  esults in an inc
1e000 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20  ompatible build 
1e010 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c  of SQLite;  buil
1e020 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20  ds of SQLite.** 
1e030 74 68 61 74 20 77 69 74 68 20 64 69 66 66 65 72  that with differ
1e040 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  ing SQLITE_SHM_D
1e050 49 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67  IRECTORY setting
1e060 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  s attempt to use
1e070 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74   the.** same dat
1e080 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
1e090 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74  e same time, dat
1e0a0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1e0b0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
1e0c0 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49  result. The SQLI
1e0d0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
1e0e0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
1e0f0 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72  tion is consider
1e100 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74  ed.** "unsupport
1e110 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61  ed" and may go a
1e120 77 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20  way in a future 
1e130 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a  SQLite release..
1e140 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69  **.** When openi
1e150 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d  ng a new shared-
1e160 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20  memory file, if 
1e170 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63  no other instanc
1e180 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69  es of that.** fi
1e190 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  le are currently
1e1a0 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70   open, in this p
1e1b0 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68  rocess or in oth
1e1c0 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68  er processes, th
1e1d0 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d  en.** the file m
1e1e0 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64  ust be truncated
1e1f0 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20   to zero length 
1e200 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64  or have its head
1e210 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a  er cleared..**.*
1e220 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
1e230 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
1e240 28 70 44 62 46 64 29 20 69 73 20 75 73 69 6e 67  (pDbFd) is using
1e250 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22   the "unix-excl"
1e260 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61   VFS.** that mea
1e270 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75  ns that an exclu
1e280 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c  sive lock is hel
1e290 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1e2a0 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68  e file and.** th
1e2b0 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
1e2c0 65 73 73 65 73 20 61 72 65 20 61 62 6c 65 20 74  esses are able t
1e2d0 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1e2e0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
1e2f0 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20  n.** that case, 
1e300 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  we do not really
1e310 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d   need shared mem
1e320 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20  ory.  No shared 
1e330 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69  memory.** file i
1e340 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  s created.  The 
1e350 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69  shared memory wi
1e360 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20  ll be simulated 
1e370 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79  with heap memory
1e380 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e390 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65  unixOpenSharedMe
1e3a0 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70  mory(unixFile *p
1e3b0 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20  DbFd){.  struct 
1e3c0 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20  unixShm *p = 0; 
1e3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e3e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
1e3f0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72   opened */.  str
1e400 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1e410 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20  *pShmNode;   /* 
1e420 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
1e430 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
1e440 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1e450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e460 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1e470 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
1e480 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20  fo *pInode;     
1e490 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64       /* The inod
1e4a0 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61  e of fd */.  cha
1e4b0 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b  r *zShmFilename;
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e4d0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1e4e0 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f   used for SHM */
1e4f0 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e  .  int nShmFilen
1e500 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1e510 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1e520 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69  e SHM filename i
1e530 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a  n bytes */..  /*
1e540 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
1e550 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
1e560 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  Shm object. */. 
1e570 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
1e580 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
1e590 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
1e5a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1e5b0 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  MEM;.  memset(p,
1e5c0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
1e5d0 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
1e5e0 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20  ->pShm==0 );..  
1e5f0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1e600 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65  if a unixShmNode
1e610 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20   object already 
1e620 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e  exists. Reuse an
1e630 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f   existing.  ** o
1e640 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43  ne if present. C
1e650 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
1e660 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
1e670 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
1e680 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
1e690 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b  = pDbFd->pInode;
1e6a0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49  .  pShmNode = pI
1e6b0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
1e6c0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
1e6d0 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
1e6e0 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
1e700 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20  stat() info for 
1e710 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1e720 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73  ..    /* Call fs
1e730 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 65 20  tat() to figure 
1e740 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 73 69  out the permissi
1e750 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ons on the datab
1e760 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20  ase file. If.   
1e770 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20   ** a new *-shm 
1e780 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
1e790 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c   an attempt will
1e7a0 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61   be made to crea
1e7b0 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74  te it.    ** wit
1e7c0 68 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69  h the same permi
1e7d0 73 73 69 6f 6e 73 2e 20 54 68 65 20 61 63 74 75  ssions. The actu
1e7e0 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 74  al permissions t
1e7f0 68 65 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  he file is creat
1e800 65 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61  ed.    ** with a
1e810 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  re subject to th
1e820 65 20 63 75 72 72 65 6e 74 20 75 6d 61 73 6b 20  e current umask 
1e830 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  setting..    */.
1e840 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
1e850 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74  pDbFd->h, &sStat
1e860 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72  ) && pInode->bPr
1e870 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
1e880 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e890 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1e8a0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
1e8b0 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23  en_err;.    }..#
1e8c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  ifdef SQLITE_SHM
1e8d0 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e  _DIRECTORY.    n
1e8e0 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69  ShmFilename = si
1e8f0 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f  zeof(SQLITE_SHM_
1e900 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33 30 3b  DIRECTORY) + 30;
1e910 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46  .#else.    nShmF
1e920 69 6c 65 6e 61 6d 65 20 3d 20 35 20 2b 20 28 69  ilename = 5 + (i
1e930 6e 74 29 73 74 72 6c 65 6e 28 70 44 62 46 64 2d  nt)strlen(pDbFd-
1e940 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a  >zPath);.#endif.
1e950 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73      pShmNode = s
1e960 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
1e970 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
1e980 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20   + nShmFilename 
1e990 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
1e9a0 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
1e9b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1e9c0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
1e9d0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1e9e0 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68  }.    memset(pSh
1e9f0 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66  mNode, 0, sizeof
1ea00 28 2a 70 53 68 6d 4e 6f 64 65 29 29 3b 0a 20 20  (*pShmNode));.  
1ea10 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d    zShmFilename =
1ea20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
1ea30 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
1ea40 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64  ShmNode[1];.#ifd
1ea50 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ef SQLITE_SHM_DI
1ea60 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69  RECTORY.    sqli
1ea70 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68  te3_snprintf(nSh
1ea80 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46  mFilename, zShmF
1ea90 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ilename, .      
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1eab0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
1eac0 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d  ORY "/sqlite-shm
1ead0 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20  -%x-%x",.       
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
1eaf0 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c  32)sStat.st_ino,
1eb00 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64   (u32)sStat.st_d
1eb10 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73  ev);.#else.    s
1eb20 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1eb30 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53  nShmFilename, zS
1eb40 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d  hmFilename, "%s-
1eb50 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  shm", pDbFd->zPa
1eb60 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
1eb70 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46  FileSuffix3(pDbF
1eb80 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69  d->zPath, zShmFi
1eb90 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  lename);.#endif.
1eba0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20      pShmNode->h 
1ebb0 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d  = -1;.    pDbFd-
1ebc0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
1ebd0 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  e = pShmNode;.  
1ebe0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f    pShmNode->pIno
1ebf0 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
1ec00 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  de;.    pShmNode
1ec10 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
1ec20 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
1ec30 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
1ec40 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
1ec50 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  de->mutex==0 ){.
1ec60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1ec70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
1ec80 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1ec90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1eca0 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
1ecb0 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  sLock==0 ){.    
1ecc0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20    pShmNode->h = 
1ecd0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d  robust_open(zShm
1ece0 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 57 52  Filename, O_RDWR
1ecf0 7c 4f 5f 43 52 45 41 54 2c 0a 20 20 20 20 20 20  |O_CREAT,.      
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed10 20 20 20 20 20 20 20 20 20 28 73 53 74 61 74 2e           (sStat.
1ed20 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 29 29  st_mode & 0777))
1ed30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d  ;.      if( pShm
1ed40 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20  Node->h<0 ){.   
1ed50 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
1ed60 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
1ed70 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
1ed80 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  en", zShmFilenam
1ed90 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
1eda0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
1edb0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
1edc0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1edd0 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  if another proce
1ede0 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
1edf0 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63  e dead-man switc
1ee00 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 6e  h..      ** If n
1ee10 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  ot, truncate the
1ee20 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
1ee30 6e 67 74 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  ngth. .      */.
1ee40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1ee50 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
1ee60 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
1ee70 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52  k(pShmNode, F_WR
1ee80 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  LCK, UNIX_SHM_DM
1ee90 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  S, 1)==SQLITE_OK
1eea0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1eeb0 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
1eec0 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29  (pShmNode->h, 0)
1eed0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1eee0 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
1eef0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
1ef00 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63 61 74 65  OPEN, "ftruncate
1ef10 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  ", zShmFilename)
1ef20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ef30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1ef40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ef50 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
1ef60 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1ef70 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c  hmNode, F_RDLCK,
1ef80 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
1ef90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1efa0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
1efb0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
1efc0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
1efd0 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
1efe0 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
1eff0 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
1f000 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  */.  p->pShmNode
1f010 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66   = pShmNode;.#if
1f020 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1f030 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
1f040 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
1f050 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
1f060 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
1f070 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
1f080 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1f090 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
1f0a0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
1f0b0 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
1f0c0 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
1f0d0 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
1f0e0 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
1f0f0 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
1f100 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
1f110 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
1f120 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
1f130 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a  uct unixShm) obj
1f140 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
1f150 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
1f160 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
1f170 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
1f180 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
1f190 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
1f1a0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
1f1b0 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
1f1c0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
1f1d0 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
1f1e0 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
1f1f0 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
1f200 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  tex .  ** mutex.
1f210 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
1f220 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1f230 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1f240 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
1f250 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
1f260 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
1f270 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
1f280 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1f290 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
1f2a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f2b0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
1f2c0 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
1f2d0 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
1f2e0 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
1f2f0 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54  bFd);       /* T
1f300 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
1f310 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
1f320 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
1f330 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78  _free(p);.  unix
1f340 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
1f350 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f360 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f370 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
1f380 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
1f390 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
1f3a0 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61  n of the .** sha
1f3b0 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
1f3c0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
1f3d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
1f3e0 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
1f3f0 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e  egions .** are n
1f400 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
1f410 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
1f420 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
1f430 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
1f440 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  n .** bytes in s
1f450 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
1f460 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
1f470 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1f480 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
1f490 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
1f4a0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1f4b0 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64  , if the bExtend
1f4c0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
1f4d0 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
1f4e0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
1f4f0 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
1f500 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
1f510 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
1f520 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
1f530 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
1f540 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
1f550 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
1f560 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
1f570 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1f580 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64  . If .** bExtend
1f590 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
1f5a0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
1f5b0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1f5c0 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
1f5d0 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
1f5e0 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
1f5f0 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
1f600 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
1f610 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
1f620 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
1f630 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
1f640 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
1f650 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
1f660 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
1f670 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
1f680 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
1f690 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a  is processes .**
1f6a0 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
1f6b0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
1f6c0 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
1f6d0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
1f6e0 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d  e mapped .** mem
1f6f0 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
1f700 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
1f710 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
1f720 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
1f730 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
1f740 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
1f750 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
1f760 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
1f770 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
1f780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f790 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
1f7a0 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
1f7b0 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
1f7c0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1f7d0 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
1f7e0 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20  int bExtend,    
1f7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f800 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
1f810 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
1f820 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
1f830 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
1f840 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1f850 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
1f860 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
1f870 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
1f880 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68  le*)fd;.  unixSh
1f890 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e  m *p;.  unixShmN
1f8a0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
1f8b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f8c0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  _OK;..  /* If th
1f8d0 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
1f8e0 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
1f8f0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
1f900 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  en it now. */.  
1f910 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  if( pDbFd->pShm=
1f920 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75  =0 ){.    rc = u
1f930 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
1f940 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
1f950 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f960 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1f970 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d   }..  p = pDbFd-
1f980 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64  >pShm;.  pShmNod
1f990 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
1f9a0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1f9b0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
1f9c0 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
1f9d0 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68  t( szRegion==pSh
1f9e0 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
1f9f0 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
1fa00 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73  gion==0 );.  ass
1fa10 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
1fa20 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
1fa30 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
1fa40 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
1fa50 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
1fa60 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
1fa70 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
1fa80 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
1fa90 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
1faa0 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
1fab0 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  );..  if( pShmNo
1fac0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
1fad0 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  gion ){.    char
1fae0 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20   **apNew;       
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fb00 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d  * New apRegion[]
1fb10 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
1fb20 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69  t nByte = (iRegi
1fb30 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20  on+1)*szRegion; 
1fb40 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
1fb50 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
1fb60 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
1fb70 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
1fb80 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
1fb90 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a   by fstat() */..
1fba0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
1fbb0 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
1fbc0 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d  n;..    if( pShm
1fbd0 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
1fbe0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
1fbf0 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e  sted region is n
1fc00 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  ot mapped into t
1fc10 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
1fc20 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20  dress space..   
1fc30 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
1fc40 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65  ee if it has bee
1fc50 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65  n allocated (i.e
1fc60 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64  . if the wal-ind
1fc70 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20  ex file is.     
1fc80 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
1fc90 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1fca0 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
1fcb0 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
1fcc0 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 53    if( osFstat(pS
1fcd0 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61  hmNode->h, &sSta
1fce0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
1fcf0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1fd00 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  SHMSIZE;.       
1fd10 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1fd20 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  t;.      }.  .  
1fd30 20 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74      if( sStat.st
1fd40 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20  _size<nByte ){. 
1fd50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
1fd60 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
1fd70 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
1fd80 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64  xist. If bExtend
1fd90 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
1fda0 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69     ** false, exi
1fdb0 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
1fdc0 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
1fdd0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1fde0 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20  eturned..       
1fdf0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41   **.        ** A
1fe00 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66  lternatively, if
1fe10 20 62 45 78 74 65 6e 64 20 69 73 20 74 72 75 65   bExtend is true
1fe20 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28  , use ftruncate(
1fe30 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  ) to allocate.  
1fe40 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71        ** the req
1fe50 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
1fe60 67 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  gion..        */
1fe70 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 62 45  .        if( !bE
1fe80 78 74 65 6e 64 20 29 20 67 6f 74 6f 20 73 68 6d  xtend ) goto shm
1fe90 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
1fea0 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
1feb0 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d  uncate(pShmNode-
1fec0 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20  >h, nByte) ){.  
1fed0 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
1fee0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1fef0 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
1ff00 22 66 74 72 75 6e 63 61 74 65 22 2c 0a 20 20 20  "ftruncate",.   
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
1ff30 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
1ff40 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
1ff50 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
1ff60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1ff70 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
1ff80 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
1ff90 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
1ffa0 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
1ffb0 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
1ffc0 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68  .    apNew = (ch
1ffd0 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65  ar **)sqlite3_re
1ffe0 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70  alloc(.        p
1fff0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
20000 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73  n, (iRegion+1)*s
20010 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20  izeof(char *).  
20020 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70    );.    if( !ap
20030 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20  New ){.      rc 
20040 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
20050 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
20060 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
20070 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65    }.    pShmNode
20080 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e  ->apRegion = apN
20090 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 70 53  ew;.    while(pS
200a0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
200b0 3d 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20 20 20  =iRegion){.     
200c0 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20   void *pMem;.   
200d0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
200e0 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >h>=0 ){.       
200f0 20 70 4d 65 6d 20 3d 20 6d 6d 61 70 28 30 2c 20   pMem = mmap(0, 
20100 73 7a 52 65 67 69 6f 6e 2c 20 50 52 4f 54 5f 52  szRegion, PROT_R
20110 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20  EAD|PROT_WRITE, 
20120 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 50  .            MAP
20130 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64  _SHARED, pShmNod
20140 65 2d 3e 68 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  e->h, pShmNode->
20150 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e  nRegion*szRegion
20160 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
20170 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41      if( pMem==MA
20180 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
20190 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
201a0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
201b0 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d  OERR_SHMMAP, "mm
201c0 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ap", pShmNode->z
201d0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
201e0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
201f0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
20200 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20210 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c        pMem = sql
20220 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65  ite3_malloc(szRe
20230 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  gion);.        i
20240 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20  f( pMem==0 ){.  
20250 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
20260 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
20270 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
20280 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
20290 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
202a0 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f  pMem, 0, szRegio
202b0 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
202c0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
202d0 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
202e0 52 65 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a  Region] = pMem;.
202f0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
20300 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d  nRegion++;.    }
20310 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75  .  }..shmpage_ou
20320 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  t:.  if( pShmNod
20330 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69  e->nRegion>iRegi
20340 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20  on ){.    *pp = 
20350 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
20360 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d  on[iRegion];.  }
20370 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20  else{.    *pp = 
20380 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
20390 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
203a0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
203b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
203c0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
203d0 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
203e0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
203f0 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  egment..**.** No
20400 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61  te that the rela
20410 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
20420 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c   SHAREd and EXCL
20430 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61  USIVE locks is a
20440 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65   little.** diffe
20450 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69  rent here than i
20460 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68  n posix.  In xSh
20470 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e  mLock(), one can
20480 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   go from unlocke
20490 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61  d.** to shared a
204a0 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20  nd back or from 
204b0 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c  unlocked to excl
204c0 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20  usive and back. 
204d0 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20   But one may.** 
204e0 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72  not go from shar
204f0 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
20500 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76  or from exclusiv
20510 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a  e to shared..*/.
20520 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
20530 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
20540 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
20550 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
20560 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
20570 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
20580 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
20590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205a0 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
205b0 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
205c0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
205d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
205f0 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
20600 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
20610 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
20620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20630 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
20640 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
20650 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
20660 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
20670 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ;      /* Connec
20680 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
20690 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
206a0 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62  unixShm *p = pDb
206b0 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20  Fd->pShm;       
206c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
206d0 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
206e0 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69   locked */.  uni
206f0 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20  xShm *pX;       
20700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20710 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
20720 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
20730 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ngs */.  unixShm
20740 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
20750 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f   p->pShmNode;  /
20760 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
20770 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20   file iNode */. 
20780 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20790 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
207a0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
207b0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
207c0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
207d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207e0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
207f0 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
20800 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
20810 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
20820 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
20830 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
20840 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
20850 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
20860 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  e );.  assert( o
20870 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
20880 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
20890 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
208a0 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
208b0 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
208c0 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
208d0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
208e0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
208f0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
20900 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
20910 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
20920 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
20930 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
20940 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
20950 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
20960 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
20970 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
20980 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
20990 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
209a0 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
209b0 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
209c0 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
209d0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
209e0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
209f0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
20a00 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
20a10 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
20a20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
20a30 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
20a40 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c  );..  mask = (1<
20a50 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
20a60 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74  <ofst);.  assert
20a70 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28  ( n>1 || mask==(
20a80 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71  1<<ofst) );.  sq
20a90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
20aa0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
20ab0 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
20ac0 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
20ad0 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
20ae0 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
20af0 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
20b00 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
20b10 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
20b20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
20b30 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
20b40 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
20b50 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
20b60 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
20b70 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
20b80 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
20b90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
20ba0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
20bb0 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
20bc0 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
20bd0 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
20be0 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
20bf0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
20c00 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
20c10 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
20c20 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
20c30 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
20c40 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
20c50 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
20c60 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20  mNode, F_UNLCK, 
20c70 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
20c80 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  SE, n);.    }els
20c90 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
20ca0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
20cb0 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20      /* Undo the 
20cc0 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  local locks */. 
20cd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20ce0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
20cf0 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
20d00 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  sk;.      p->sha
20d10 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
20d20 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65  ;.    } .  }else
20d30 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
20d40 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29  ITE_SHM_SHARED )
20d50 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61  {.    u16 allSha
20d60 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69  red = 0;  /* Uni
20d70 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  on of locks held
20d80 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
20d90 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a  other than "p" *
20da0 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f  /..    /* Find o
20db0 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20  ut which shared 
20dc0 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64  locks are alread
20dd0 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  y held by siblin
20de0 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  g connections.. 
20df0 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62     ** If any sib
20e00 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c  ling already hol
20e10 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
20e20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61  lock, go ahead a
20e30 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
20e40 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
20e50 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
20e60 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
20e70 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
20e80 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
20e90 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
20ea0 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
20eb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
20ec0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
20ed0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
20ee0 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70    allShared |= p
20ef0 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
20f00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
20f10 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74   shared locks at
20f20 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
20f30 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  l, if necessary 
20f40 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
20f50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20f60 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64    if( (allShared
20f70 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
20f80 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
20f90 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
20fa0 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c  hmNode, F_RDLCK,
20fb0 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42   ofst+UNIX_SHM_B
20fc0 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
20fd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
20fe0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20ff0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
21000 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
21010 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
21020 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
21030 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21040 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
21050 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
21060 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
21070 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
21080 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
21090 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
210a0 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
210b0 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
210c0 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
210d0 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
210e0 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
210f0 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
21100 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
21110 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
21120 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
21130 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
21140 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
21150 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
21160 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
21170 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
21180 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
21190 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
211a0 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75  /* Get the exclu
211b0 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68  sive locks at th
211c0 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20  e system level. 
211d0 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73   Then if success
211e0 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ful.    ** also 
211f0 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63  mark the local c
21200 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69  onnection as bei
21210 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a  ng locked..    *
21220 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
21230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21240 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
21250 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
21260 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b  , F_WRLCK, ofst+
21270 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
21280 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
21290 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
212a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
212b0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
212c0 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ask)==0 );.     
212d0 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c     p->exclMask |
212e0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  = mask;.      }.
212f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
21300 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
21310 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
21320 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
21330 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c  M-LOCK shmid-%d,
21340 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78   pid-%d got %03x
21350 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20  ,%03x\n",.      
21360 20 20 20 20 20 70 2d 3e 69 64 2c 20 67 65 74 70       p->id, getp
21370 69 64 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d  id(), p->sharedM
21380 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b  ask, p->exclMask
21390 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
213a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
213b0 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72  ent a memory bar
213c0 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66  rier or memory f
213d0 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d  ence on shared m
213e0 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  emory.  .**.** A
213f0 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f  ll loads and sto
21400 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65  res begun before
21410 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73   the barrier mus
21420 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72  t complete befor
21430 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72  e.** any load or
21440 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74   store begun aft
21450 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a  er the barrier..
21460 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
21470 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20  nixShmBarrier(. 
21480 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
21490 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
214a0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
214b0 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
214c0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
214d0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
214e0 45 54 45 52 28 66 64 29 3b 0a 20 20 75 6e 69 78  ETER(fd);.  unix
214f0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
21500 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
21510 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
21520 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
21530 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20   shared-memory. 
21540 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   Delete the unde
21550 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61  rlying .** stora
21560 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67  ge if deleteFlag
21570 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
21580 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
21590 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73  hared memory ass
215a0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
215b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e   connection then
215c0 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
215d0 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
215e0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
215f0 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  int unixShmUnmap
21600 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
21610 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
21620 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
21630 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
21640 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ile */.  int del
21650 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20  eteFlag         
21660 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
21670 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  te shared-memory
21680 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
21690 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20   unixShm *p;    
216a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216b0 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
216c0 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  on to be closed 
216d0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
216e0 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
216f0 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
21700 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  rlying shared-me
21710 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  mory file */.  u
21720 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  nixShm **pp;    
21730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21740 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
21750 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  er sibling conne
21760 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78  ctions */.  unix
21770 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20  File *pDbFd;    
21780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21790 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
217a0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
217b0 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46    pDbFd = (unixF
217c0 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70  ile*)fd;.  p = p
217d0 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66  DbFd->pShm;.  if
217e0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
217f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68  SQLITE_OK;.  pSh
21800 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
21810 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ode;..  assert( 
21820 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d  pShmNode==pDbFd-
21830 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
21840 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
21850 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d  ShmNode->pInode=
21860 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29  =pDbFd->pInode )
21870 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63  ;..  /* Remove c
21880 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d  onnection p from
21890 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e   the set of conn
218a0 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  ections associat
218b0 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68  ed.  ** with pSh
218c0 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  mNode */.  sqlit
218d0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
218e0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
218f0 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e  .  for(pp=&pShmN
21900 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70  ode->pFirst; (*p
21910 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70  p)!=p; pp = &(*p
21920 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a  p)->pNext){}.  *
21930 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a  pp = p->pNext;..
21940 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f    /* Free the co
21950 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20  nnection p */.  
21960 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
21970 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
21980 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
21990 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
219a0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f  de->mutex);..  /
219b0 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  * If pShmNode->n
219c0 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20  Ref has reached 
219d0 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  0, then close th
219e0 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a  e underlying.  *
219f0 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
21a00 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75  file, too */.  u
21a10 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
21a20 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
21a30 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ode->nRef>0 );. 
21a40 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d   pShmNode->nRef-
21a50 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  -;.  if( pShmNod
21a60 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  e->nRef==0 ){.  
21a70 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67    if( deleteFlag
21a80 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e   && pShmNode->h>
21a90 3d 30 20 29 20 75 6e 6c 69 6e 6b 28 70 53 68 6d  =0 ) unlink(pShm
21aa0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
21ab0 3b 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72  ;.    unixShmPur
21ac0 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20  ge(pDbFd);.  }. 
21ad0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
21ae0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
21af0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73  ITE_OK;.}...#els
21b00 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  e.# define unixS
21b10 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65  hmMap     0.# de
21b20 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  fine unixShmLock
21b30 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75      0.# define u
21b40 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a  nixShmBarrier 0.
21b50 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
21b60 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66  Unmap   0.#endif
21b70 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
21b80 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
21b90 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20  /*.** Here ends 
21ba0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
21bb0 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65  on of all sqlite
21bc0 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a  3_file methods..
21bd0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
21be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71  ********* End sq
21bf0 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f  lite3_file Metho
21c00 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
21c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c20 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
21c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c70 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64  */../*.** This d
21c80 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
21c90 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20   definitions of 
21ca0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
21cb0 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a  ds objects that.
21cc0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72  ** implement var
21cd0 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  ious file lockin
21ce0 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 49  g strategies.  I
21cf0 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20  t also contains 
21d00 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f  definitions.** o
21d10 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  f "finder" funct
21d20 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d  ions.  A finder-
21d30 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
21d40 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61   to locate the a
21d50 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71  ppropriate.** sq
21d60 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
21d70 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61   object for a pa
21d80 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
21d90 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70  e file.  The pAp
21da0 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f  pData.** field o
21db0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66  f the sqlite3_vf
21dc0 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72  s VFS objects ar
21dd0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
21de0 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a   be pointers to.
21df0 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 66  ** the correct f
21e00 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66  inder-function f
21e10 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a  or that VFS..**.
21e20 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66  ** Most finder f
21e30 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
21e40 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
21e50 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ixed sqlite3_io_
21e60 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
21e70 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74  t.  The only int
21e80 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d  eresting finder-
21e90 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f  function is auto
21ea0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68  lockIoFinder, wh
21eb0 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20  ich.** looks at 
21ec0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74  the filesystem t
21ed0 79 70 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f  ype and tries to
21ee0 20 67 75 65 73 73 20 74 68 65 20 62 65 73 74 20   guess the best 
21ef0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74  locking.** strat
21f00 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a  egy from that..*
21f10 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d  *.** For finder-
21f20 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f  funtion F, two o
21f30 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
21f40 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ed:.**.**    (1)
21f50 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72   The real finder
21f60 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20  -function named 
21f70 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a  "FImpt()"..**.**
21f80 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61      (2) A consta
21f90 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  nt pointer to th
21fa0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  is function name
21fb0 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a  d just "F"..**.*
21fc0 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74  *.** A pointer t
21fd0 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20  o the F pointer 
21fe0 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70  is used as the p
21ff0 41 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f  AppData value fo
22000 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73  r VFS.** objects
22010 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  .  We have to do
22020 20 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66   this instead of
22030 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74   letting pAppDat
22040 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63  a point.** direc
22050 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65  tly at the finde
22060 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65  r-function since
22070 20 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65   C90 rules preve
22080 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72  nt a void*.** fr
22090 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20  om be cast into 
220a0 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
220b0 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63  er..**.**.** Eac
220c0 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
220d0 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74  is macro generat
220e0 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a  es two objects:.
220f0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e  **.**   *  A con
22100 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  stant sqlite3_io
22110 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
22120 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74  call METHOD that
22130 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   has locking.** 
22140 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f       methods CLO
22150 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b  SE, LOCK, UNLOCK
22160 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a  , CKRESLOCK..**.
22170 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d  **   *  An I/O m
22180 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
22190 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e  ction called FIN
221a0 44 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73  DER that returns
221b0 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20   a pointer.**   
221c0 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44     to the METHOD
221d0 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70   object in the p
221e0 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a  revious bullet..
221f0 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54  */.#define IOMET
22200 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d 45 54  HODS(FINDER, MET
22210 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20 43 4c  HOD, VERSION, CL
22220 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43  OSE, LOCK, UNLOC
22230 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20  K, CKLOCK)      
22240 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
22250 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
22260 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20  s METHOD = {    
22270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
22290 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20  .   VERSION,    
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222b0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
222c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
222e0 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20     CLOSE,       
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22300 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20  * xClose */     
22310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22320 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
22330 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20    unixRead,     
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22350 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20   xRead */       
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22370 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
22380 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20   unixWrite,     
22390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
223a0 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20  xWrite */       
223b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223c0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
223d0 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20  unixTruncate,   
223e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
223f0 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20  Truncate */     
22400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22410 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
22420 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20  nixSync,        
22430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
22440 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ync */          
22450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22460 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
22470 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  ixFileSize,     
22480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
22490 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20  leSize */       
224a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224b0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43          \.   LOC
224c0 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
224d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
224e0 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
224f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22500 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f         \.   UNLO
22510 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CK,             
22520 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
22530 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
22540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22550 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43        \.   CKLOC
22560 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
22570 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b         /* xCheck
22580 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20  ReservedLock */ 
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225a0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69       \.   unixFi
225b0 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
225c0 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
225d0 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20  ntrol */        
225e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225f0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63      \.   unixSec
22600 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
22610 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
22620 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22640 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69     \.   unixDevi
22650 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
22660 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61  s,  /* xDeviceCa
22670 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20  pabilities */   
22680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22690 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4d 61    \.   unixShmMa
226a0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
226b0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f     /* xShmMap */
226c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226e0 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63   \.   unixShmLoc
226f0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
22700 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f    /* xShmLock */
22710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22730 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72  \.   unixShmBarr
22740 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ier,            
22750 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20   /* xShmBarrier 
22760 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
22770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
22780 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  .   unixShmUnmap
22790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227a0 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20  /* xShmUnmap */ 
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
227d0 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  };              
227e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22810 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
22820 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
22830 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
22840 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e  FINDER##Impl(con
22850 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78  st char *z, unix
22860 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20  File *p){   \.  
22870 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
22880 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41  (z); UNUSED_PARA
22890 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20  METER(p);       
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228b0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72             \.  r
228c0 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20  eturn &METHOD;  
228d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22900 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20            \.}   
22910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22950 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69           \.stati
22960 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
22970 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f  io_methods *(*co
22980 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73  nst FINDER)(cons
22990 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
229a0 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20   *p)    \.    = 
229b0 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f  FINDER##Impl;../
229c0 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c  *.** Here are al
229d0 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  l of the sqlite3
229e0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
229f0 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20  cts for each of 
22a00 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73  the.** locking s
22a10 74 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63  trategies.  Func
22a20 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72  tions that retur
22a30 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  n pointers to th
22a40 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61  ese methods.** a
22a50 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e  re also created.
22a60 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  .*/.IOMETHODS(. 
22a70 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20   posixIoFinder, 
22a80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
22a90 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
22aa0 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d  me */.  posixIoM
22ab0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
22ac0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
22ad0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
22ae0 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20  ame */.  2,     
22af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b00 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
22b10 6f 72 79 20 69 73 20 65 6e 61 62 6c 65 64 20 2a  ory is enabled *
22b20 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
22b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22b40 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
22b50 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20  /.  unixLock,   
22b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22b70 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
22b80 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20  .  unixUnlock,  
22b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22ba0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
22bb0 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
22bc0 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a  ervedLock     /*
22bd0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
22be0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
22bf0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c  IOMETHODS(.  nol
22c00 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
22c10 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
22c20 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
22c30 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  /.  nolockIoMeth
22c40 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ods,          /*
22c50 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
22c60 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
22c70 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22c90 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
22ca0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
22cb0 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20   nolockClose,   
22cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
22cd0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
22ce0 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20   nolockLock,    
22cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
22d00 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
22d10 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  nolockUnlock,   
22d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
22d30 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
22d40 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
22d50 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43  rvedLock   /* xC
22d60 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
22d70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
22d80 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63  ETHODS(.  dotloc
22d90 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
22da0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
22db0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
22dc0 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   dotlockIoMethod
22dd0 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  s,         /* sq
22de0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
22df0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
22e00 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
22e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
22e20 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
22e30 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f  disabled */.  do
22e40 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  tlockClose,     
22e50 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
22e60 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  e method */.  do
22e70 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  tlockLock,      
22e80 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
22e90 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
22ea0 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
22eb0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
22ec0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
22ed0 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
22ee0 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63  edLock  /* xChec
22ef0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
22f00 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53  thod */.)..#if S
22f10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
22f20 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
22f30 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
22f40 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69  ODS(.  flockIoFi
22f50 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
22f60 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
22f70 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c  ion name */.  fl
22f80 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
22f90 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
22fa0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
22fb0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
22fc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
22fe0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
22ff0 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  abled */.  flock
23000 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
23010 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
23020 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
23030 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
23040 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
23050 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55  thod */.  flockU
23060 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
23070 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
23080 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
23090 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
230a0 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k    /* xCheckRe
230b0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
230c0 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
230d0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f  if OS_VXWORKS.IO
230e0 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f  METHODS(.  semIo
230f0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
23100 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
23110 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
23120 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20    semIoMethods, 
23130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
23140 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
23150 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
23160 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
23170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23180 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
23190 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73   disabled */.  s
231a0 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  emClose,        
231b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
231c0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  se method */.  s
231d0 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  emLock,         
231e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
231f0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  k method */.  se
23200 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  mUnlock,        
23210 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
23220 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  ck method */.  s
23230 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  emCheckReservedL
23240 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
23250 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
23260 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
23270 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
23280 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
23290 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
232a0 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f  NG_STYLE.IOMETHO
232b0 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65  DS(.  afpIoFinde
232c0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
232d0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
232e0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70  on name */.  afp
232f0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
23300 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
23310 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
23320 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23340 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
23350 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
23360 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f  bled */.  afpClo
23370 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
23380 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
23390 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63  thod */.  afpLoc
233a0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
233b0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
233c0 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f  hod */.  afpUnlo
233d0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
233e0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
233f0 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65  thod */.  afpChe
23400 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
23410 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
23420 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
23430 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
23440 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
23450 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20  cking method is 
23460 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22  a "super-method"
23470 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68   in the sense th
23480 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73  at it.** opens s
23490 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65  econdary file de
234a0 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68  scriptors for th
234b0 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b  e conch and lock
234c0 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74   files and.** it
234d0 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74   uses proxy, dot
234e0 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20  -file, AFP, and 
234f0 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20  flock() locking 
23500 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65  methods on those
23510 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69  .** secondary fi
23520 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72  les.  For this r
23530 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
23540 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
23550 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63  nts.** proxy loc
23560 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20  king is located 
23570 6d 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77  much further dow
23580 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  n in the file.  
23590 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74  But we need.** t
235a0 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64  o go ahead and d
235b0 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65  efine the sqlite
235c0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64  3_io_methods and
235d0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
235e0 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  .** for proxy lo
235f0 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20  cking here.  So 
23600 77 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61  we forward decla
23610 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f  re the I/O metho
23620 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ds..*/.#if defin
23630 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
23640 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
23650 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61  OCKING_STYLE.sta
23660 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f  tic int proxyClo
23670 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  se(sqlite3_file*
23680 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
23690 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  oxyLock(sqlite3_
236a0 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
236b0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c  tic int proxyUnl
236c0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
236d0 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
236e0 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65  int proxyCheckRe
236f0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
23700 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b  e3_file*, int*);
23710 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72  .IOMETHODS(.  pr
23720 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  oxyIoFinder,    
23730 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
23740 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
23750 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68  */.  proxyIoMeth
23760 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
23770 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
23780 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
23790 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
237a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237b0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
237c0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
237d0 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20    proxyClose,   
237e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
237f0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
23800 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20    proxyLock,    
23810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23820 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
23830 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20   proxyUnlock,   
23840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
23850 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
23860 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65    proxyCheckRese
23870 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78  rvedLock    /* x
23880 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
23890 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
238a0 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63  ndif../* nfs loc
238b0 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20  kd on OSX 10.3+ 
238c0 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72  doesn't clear wr
238d0 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61  ite locks when a
238e0 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
238f0 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  t */.#if defined
23900 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
23910 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
23920 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
23930 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e  HODS(.  nfsIoFin
23940 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
23950 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
23960 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
23970 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  nfsIoMethods,   
23980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
23990 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
239a0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
239b0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
239c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
239d0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
239e0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75   disabled */.  u
239f0 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
23a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
23a10 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
23a20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
23a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
23a40 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
23a50 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nfsUnlock,      
23a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
23a70 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
23a80 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
23a90 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
23aa0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
23ab0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
23ac0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
23ad0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
23ae0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
23af0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
23b00 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
23b10 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  " function attem
23b20 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
23b30 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
23b40 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66  g strategy .** f
23b50 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
23b60 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e  file "filePath".
23b70 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
23b80 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
23b90 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
23ba0 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
23bb0 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
23bc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
23bd0 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e  for MacOSX only.
23be0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
23bf0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
23c00 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
23c10 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
23c20 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
23c30 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
23c40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23c50 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
23c60 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
23c70 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62   /* open file ob
23c80 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74  ject for the dat
23c90 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  abase file */.){
23ca0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
23cb0 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b  struct Mapping {
23cc0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
23cd0 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20  *zFilesystem;   
23ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
23cf0 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61  lesystem type na
23d00 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  me */.    const 
23d10 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
23d20 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20  ds *pMethods;   
23d30 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c  /* Appropriate l
23d40 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f  ocking method */
23d50 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a  .  } aMap[] = {.
23d60 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20      { "hfs",    
23d70 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
23d80 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20  },.    { "ufs", 
23d90 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
23da0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70  ds },.    { "afp
23db0 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
23dc0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d  ods },.    { "sm
23dd0 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  bfs",  &afpIoMet
23de0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77  hods },.    { "w
23df0 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49  ebdav", &nolockI
23e00 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
23e10 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20  { 0, 0 }.  };.  
23e20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
23e30 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
23e40 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
23e50 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
23e60 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
23e70 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
23e80 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
23e90 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
23ea0 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
23eb0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
23ec0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
23ed0 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
23ee0 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
23ef0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
23f00 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69  .  if( statfs(fi
23f10 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  lePath, &fsInfo)
23f20 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66   != -1 ){.    if
23f30 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  ( fsInfo.f_flags
23f40 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b   & MNT_RDONLY ){
23f50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
23f60 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
23f70 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
23f80 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  0; aMap[i].zFile
23f90 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  system; i++){.  
23fa0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
23fb0 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
23fc0 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  me, aMap[i].zFil
23fd0 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20  esystem)==0 ){. 
23fe0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d         return aM
23ff0 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a  ap[i].pMethods;.
24000 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24010 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  }..  /* Default 
24020 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61  case. Handles, a
24030 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22  mongst others, "
24040 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20  nfs"..  ** Test 
24050 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20  byte-range lock 
24060 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49  using fcntl(). I
24070 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65  f the call succe
24080 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d  eds, .  ** assum
24090 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d  e that the file-
240a0 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
240b0 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
240c0 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  s. .  */.  lockI
240d0 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
240e0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
240f0 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
24100 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
24110 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
24120 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
24130 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
24140 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
24150 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
24160 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73  -1 ) {.    if( s
24170 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
24180 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22  stypename, "nfs"
24190 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
241a0 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f  turn &nfsIoMetho
241b0 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ds;.    } else {
241c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70  .      return &p
241d0 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  osixIoMethods;. 
241e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
241f0 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63    return &dotloc
24200 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
24210 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
24220 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
24230 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75  s .  *(*const au
24240 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28  tolockIoFinder)(
24250 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
24260 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63  File*) = autoloc
24270 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a  kIoFinderImpl;..
24280 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
24290 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
242a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
242b0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
242c0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  #if OS_VXWORKS &
242d0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
242e0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
242f0 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65   .** This "finde
24300 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  r" function atte
24310 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
24320 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  e the best locki
24330 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20  ng strategy .** 
24340 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
24350 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22   file "filePath"
24360 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72  .  It then retur
24370 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ns the sqlite3_i
24380 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
24390 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
243a0 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67  nts that strateg
243b0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  y..**.** This is
243c0 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c   for VXWorks onl
243d0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y..*/.static con
243e0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
243f0 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49  thods *autolockI
24400 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
24410 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
24420 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
24430 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
24440 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
24450 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
24460 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66     /* the open f
24470 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  ile object */.){
24480 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
24490 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
244a0 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
244b0 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
244c0 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
244d0 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
244e0 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
244f0 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
24500 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
24510 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
24520 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
24530 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
24540 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66   }..  /* Test if
24550 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70   fcntl() is supp
24560 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f  orted and use PO
24570 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e  SIX style locks.
24580 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  .  ** Otherwise 
24590 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
245a0 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
245b0 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20   method..  */.  
245c0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
245d0 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
245e0 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
245f0 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
24600 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
24610 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
24620 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f  F_RDLCK;.  if( o
24630 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20  sFcntl(pNew->h, 
24640 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
24650 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
24660 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d  return &posixIoM
24670 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
24680 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d  .    return &sem
24690 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d  IoMethods;.  }.}
246a0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
246b0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
246c0 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74   .  *(*const aut
246d0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63  olockIoFinder)(c
246e0 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
246f0 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b  ile*) = autolock
24700 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
24710 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
24720 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  RKS && SQLITE_EN
24730 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
24740 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  LE */../*.** An 
24750 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f  abstract type fo
24760 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
24770 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65   IO method finde
24780 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74  r function:.*/.t
24790 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c  ypedef const sql
247a0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
247b0 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28  *(*finder_type)(
247c0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
247d0 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a  File*);.../*****
247e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
247f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24820 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
24830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24840 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  **** sqlite3_vfs
24850 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
24860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24870 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
24880 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
24890 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ns the implement
248a0 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73  ation of methods
248b0 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   on the.** sqlit
248c0 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a  e3_vfs object..*
248d0 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  /../*.** Initial
248e0 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ize the contents
248f0 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   of the unixFile
24900 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
24910 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f  ed to by pId..*/
24920 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
24930 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71  InUnixFile(.  sq
24940 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
24950 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
24960 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
24970 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20  /.  int h,      
24980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
24990 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
249a0 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e  tor of file bein
249b0 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e  g opened */.  in
249c0 74 20 64 69 72 66 64 2c 20 20 20 20 20 20 20 20  t dirfd,        
249d0 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
249e0 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
249f0 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
24a00 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20  file *pId,      
24a10 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20  /* Write to the 
24a20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
24a30 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
24a40 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
24a50 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
24a60 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
24a70 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  pened */.  int n
24a80 6f 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  oLock,          
24a90 20 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69     /* Omit locki
24aa0 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  ng if true */.  
24ab0 69 6e 74 20 69 73 44 65 6c 65 74 65 2c 20 20 20  int isDelete,   
24ac0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
24ad0 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72  e on close if tr
24ae0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 65  ue */.  int isRe
24af0 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20  adOnly          
24b00 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 66  /* True if the f
24b10 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65  ile is opened re
24b20 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 29 7b 0a 20 20  ad-only */.){.  
24b30 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
24b40 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69  _methods *pLocki
24b50 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46  ngStyle;.  unixF
24b60 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69  ile *pNew = (uni
24b70 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69  xFile *)pId;.  i
24b80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
24b90 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  K;..  assert( pN
24ba0 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c  ew->pInode==NULL
24bb0 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d 65   );..  /* Parame
24bc0 74 65 72 20 69 73 44 65 6c 65 74 65 20 69 73 20  ter isDelete is 
24bd0 6f 6e 6c 79 20 75 73 65 64 20 6f 6e 20 76 78 77  only used on vxw
24be0 6f 72 6b 73 2e 20 45 78 70 72 65 73 73 20 74 68  orks. Express th
24bf0 69 73 20 65 78 70 6c 69 63 69 74 6c 79 20 0a 20  is explicitly . 
24c00 20 2a 2a 20 68 65 72 65 20 74 6f 20 70 72 65 76   ** here to prev
24c10 65 6e 74 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  ent compiler war
24c20 6e 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73  nings about unus
24c30 65 64 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20  ed parameters.. 
24c40 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
24c50 41 4d 45 54 45 52 28 69 73 44 65 6c 65 74 65 29  AMETER(isDelete)
24c60 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20  ;..  /* Usually 
24c70 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61  the path zFilena
24c80 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  me should not be
24c90 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
24ca0 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65  name. The.  ** e
24cb0 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e  xception is when
24cc0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f   opening the pro
24cd0 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20  xy "conch" file 
24ce0 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20  in builds that. 
24cf0 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20   ** include the 
24d00 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f  special Apple lo
24d10 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20  cking styles..  
24d20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
24d30 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
24d40 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
24d50 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72  NG_STYLE.  asser
24d60 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  t( zFilename==0 
24d70 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
24d80 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66  ='/' .    || pVf
24d90 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f  s->pAppData==(vo
24da0 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46  id*)&autolockIoF
24db0 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20  inder );.#else. 
24dc0 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
24dd0 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
24de0 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65  me[0]=='/' );.#e
24df0 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28  ndif..  OSTRACE(
24e00 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25  ("OPEN    %-3d %
24e10 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61  s\n", h, zFilena
24e20 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20  me));.  pNew->h 
24e30 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 72  = h;.  pNew->dir
24e40 66 64 20 3d 20 64 69 72 66 64 3b 0a 20 20 70 4e  fd = dirfd;.  pN
24e50 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c  ew->zPath = zFil
24e60 65 6e 61 6d 65 3b 0a 20 20 69 66 28 20 6d 65 6d  ename;.  if( mem
24e70 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c  cmp(pVfs->zName,
24e80 22 75 6e 69 78 2d 65 78 63 6c 22 2c 31 30 29 3d  "unix-excl",10)=
24e90 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 ){.    pNew->
24ea0 63 74 72 6c 46 6c 61 67 73 20 3d 20 55 4e 49 58  ctrlFlags = UNIX
24eb0 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 65 6c  FILE_EXCL;.  }el
24ec0 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74  se{.    pNew->ct
24ed0 72 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d  rlFlags = 0;.  }
24ee0 0a 20 20 69 66 28 20 69 73 52 65 61 64 4f 6e 6c  .  if( isReadOnl
24ef0 79 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  y ){.    pNew->c
24f00 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
24f10 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d  FILE_RDONLY;.  }
24f20 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
24f30 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76  .  pNew->pId = v
24f40 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64  xworksFindFileId
24f50 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
24f60 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20  f( pNew->pId==0 
24f70 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20  ){.    noLock = 
24f80 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  1;.    rc = SQLI
24f90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65  TE_NOMEM;.  }.#e
24fa0 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f  ndif..  if( noLo
24fb0 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69  ck ){.    pLocki
24fc0 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63  ngStyle = &noloc
24fd0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  kIoMethods;.  }e
24fe0 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e  lse{.    pLockin
24ff0 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e  gStyle = (**(fin
25000 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e  der_type*)pVfs->
25010 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e  pAppData)(zFilen
25020 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20  ame, pNew);.#if 
25030 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
25040 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
25050 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61  /* Cache zFilena
25060 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  me in the lockin
25070 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61  g context (AFP a
25080 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72  nd dotlock overr
25090 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ide) for.    ** 
250a0 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61  proxyLock activa
250b0 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65  tion is possible
250c0 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69   (remote proxy i
250d0 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61  s based on db na
250e0 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65  me).    ** zFile
250f0 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  name remains val
25100 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73  id until file is
25110 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70   closed, to supp
25120 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  ort */.    pNew-
25130 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
25140 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61  = (void*)zFilena
25150 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  me;.#endif.  }..
25160 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74    if( pLockingSt
25170 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d  yle == &posixIoM
25180 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e  ethods.#if defin
25190 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
251a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
251b0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
251c0 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c   || pLockingStyl
251d0 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f  e == &nfsIoMetho
251e0 64 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20  ds.#endif.  ){. 
251f0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
25200 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
25210 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
25220 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
25230 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
25240 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25250 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
25260 6f 63 63 75 72 65 64 20 69 6e 20 66 69 6e 64 49  occured in findI
25270 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73  nodeInfo(), clos
25280 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
25290 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  iptor.      ** i
252a0 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f  mmediately, befo
252b0 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  re releasing the
252c0 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64   mutex. findInod
252d0 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c  eInfo() may fail
252e0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f  .      ** in two
252f0 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20   scenarios:.    
25300 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
25310 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73  (a) A call to fs
25320 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20  tat() failed..  
25330 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d      **   (b) A m
25340 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20  alloc failed..  
25350 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
25360 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79  Scenario (b) may
25370 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74   only occur if t
25380 68 65 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  he process is ho
25390 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20  lding no other. 
253a0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73       ** file des
253b0 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e  criptors open on
253c0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20   the same file. 
253d0 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6f 74  If there were ot
253e0 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  her file.      *
253f0 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e  * descriptors on
25400 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e   this file, then
25410 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64   no malloc would
25420 20 62 65 20 72 65 71 75 69 72 65 64 20 62 79 0a   be required by.
25430 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f        ** findIno
25440 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69  deInfo(). If thi
25450 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 69  s is the case, i
25460 74 20 69 73 20 71 75 69 74 65 20 73 61 66 65 20  t is quite safe 
25470 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a  to close.      *
25480 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20  * handle h - as 
25490 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
254a0 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c   that no posix l
254b0 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c  ocks will be rel
254c0 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  eased.      ** b
254d0 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20  y doing so..    
254e0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
254f0 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61   scenario (a) ca
25500 75 73 65 64 20 74 68 65 20 65 72 72 6f 72 20 74  used the error t
25510 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e  hen things are n
25520 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a  ot so safe. The.
25530 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69        ** implici
25540 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72  t assumption her
25550 65 20 69 73 20 74 68 61 74 20 69 66 20 66 73 74  e is that if fst
25560 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e  at() fails, thin
25570 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20  gs are in.      
25580 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68 61 70  ** such bad shap
25590 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20  e that dropping 
255a0 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f  a lock or two do
255b0 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63  esn't matter muc
255c0 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
255d0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
255e0 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
255f0 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b  );.      h = -1;
25600 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
25610 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
25620 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
25630 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
25640 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
25650 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69  PPLE__).  else i
25660 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
25670 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
25680 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20  s ){.    /* AFP 
25690 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
256a0 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
256b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
256c0 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20  luded in.    ** 
256d0 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  the afpLockingCo
256e0 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ntext..    */.  
256f0 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
25700 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70  ext *pCtx;.    p
25710 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
25720 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c  ext = pCtx = sql
25730 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
25740 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20  eof(*pCtx) );.  
25750 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b    if( pCtx==0 ){
25760 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
25770 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
25780 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42  lse{.      /* NB
25790 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73  : zFilename exis
257a0 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76  ts and remains v
257b0 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66  alid until the f
257c0 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20  ile is closed.  
257d0 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67      ** according
257e0 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20   to requirement 
257f0 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64  F11141.  So we d
25800 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61  o not need to ma
25810 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ke a.      ** co
25820 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61  py of the filena
25830 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74  me. */.      pCt
25840 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c  x->dbPath = zFil
25850 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74  ename;.      pCt
25860 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b  x->reserved = 0;
25870 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65  .      srandomde
25880 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45  v();.      unixE
25890 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
258a0 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
258b0 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
258c0 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
258d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
258e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
258f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
25900 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
25910 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73  );.        robus
25920 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
25930 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
25940 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
25950 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65    }.      unixLe
25960 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20  aveMutex();     
25970 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65     .    }.  }.#e
25980 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28  ndif..  else if(
25990 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
259a0 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  = &dotlockIoMeth
259b0 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  ods ){.    /* Do
259c0 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73  tfile locking us
259d0 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
259e0 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
259f0 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
25a00 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63     ** the dotloc
25a10 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
25a20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
25a30 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20   *zLockFile;.   
25a40 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a   int nFilename;.
25a50 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20      nFilename = 
25a60 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c  (int)strlen(zFil
25a70 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20  ename) + 6;.    
25a80 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
25a90 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
25aa0 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  oc(nFilename);. 
25ab0 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65     if( zLockFile
25ac0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
25ad0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
25ae0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25af0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
25b00 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f  f(nFilename, zLo
25b10 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54  ckFile, "%s" DOT
25b20 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69  LOCK_SUFFIX, zFi
25b30 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  lename);.    }. 
25b40 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
25b50 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46  Context = zLockF
25b60 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53  ile;.  }..#if OS
25b70 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20  _VXWORKS.  else 
25b80 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
25b90 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f  e == &semIoMetho
25ba0 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d  ds ){.    /* Nam
25bb0 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
25bc0 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
25bd0 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
25be0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
25bf0 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
25c00 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   semLockingConte
25c10 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  xt.    */.    un
25c20 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
25c30 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
25c40 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
25c50 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
25c60 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
25c70 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70  _OK) && (pNew->p
25c80 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c  Inode->pSem==NUL
25c90 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  L) ){.      char
25ca0 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65   *zSemName = pNe
25cb0 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e  w->pInode->aSemN
25cc0 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ame;.      int n
25cd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
25ce0 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
25cf0 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c  HNAME, zSemName,
25d00 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20   "/%s.sem",.    
25d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43     pNew->pId->zC
25d30 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
25d40 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a       for( n=1; z
25d50 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20  SemName[n]; n++ 
25d60 29 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53  ).        if( zS
25d70 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29  emName[n]=='/' )
25d80 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27   zSemName[n] = '
25d90 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  _';.      pNew->
25da0 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73  pInode->pSem = s
25db0 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65  em_open(zSemName
25dc0 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c  , O_CREAT, 0666,
25dd0 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
25de0 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
25df0 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20  m == SEM_FAILED 
25e00 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
25e10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
25e20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f        pNew->pIno
25e30 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20  de->aSemName[0] 
25e40 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a  = '\0';.      }.
25e50 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
25e60 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
25e70 23 65 6e 64 69 66 0a 20 20 0a 20 20 70 4e 65 77  #endif.  .  pNew
25e80 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
25e90 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
25ea0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25eb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68  _OK ){.    if( h
25ec0 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f  >=0 ) robust_clo
25ed0 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
25ee0 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d  NE__);.    h = -
25ef0 31 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46  1;.    unlink(zF
25f00 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73  ilename);.    is
25f10 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a  Delete = 0;.  }.
25f20 20 20 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65    pNew->isDelete
25f30 20 3d 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e   = isDelete;.#en
25f40 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51  dif.  if( rc!=SQ
25f50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
25f60 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20 72 6f  f( dirfd>=0 ) ro
25f70 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
25f80 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f   dirfd, __LINE__
25f90 29 3b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20  );.    if( h>=0 
25fa0 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70  ) robust_close(p
25fb0 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
25fc0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25fd0 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
25fe0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  pLockingStyle;. 
25ff0 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b     OpenCounter(+
26000 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
26010 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
26020 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
26030 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65  ptor to the dire
26040 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
26050 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e   file zFilename.
26060 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
26070 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74  l, *pFd is set t
26080 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c  o the opened fil
26090 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  e descriptor and
260a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
260b0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
260c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65   error occurs, e
260d0 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ither SQLITE_NOM
260e0 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  EM.** or SQLITE_
260f0 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75  CANTOPEN is retu
26100 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73  rned and *pFd is
26110 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66   set to an undef
26120 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  ined.** value..*
26130 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
26140 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
26150 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
26160 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f  ponsible for clo
26170 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65  sing.** the file
26180 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64   descriptor *pFd
26190 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a   using close()..
261a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
261b0 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73  enDirectory(cons
261c0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
261d0 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20  e, int *pFd){.  
261e0 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64  int ii;.  int fd
261f0 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44   = -1;.  char zD
26200 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  irname[MAX_PATHN
26210 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74  AME+1];..  sqlit
26220 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
26230 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61  PATHNAME, zDirna
26240 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e  me, "%s", zFilen
26250 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28  ame);.  for(ii=(
26260 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e  int)strlen(zDirn
26270 61 6d 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44  ame); ii>1 && zD
26280 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b  irname[ii]!='/';
26290 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69   ii--);.  if( ii
262a0 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61  >0 ){.    zDirna
262b0 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20  me[ii] = '\0';. 
262c0 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
262d0 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f  pen(zDirname, O_
262e0 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c  RDONLY|O_BINARY,
262f0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e   0);.    if( fd>
26300 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 46 44 5f  =0 ){.#ifdef FD_
26310 43 4c 4f 45 58 45 43 0a 20 20 20 20 20 20 6f 73  CLOEXEC.      os
26320 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46  Fcntl(fd, F_SETF
26330 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46  D, osFcntl(fd, F
26340 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f  _GETFD, 0) | FD_
26350 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66  CLOEXEC);.#endif
26360 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
26370 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73  "OPENDIR %-3d %s
26380 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d  \n", fd, zDirnam
26390 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e));.    }.  }. 
263a0 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65   *pFd = fd;.  re
263b0 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49  turn (fd>=0?SQLI
263c0 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72 72  TE_OK:unixLogErr
263d0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
263e0 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c  EN_BKPT, "open",
263f0 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a   zDirname));.}..
26400 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
26410 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63   name of a direc
26420 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f  tory in which to
26430 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66   put temporary f
26440 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73  iles..** If no s
26450 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72  uitable temporar
26460 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79  y file directory
26470 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72   can be found, r
26480 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  eturn NULL..*/.s
26490 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
264a0 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69   *unixTempFileDi
264b0 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  r(void){.  stati
264c0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
264d0 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Dirs[] = {.     
264e0 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20  0,.     0,.     
264f0 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/var/tmp",.    
26500 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20   "/usr/tmp",.   
26510 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30    "/tmp",.     0
26520 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
26530 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20  terminator */.  
26540 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  };.  unsigned in
26550 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
26560 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20  at buf;.  const 
26570 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a  char *zDir = 0;.
26580 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73  .  azDirs[0] = s
26590 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
265a0 63 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a  ctory;.  if( !az
265b0 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73  Dirs[1] ) azDirs
265c0 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d  [1] = getenv("TM
265d0 50 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d  PDIR");.  for(i=
265e0 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69  0; i<sizeof(azDi
265f0 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72  rs)/sizeof(azDir
26600 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69  s[0]); zDir=azDi
26610 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66  rs[i++]){.    if
26620 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74  ( zDir==0 ) cont
26630 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73  inue;.    if( os
26640 53 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29  Stat(zDir, &buf)
26650 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
26660 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75   if( !S_ISDIR(bu
26670 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e  f.st_mode) ) con
26680 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f  tinue;.    if( o
26690 73 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37  sAccess(zDir, 07
266a0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
266b0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
266c0 65 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f  eturn zDir;.}../
266d0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
266e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
266f0 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66  e in zBuf.  zBuf
26700 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
26710 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  ed.** by the cal
26720 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64  ling process and
26730 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f   must be big eno
26740 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c  ugh to hold at l
26750 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78  east.** pVfs->mx
26760 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a  Pathname bytes..
26770 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
26780 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  ixGetTempname(in
26790 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
267a0 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  uf){.  static co
267b0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
267c0 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20  r zChars[] =.   
267d0 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
267e0 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20  opqrstuvwxyz".  
267f0 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
26800 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20  NOPQRSTUVWXYZ". 
26810 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b     "0123456789";
26820 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
26830 69 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68  i, j;.  const ch
26840 61 72 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20  ar *zDir;..  /* 
26850 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
26860 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
26870 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
26880 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
26890 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
268a0 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
268b0 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
268c0 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
268d0 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
268e0 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20  tion failing. . 
268f0 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
26900 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
26910 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20  LITE_IOERR );.. 
26920 20 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70   zDir = unixTemp
26930 46 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28  FileDir();.  if(
26940 20 7a 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20   zDir==0 ) zDir 
26950 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65  = ".";..  /* Che
26960 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70  ck that the outp
26970 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72  ut buffer is lar
26980 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68  ge enough for th
26990 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
269a0 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20   .  ** name. If 
269b0 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72  it is not, retur
269c0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
269d0 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c    */.  if( (strl
269e0 65 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65  en(zDir) + strle
269f0 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  n(SQLITE_TEMP_FI
26a00 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29  LE_PREFIX) + 17)
26a10 20 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66   >= (size_t)nBuf
26a20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
26a30 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
26a40 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69  ..  do{.    sqli
26a50 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
26a60 66 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f  f-17, zBuf, "%s/
26a70 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  "SQLITE_TEMP_FIL
26a80 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b  E_PREFIX, zDir);
26a90 0a 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74  .    j = (int)st
26aa0 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20  rlen(zBuf);.    
26ab0 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
26ac0 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29  ss(15, &zBuf[j])
26ad0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
26ae0 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  <15; i++, j++){.
26af0 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20        zBuf[j] = 
26b00 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28  (char)zChars[ ((
26b10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42  unsigned char)zB
26b20 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a  uf[j])%(sizeof(z
26b30 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20  Chars)-1) ];.   
26b40 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d   }.    zBuf[j] =
26b50 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73   0;.  }while( os
26b60 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d  Access(zBuf,0)==
26b70 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
26b80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
26b90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
26ba0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
26bb0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
26bc0 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20  )./*.** Routine 
26bd0 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75  to transform a u
26be0 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70  nixFile into a p
26bf0 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69  roxy-locking uni
26c00 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d  xFile..** Implem
26c10 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  entation in the 
26c20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73  proxy-lock divis
26c30 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79  ion, but used by
26c40 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69   unixOpen().** i
26c50 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  f SQLITE_PREFER_
26c60 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73  PROXY_LOCKING is
26c70 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61   defined..*/.sta
26c80 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61  tic int proxyTra
26c90 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75  nsformUnixFile(u
26ca0 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20  nixFile*, const 
26cb0 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  char*);.#endif..
26cc0 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
26cd0 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
26ce0 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20  descriptor that 
26cf0 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  was opened on th
26d00 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
26d10 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
26d20 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75  al or master-jou
26d30 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74  rnal file) ident
26d40 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d  ified by pathnam
26d50 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20  e.** zPath with 
26d60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20  SQLITE_OPEN_XXX 
26d70 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74  flags matching t
26d80 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74  hose passed as t
26d90 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
26da0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
26db0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75  nction..**.** Su
26dc0 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  ch a file descri
26dd0 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69  ptor may exist i
26de0 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  f a database con
26df0 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73  nection was clos
26e00 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73  ed.** but the as
26e10 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65  sociated file de
26e20 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e  scriptor could n
26e30 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63  ot be closed bec
26e40 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  ause some.** oth
26e50 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
26e60 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  or open on the s
26e70 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64  ame file is hold
26e80 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e  ing a file-lock.
26e90 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d  .** Refer to com
26ea0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69  ments in the uni
26eb0 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f  xClose() functio
26ec0 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68  n and the length
26ed0 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73  y comment.** des
26ee0 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41  cribing "Posix A
26ef0 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22  dvisory Locking"
26f00 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
26f10 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a   this file for .
26f20 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69  ** further detai
26f30 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74  ls. Also, ticket
26f40 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66   #4018..**.** If
26f50 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65   a suitable file
26f60 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66   descriptor is f
26f70 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73  ound, then it is
26f80 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
26f90 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65  .** such file de
26fa0 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61  scriptor is loca
26fb0 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72  ted, -1 is retur
26fc0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55  ned..*/.static U
26fd0 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e  nixUnusedFd *fin
26fe0 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73  dReusableFd(cons
26ff0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69  t char *zPath, i
27000 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69  nt flags){.  Uni
27010 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
27020 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f  ed = 0;..  /* Do
27030 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20   not search for 
27040 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
27050 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77  escriptor on vxw
27060 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73  orks. Not becaus
27070 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77  e.  ** vxworks w
27080 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74  ould not benefit
27090 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65   from the change
270a0 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72   (it might, we'r
270b0 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a  e not sure),.  *
270c0 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f  * but because no
270d0 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20   way to test it 
270e0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61  is currently ava
270f0 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65  ilable. It is be
27100 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74  tter .  ** not t
27110 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20  o risk breaking 
27120 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20  vxworks support 
27130 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20  for the sake of 
27140 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20  such an obscure 
27150 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20  .  ** feature.  
27160 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52  */.#if !OS_VXWOR
27170 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  KS.  struct stat
27180 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
27190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
271a0 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63  ults of stat() c
271b0 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73  all */..  /* A s
271c0 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66  tat() call may f
271d0 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20  ail for various 
271e0 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73  reasons. If this
271f0 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a   happens, it is.
27200 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74    ** almost cert
27210 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e  ain that an open
27220 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73  () call on the s
27230 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c  ame path will al
27240 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f  so fail..  ** Fo
27250 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69  r this reason, i
27260 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
27270 73 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20  s in the stat() 
27280 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73  call here, it is
27290 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e  .  ** ignored an
272a0 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  d -1 is returned
272b0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
272c0 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20  l try to open a 
272d0 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65  new file.  ** de
272e0 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
272f0 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c  same path, fail,
27300 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65   and return an e
27310 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a  rror to SQLite..
27320 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69    **.  ** Even i
27330 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  f a subsequent o
27340 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20  pen() call does 
27350 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e  succeed, the con
27360 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a  sequences of.  *
27370 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20  * not searching 
27380 66 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65 20  for a resusable 
27390 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
273a0 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a  are not dire.  *
273b0 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 61 74 28  /.  if( 0==stat(
273c0 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29  zPath, &sStat) )
273d0 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49  {.    unixInodeI
273e0 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20  nfo *pInode;..  
273f0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
27400 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d  ();.    pInode =
27410 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
27420 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26  while( pInode &&
27430 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64   (pInode->fileId
27440 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64  .dev!=sStat.st_d
27450 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ev.             
27460 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64          || pInod
27470 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73  e->fileId.ino!=s
27480 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a  Stat.st_ino) ){.
27490 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20         pInode = 
274a0 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
274b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e     }.    if( pIn
274c0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69  ode ){.      Uni
274d0 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a  xUnusedFd **pp;.
274e0 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49        for(pp=&pI
274f0 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a  node->pUnused; *
27500 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61  pp && (*pp)->fla
27510 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28  gs!=flags; pp=&(
27520 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a  (*pp)->pNext));.
27530 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
27540 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *pp;.      if( p
27550 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
27560 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d    *pp = pUnused-
27570 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
27580 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
27590 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
275a0 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20  #endif    /* if 
275b0 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20  !OS_VXWORKS */. 
275c0 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b   return pUnused;
275d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
275e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
275f0 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20  d by unixOpen() 
27600 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
27610 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e   unix permission
27620 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e  s.** to create n
27630 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49  ew files with. I
27640 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
27650 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
27660 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
27670 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69   and a value sui
27680 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e  table for passin
27690 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61  g as the third a
276a0 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28  rgument to open(
276b0 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e  2) is.** written
276c0 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61   to *pMode. If a
276d0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
276e0 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
276f0 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
27700 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
27710 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20  value of *pMode 
27720 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e  is not modified.
27730 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
27740 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
27750 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
27760 69 6c 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79  ile, it is alway
27770 73 20 63 72 65 61 74 65 64 20 77 69 74 68 0a 2a  s created with.*
27780 2a 20 74 68 65 20 6f 63 74 61 6c 20 70 65 72 6d  * the octal perm
27790 69 73 73 69 6f 6e 73 20 30 36 30 30 20 28 72 65  issions 0600 (re
277a0 61 64 2f 77 72 69 74 61 62 6c 65 20 62 79 20 6f  ad/writable by o
277b0 77 6e 65 72 20 6f 6e 6c 79 29 2e 20 49 66 20 74  wner only). If t
277c0 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 20  he file.** is a 
277d0 64 61 74 61 62 61 73 65 20 6f 72 20 6d 61 73 74  database or mast
277e0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
277f0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 77   it is created w
27800 69 74 68 20 74 68 65 20 70 65 72 6d 69 73 73 69  ith the permissi
27810 6f 6e 73 20 0a 2a 2a 20 6d 61 73 6b 20 53 51 4c  ons .** mask SQL
27820 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
27830 5f 50 45 52 4d 49 53 53 49 4f 4e 53 2e 0a 2a 2a  _PERMISSIONS..**
27840 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  .** Finally, if 
27850 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
27860 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f  pened is a WAL o
27870 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61  r regular journa
27880 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a  l file, then .**
27890 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71   this function q
278a0 75 65 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d  ueries the file-
278b0 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70  system for the p
278c0 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68  ermissions on th
278d0 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  e .** correspond
278e0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
278f0 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64  e and sets *pMod
27900 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e  e to this value.
27910 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f   Whenever .** po
27920 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20  ssible, WAL and 
27930 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72  journal files ar
27940 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  e created using 
27950 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73  the same permiss
27960 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20  ions .** as the 
27970 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  associated datab
27980 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
27990 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  If the SQLITE_EN
279a0 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f  ABLE_8_3_NAMES o
279b0 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
279c0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72  , then the.** or
279d0 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  iginal filename 
279e0 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20  is unavailable. 
279f0 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69   But 8_3_NAMES i
27a00 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a  s only used for.
27a10 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74 65  ** FAT filesyste
27a20 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f  ms and permissio
27a30 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72  ns do not matter
27a40 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20   there, so just 
27a50 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75  use.** the defau
27a60 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a  lt permissions..
27a70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
27a80 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65  ndCreateFileMode
27a90 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
27aa0 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
27ab0 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66      /* Path of f
27ac0 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62  ile (possibly) b
27ad0 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a  eing created */.
27ae0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
27af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b00 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
27b10 64 20 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e  d as 4th argumen
27b20 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  t to xOpen() */.
27b30 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 20    mode_t *pMode 
27b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b50 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73    /* OUT: Permis
27b60 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69  sions to open fi
27b70 6c 65 20 77 69 74 68 20 2a 2f 0a 29 7b 0a 20 20  le with */.){.  
27b80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
27b90 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
27ba0 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
27bb0 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 53 51 4c  /.  *pMode = SQL
27bc0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
27bd0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20  _PERMISSIONS;.  
27be0 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c  if( flags & (SQL
27bf0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c  ITE_OPEN_WAL|SQL
27c00 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
27c10 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68  URNAL) ){.    ch
27c20 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e  ar zDb[MAX_PATHN
27c30 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44  AME+1];     /* D
27c40 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 74  atabase file pat
27c50 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62  h */.    int nDb
27c60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27c70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
27c80 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73 20   of valid bytes 
27c90 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74  in zDb */.    st
27ca0 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
27cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
27cc0 75 74 70 75 74 20 6f 66 20 73 74 61 74 28 29 20  utput of stat() 
27cd0 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
27ce0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74   */..    /* zPat
27cf0 68 20 69 73 20 61 20 70 61 74 68 20 74 6f 20 61  h is a path to a
27d00 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20   WAL or journal 
27d10 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  file. The follow
27d20 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65  ing block derive
27d30 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74  s.    ** the pat
27d40 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61  h to the associa
27d50 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
27d60 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68  e from zPath. Th
27d70 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73  is block handles
27d80 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  .    ** the foll
27d90 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e  owing naming con
27da0 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a  ventions:.    **
27db0 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
27dc0 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22   to db>-journal"
27dd0 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
27de0 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20   to db>-wal".   
27df0 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
27e00 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20  db>-journalNN". 
27e10 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
27e20 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20  o db>-walNN".   
27e30 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65   **.    ** where
27e40 20 4e 4e 20 69 73 20 61 20 34 20 64 69 67 69 74   NN is a 4 digit
27e50 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e   decimal number.
27e60 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73   The NN naming s
27e70 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20 20  chemes are .    
27e80 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 74  ** used by the t
27e90 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20  est_multiplex.c 
27ea0 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  module..    */. 
27eb0 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33     nDb = sqlite3
27ec0 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20  Strlen30(zPath) 
27ed0 2d 20 31 3b 20 0a 20 20 20 20 77 68 69 6c 65 28  - 1; .    while(
27ee0 20 6e 44 62 3e 30 20 26 26 20 7a 50 61 74 68 5b   nDb>0 && zPath[
27ef0 6e 44 62 5d 21 3d 27 2d 27 20 29 20 6e 44 62 2d  nDb]!='-' ) nDb-
27f00 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d 3d  -;.    if( nDb==
27f10 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
27f20 45 5f 4f 4b 3b 0a 20 20 20 20 6d 65 6d 63 70 79  E_OK;.    memcpy
27f30 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62  (zDb, zPath, nDb
27f40 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20  );.    zDb[nDb] 
27f50 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28  = '\0';..    if(
27f60 20 30 3d 3d 73 74 61 74 28 7a 44 62 2c 20 26 73   0==stat(zDb, &s
27f70 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a  Stat) ){.      *
27f80 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74  pMode = sStat.st
27f90 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20  _mode & 0777;.  
27fa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
27fb0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
27fc0 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20  _FSTAT;.    }.  
27fd0 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
27fe0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
27ff0 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20  LETEONCLOSE ){. 
28000 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30     *pMode = 0600
28010 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28020 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
28030 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e   the file zPath.
28040 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73  .** .** Previous
28050 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f  ly, the SQLite O
28060 53 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72  S layer used thr
28070 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  ee functions in 
28080 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a  place of this.**
28090 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   one:.**.**     
280a0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
280b0 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20  dWrite();.**    
280c0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
280d0 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20  adOnly();.**    
280e0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
280f0 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a  clusive();.**.**
28100 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72   These calls cor
28110 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66  respond to the f
28120 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
28130 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a  tions of flags:.
28140 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72  **.**     ReadWr
28150 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45  ite() ->     (RE
28160 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
28170 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c  ).**     ReadOnl
28180 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41  y()  ->     (REA
28190 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f  DONLY) .**     O
281a0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d  penExclusive() -
281b0 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43  > (READWRITE | C
281c0 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56  REATE | EXCLUSIV
281d0 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64  E).**.** The old
281e0 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
281f0 20 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c   accepted a bool
28200 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22  ean argument - "
28210 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20  delFlag". If.** 
28220 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77  true, the file w
28230 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  as configured to
28240 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
28250 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  y deleted when t
28260 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c  he.** file handl
28270 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68  e closed. To ach
28280 69 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66  ieve the same ef
28290 66 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20  fect using this 
282a0 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63  new .** interfac
282b0 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54  e, add the DELET
282c0 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f  EONCLOSE flag to
282d0 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
282e0 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f   above for .** O
282f0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a  penExclusive()..
28300 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
28310 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  ixOpen(.  sqlite
28320 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
28330 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
28340 53 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73  S for which this
28350 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65   is the xOpen me
28360 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
28370 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
28380 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61         /* Pathna
28390 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65  me of file to be
283a0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c   opened */.  sql
283b0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
283c0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
283d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
283e0 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e   to be filled in
283f0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
28400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28410 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67     /* Input flag
28420 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  s to control the
28430 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e   opening */.  in
28440 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20  t *pOutFlags    
28450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
28460 74 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72  tput flags retur
28470 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f  ned to SQLite co
28480 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  re */.){.  unixF
28490 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69  ile *p = (unixFi
284a0 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e  le *)pFile;.  in
284b0 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20  t fd = -1;      
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
284d0 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
284e0 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e  returned by open
284f0 28 29 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  () */.  int dirf
28500 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  d = -1;         
28510 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74         /* Direct
28520 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
28530 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65  tor */.  int ope
28540 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  nFlags = 0;     
28550 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
28560 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e   to pass to open
28570 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  () */.  int eTyp
28580 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
28590 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
285a0 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
285b0 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20  /.  int noLock; 
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285d0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d     /* True to om
285e0 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  it locking primi
285f0 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tives */.  int r
28600 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
28610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
28620 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64  ction Return Cod
28630 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78  e */..  int isEx
28640 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67  clusive  = (flag
28650 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
28660 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e  EXCLUSIVE);.  in
28670 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d  t isDelete     =
28680 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
28690 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
286a0 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72  OSE);.  int isCr
286b0 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  eate     = (flag
286c0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
286d0 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69  CREATE);.  int i
286e0 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66  sReadonly   = (f
286f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
28700 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
28710 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20  int isReadWrite 
28720 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
28730 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
28740 45 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  E);.#if SQLITE_E
28750 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
28760 59 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f  YLE.  int isAuto
28770 50 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20  Proxy  = (flags 
28780 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55  & SQLITE_OPEN_AU
28790 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66  TOPROXY);.#endif
287a0 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69  ..  /* If creati
287b0 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d  ng a master or m
287c0 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  ain-file journal
287d0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
287e0 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  will open.  ** a
287f0 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
28800 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   on the director
28810 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74  y too. The first
28820 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29   time unixSync()
28830 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  .  ** is called 
28840 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69  the directory fi
28850 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
28860 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20  ll be fsync()ed 
28870 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20  and close()d..  
28880 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44  */.  int isOpenD
28890 69 72 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72  irectory = (isCr
288a0 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20  eate && (.      
288b0 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f    eType==SQLITE_
288c0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
288d0 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
288e0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
288f0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  MAIN_JOURNAL .  
28900 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
28910 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
28920 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75  );..  /* If argu
28930 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20  ment zPath is a 
28940 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68  NULL pointer, th
28950 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  is function is r
28960 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a  equired to open.
28970 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79    ** a temporary
28980 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20   file. Use this 
28990 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20  buffer to store 
289a0 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  the file name in
289b0 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54  ..  */.  char zT
289c0 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  mpname[MAX_PATHN
289d0 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20  AME+1];.  const 
289e0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50  char *zName = zP
289f0 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ath;..  /* Check
28a00 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
28a10 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72  tatements are tr
28a20 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ue: .  **.  **  
28a30 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65   (a) Exactly one
28a40 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54   of the READWRIT
28a50 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66  E and READONLY f
28a60 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74  lags must be set
28a70 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62  , and .  **   (b
28a80 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73  ) if CREATE is s
28a90 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49  et, then READWRI
28aa0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
28ab0 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  set, and.  **   
28ac0 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45  (c) if EXCLUSIVE
28ad0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
28ae0 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
28af0 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64  e set..  **   (d
28b00 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f  ) if DELETEONCLO
28b10 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  SE is set, then 
28b20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
28b30 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   be set..  */.  
28b40 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e  assert((isReadon
28b50 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  ly==0 || isReadW
28b60 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52  rite==0) && (isR
28b70 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65  eadWrite || isRe
28b80 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65  adonly));.  asse
28b90 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c  rt(isCreate==0 |
28ba0 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a  | isReadWrite);.
28bb0 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75    assert(isExclu
28bc0 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  sive==0 || isCre
28bd0 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ate);.  assert(i
28be0 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73  sDelete==0 || is
28bf0 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54  Create);..  /* T
28c00 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e  he main DB, main
28c10 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69   journal, WAL fi
28c20 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f  le and master jo
28c30 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20  urnal are never 
28c40 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
28c50 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72  lly deleted. Nor
28c60 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74   are they ever t
28c70 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
28c80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21   */.  assert( (!
28c90 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
28ca0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
28cb0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
28cc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
28cd0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
28ce0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
28cf0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
28d00 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
28d10 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
28d20 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
28d30 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
28d40 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  STER_JOURNAL );.
28d50 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
28d60 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
28d70 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
28d80 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f  OPEN_WAL );..  /
28d90 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
28da0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
28db0 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
28dc0 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
28dd0 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
28de0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
28df0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
28e00 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
28e10 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a  E_OPEN_TEMP_DB .
28e20 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
28e30 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
28e40 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
28e50 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
28e60 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  TEMP_JOURNAL .  
28e70 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
28e80 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
28e90 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
28ea0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
28eb0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
28ec0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
28ed0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
28ee0 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65  IENT_DB || eType
28ef0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
28f00 4c 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  L.  );..  memset
28f10 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  (p, 0, sizeof(un
28f20 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28  ixFile));..  if(
28f30 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
28f40 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20  PEN_MAIN_DB ){. 
28f50 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20     UnixUnusedFd 
28f60 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55  *pUnused;.    pU
28f70 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73  nused = findReus
28f80 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c  ableFd(zName, fl
28f90 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55  ags);.    if( pU
28fa0 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66  nused ){.      f
28fb0 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b  d = pUnused->fd;
28fc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28fd0 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69    pUnused = sqli
28fe0 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
28ff0 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20  f(*pUnused));.  
29000 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64      if( !pUnused
29010 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
29020 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
29030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29040 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20     p->pUnused = 
29050 70 55 6e 75 73 65 64 3b 0a 20 20 7d 65 6c 73 65  pUnused;.  }else
29060 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20   if( !zName ){. 
29070 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
29080 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65  s NULL, the uppe
29090 72 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65  r layer is reque
290a0 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c  sting a temp fil
290b0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
290c0 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73  (isDelete && !is
290d0 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 29 3b 0a  OpenDirectory);.
290e0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74      rc = unixGet
290f0 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54  Tempname(MAX_PAT
29100 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d  HNAME+1, zTmpnam
29110 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
29120 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29130 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
29140 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20    }.    zName = 
29150 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20  zTmpname;.  }.. 
29160 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
29170 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66  e value of the f
29180 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 70  lags parameter p
29190 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66  assed to POSIX f
291a0 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65  unction.  ** ope
291b0 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20  n(). These must 
291c0 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76  be calculated ev
291d0 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20  en if open() is 
291e0 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20  not called, as. 
291f0 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20   ** they may be 
29200 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
29210 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  f the file handl
29220 65 20 61 6e 64 20 75 73 65 64 20 62 79 20 74 68  e and used by th
29230 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66  e .  ** 'conch f
29240 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e  ile' locking fun
29250 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e  ctions later on.
29260 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61    */.  if( isRea
29270 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61  donly )  openFla
29280 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  gs |= O_RDONLY;.
29290 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
292a0 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  e ) openFlags |=
292b0 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69   O_RDWR;.  if( i
292c0 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 70 65  sCreate )    ope
292d0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41  nFlags |= O_CREA
292e0 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75  T;.  if( isExclu
292f0 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  sive ) openFlags
29300 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f   |= (O_EXCL|O_NO
29310 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46  FOLLOW);.  openF
29320 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45  lags |= (O_LARGE
29330 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a  FILE|O_BINARY);.
29340 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
29350 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f     mode_t openMo
29360 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
29370 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20   /* Permissions 
29380 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77  to create file w
29390 69 74 68 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ith */.    rc = 
293a0 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f  findCreateFileMo
293b0 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c  de(zName, flags,
293c0 20 26 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20   &openMode);.   
293d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
293e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
293f0 72 74 28 20 21 70 2d 3e 70 55 6e 75 73 65 64 20  rt( !p->pUnused 
29400 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29410 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
29420 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65  PEN_WAL || eType
29430 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
29440 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
29450 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
29460 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f     }.    fd = ro
29470 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c  bust_open(zName,
29480 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
29490 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  Mode);.    OSTRA
294a0 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33  CE(("OPENX   %-3
294b0 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c  d %s 0%o\n", fd,
294c0 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67   zName, openFlag
294d0 73 29 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  s));.    if( fd<
294e0 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44  0 && errno!=EISD
294f0 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74  IR && isReadWrit
29500 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76  e && !isExclusiv
29510 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61  e ){.      /* Fa
29520 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  iled to open the
29530 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77   file for read/w
29540 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79  rite access. Try
29550 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20   read-only. */. 
29560 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28       flags &= ~(
29570 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
29580 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
29590 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20  N_CREATE);.     
295a0 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28   openFlags &= ~(
295b0 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b  O_RDWR|O_CREAT);
295c0 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
295d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
295e0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ONLY;.      open
295f0 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
29600 59 3b 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f  Y;.      isReado
29610 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  nly = 1;.      f
29620 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
29630 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
29640 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20  , openMode);.   
29650 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20   }.    if( fd<0 
29660 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
29670 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
29680 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
29690 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b   "open", zName);
296a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
296b0 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d  _finished;.    }
296c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66  .  }.  assert( f
296d0 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f  d>=0 );.  if( pO
296e0 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a  utFlags ){.    *
296f0 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67  pOutFlags = flag
29700 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  s;.  }..  if( p-
29710 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  >pUnused ){.    
29720 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d  p->pUnused->fd =
29730 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75   fd;.    p->pUnu
29740 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61  sed->flags = fla
29750 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  gs;.  }..  if( i
29760 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f  sDelete ){.#if O
29770 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50  S_VXWORKS.    zP
29780 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c  ath = zName;.#el
29790 73 65 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e  se.    unlink(zN
297a0 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ame);.#endif.  }
297b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
297c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
297d0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e  .  else{.    p->
297e0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e  openFlags = open
297f0 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69  Flags;.  }.#endi
29800 66 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 44  f..  if( isOpenD
29810 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
29820 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f  rc = openDirecto
29830 72 79 28 7a 50 61 74 68 2c 20 26 64 69 72 66 64  ry(zPath, &dirfd
29840 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
29850 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29860 20 20 2f 2a 20 49 74 20 69 73 20 73 61 66 65 20    /* It is safe 
29870 74 6f 20 63 6c 6f 73 65 20 66 64 20 61 74 20 74  to close fd at t
29880 68 69 73 20 70 6f 69 6e 74 2c 20 62 65 63 61 75  his point, becau
29890 73 65 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  se it is guarant
298a0 65 65 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a  eed not.      **
298b0 20 74 6f 20 62 65 20 6f 70 65 6e 20 6f 6e 20 61   to be open on a
298c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
298d0 49 66 20 69 74 20 77 65 72 65 20 6f 70 65 6e 20  If it were open 
298e0 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  on a database fi
298f0 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  le,.      ** it 
29900 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66  would not be saf
29910 65 20 74 6f 20 63 6c 6f 73 65 20 61 73 20 74 68  e to close as th
29920 69 73 20 77 6f 75 6c 64 20 72 65 6c 65 61 73 65  is would release
29930 20 61 6e 79 20 6c 6f 63 6b 73 20 68 65 6c 64 0a   any locks held.
29940 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
29950 66 69 6c 65 20 62 79 20 74 68 69 73 20 70 72 6f  file by this pro
29960 63 65 73 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cess.  */.      
29970 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53  assert( eType!=S
29980 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
29990 44 42 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75  DB );.      robu
299a0 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20  st_close(p, fd, 
299b0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
299c0 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
299d0 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  hed;.    }.  }..
299e0 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45  #ifdef FD_CLOEXE
299f0 43 0a 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  C.  osFcntl(fd, 
29a00 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c  F_SETFD, osFcntl
29a10 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29  (fd, F_GETFD, 0)
29a20 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a   | FD_CLOEXEC);.
29a30 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b  #endif..  noLock
29a40 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45   = eType!=SQLITE
29a50 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a  _OPEN_MAIN_DB;..
29a60 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f    .#if defined(_
29a70 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c  _APPLE__) || SQL
29a80 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
29a90 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63  NG_STYLE.  struc
29aa0 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
29ab0 0a 20 20 69 66 28 20 66 73 74 61 74 66 73 28 66  .  if( fstatfs(f
29ac0 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  d, &fsInfo) == -
29ad0 31 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  1 ){.    ((unixF
29ae0 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73  ile*)pFile)->las
29af0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
29b00 20 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30      if( dirfd>=0
29b10 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
29b20 70 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45  p, dirfd, __LINE
29b30 5f 5f 29 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f  __);.    robust_
29b40 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c  close(p, fd, __L
29b50 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75  INE__);.    retu
29b60 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
29b70 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66  ACCESS;.  }.  if
29b80 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22   (0 == strncmp("
29b90 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66  msdos", fsInfo.f
29ba0 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29  _fstypename, 5))
29bb0 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c   {.    ((unixFil
29bc0 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61  e*)pFile)->fsFla
29bd0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46  gs |= SQLITE_FSF
29be0 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20  LAGS_IS_MSDOS;. 
29bf0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69 66   }.#endif.  .#if
29c00 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
29c10 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66  OCKING_STYLE.#if
29c20 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
29c30 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69  ROXY_LOCKING.  i
29c40 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a  sAutoProxy = 1;.
29c50 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41  #endif.  if( isA
29c60 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61  utoProxy && (zPa
29c70 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e  th!=NULL) && (!n
29c80 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e  oLock) && pVfs->
29c90 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61  xOpen ){.    cha
29ca0 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65  r *envforce = ge
29cb0 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52  tenv("SQLITE_FOR
29cc0 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
29cd0 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50  ");.    int useP
29ce0 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  roxy = 0;..    /
29cf0 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  * SQLITE_FORCE_P
29d00 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20  ROXY_LOCKING==1 
29d10 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61  means force alwa
29d20 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20  ys use proxy, 0 
29d30 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65  means .    ** ne
29d40 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e  ver use proxy, N
29d50 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72  ULL means use pr
29d60 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61  oxy for non-loca
29d70 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a  l files only.  *
29d80 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72  /.    if( envfor
29d90 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ce!=NULL ){.    
29da0 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f    useProxy = ato
29db0 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20  i(envforce)>0;. 
29dc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29dd0 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
29de0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
29df0 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66  statfs(zPath, &f
29e00 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a  sInfo) == -1 ){.
29e10 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68          /* In th
29e20 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28  eory, the close(
29e30 66 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d  fd) call is sub-
29e40 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20  optimal. If the 
29e50 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20  file opened.    
29e60 20 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69      ** with fd i
29e70 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
29e80 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
29e90 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
29ea0 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  ns open.        
29eb0 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20  ** on that file 
29ec0 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
29ed0 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73  ly holding advis
29ee0 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c  ory locks on it,
29ef0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
29f00 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f   the call to clo
29f10 73 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c  se() will cancel
29f20 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e   those locks. In
29f30 20 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20   practice,.     
29f40 20 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75     ** we're assu
29f50 6d 69 6e 67 20 74 68 61 74 20 73 74 61 74 66 73  ming that statfs
29f60 28 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20  () doesn't fail 
29f70 76 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c  very often. At l
29f80 65 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  east.        ** 
29f90 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20  not while other 
29fa0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
29fb0 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73   opened by the s
29fc0 61 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20  ame process on. 
29fd0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61         ** the sa
29fe0 6d 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b  me file are work
29ff0 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ing.  */.       
2a000 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20   p->lastErrno = 
2a010 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69  errno;.        i
2a020 66 28 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20  f( dirfd>=0 ){. 
2a030 20 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f           robust_
2a040 63 6c 6f 73 65 28 70 2c 20 64 69 72 66 64 2c 20  close(p, dirfd, 
2a050 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
2a060 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 6f 62     }.        rob
2a070 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c  ust_close(p, fd,
2a080 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2a090 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a0a0 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20  IOERR_ACCESS;.  
2a0b0 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
2a0c0 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20  finished;.      
2a0d0 7d 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79  }.      useProxy
2a0e0 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c   = !(fsInfo.f_fl
2a0f0 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a  ags&MNT_LOCAL);.
2a100 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73      }.    if( us
2a110 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20  eProxy ){.      
2a120 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
2a130 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69  ile(pVfs, fd, di
2a140 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74  rfd, pFile, zPat
2a150 68 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20  h, noLock,.     
2a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a170 20 20 20 20 20 69 73 44 65 6c 65 74 65 2c 20 69       isDelete, i
2a180 73 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20  sReadonly);.    
2a190 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a1a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2a1b0 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  c = proxyTransfo
2a1c0 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78  rmUnixFile((unix
2a1d0 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61  File*)pFile, ":a
2a1e0 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20  uto:");.        
2a1f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a200 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  K ){.          /
2a210 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20  * Use unixClose 
2a220 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  to clean up the 
2a230 72 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20  resources added 
2a240 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  in fillInUnixFil
2a250 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
2a260 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68  and clear all th
2a270 65 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65  e structure's re
2a280 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69  ferences.  Speci
2a290 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20  fically, .      
2a2a0 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d      ** pFile->pM
2a2b0 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e  ethods will be N
2a2c0 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73  ULL so sqlite3Os
2a2d0 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20  Close will be a 
2a2e0 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20  no-op .         
2a2f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e   */.          un
2a300 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a  ixClose(pFile);.
2a310 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2a320 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2a330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
2a340 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
2a350 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2a360 66 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c  f.  .  rc = fill
2a370 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c  InUnixFile(pVfs,
2a380 20 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c   fd, dirfd, pFil
2a390 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b  e, zPath, noLock
2a3a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2a3b0 20 20 20 20 20 20 20 20 69 73 44 65 6c 65 74 65          isDelete
2a3c0 2c 20 69 73 52 65 61 64 6f 6e 6c 79 29 3b 0a 6f  , isReadonly);.o
2a3d0 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20  pen_finished:.  
2a3e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a3f0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
2a400 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64  _free(p->pUnused
2a410 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2a420 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  rc;.}.../*.** De
2a430 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74  lete the file at
2a440 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64   zPath. If the d
2a450 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20  irSync argument 
2a460 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  is true, fsync()
2a470 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
2a480 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67  y after deleting
2a490 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
2a4a0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c  atic int unixDel
2a4b0 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ete(.  sqlite3_v
2a4c0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20  fs *NotUsed,    
2a4d0 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69   /* VFS containi
2a4e0 6e 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78  ng this as the x
2a4f0 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f  Delete method */
2a500 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2a510 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20  Path,        /* 
2a520 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
2a530 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  be deleted */.  
2a540 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20  int dirSync     
2a550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2a560 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69  true, fsync() di
2a570 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
2a580 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29  leting file */.)
2a590 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2a5a0 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44  ITE_OK;.  UNUSED
2a5b0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2a5c0 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ed);.  SimulateI
2a5d0 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
2a5e0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
2a5f0 45 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b  E);.  if( unlink
2a600 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 26 26  (zPath)==(-1) &&
2a610 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29   errno!=ENOENT )
2a620 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69  {.    return uni
2a630 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
2a640 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22  _IOERR_DELETE, "
2a650 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b  unlink", zPath);
2a660 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
2a670 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
2a680 59 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79 6e  YNC.  if( dirSyn
2a690 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b  c ){.    int fd;
2a6a0 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69  .    rc = openDi
2a6b0 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26  rectory(zPath, &
2a6c0 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  fd);.    if( rc=
2a6d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69  =SQLITE_OK ){.#i
2a6e0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
2a6f0 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29     if( fsync(fd)
2a700 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20  ==-1 ).#else.   
2a710 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29     if( fsync(fd)
2a720 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   ).#endif.      
2a730 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
2a740 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
2a750 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
2a760 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61  NC, "fsync", zPa
2a770 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
2a780 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
2a790 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  0, fd, __LINE__)
2a7a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2a7b0 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  if.  return rc;.
2a7c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68  }../*.** Test th
2a7d0 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 6f  e existance of o
2a7e0 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  r access permiss
2a7f0 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61  ions of file zPa
2a800 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20  th. The.** test 
2a810 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64  performed depend
2a820 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  s on the value o
2a830 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  f flags:.**.**  
2a840 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
2a850 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20  _EXISTS: Return 
2a860 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78  1 if the file ex
2a870 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ists.**     SQLI
2a880 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
2a890 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66  ITE: Return 1 if
2a8a0 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
2a8b0 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a  d and writable..
2a8c0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
2a8d0 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52  CESS_READONLY: R
2a8e0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
2a8f0 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e  ile is readable.
2a900 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
2a910 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
2a920 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63  atic int unixAcc
2a930 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ess(.  sqlite3_v
2a940 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f  fs *NotUsed,   /
2a950 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69  * The VFS contai
2a960 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63 65 73  ning this xAcces
2a970 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  s method */.  co
2a980 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
2a990 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66        /* Path of
2a9a0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61   the file to exa
2a9b0 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  mine */.  int fl
2a9c0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2a9d0 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20    /* What do we 
2a9e0 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62  want to learn ab
2a9f0 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20 66 69  out the zPath fi
2aa00 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  le? */.  int *pR
2aa10 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  esOut           
2aa20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74   /* Write result
2aa30 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f   boolean here */
2aa40 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20  .){.  int amode 
2aa50 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  = 0;.  UNUSED_PA
2aa60 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2aa70 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
2aa80 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
2aa90 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
2aaa0 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c   );.  switch( fl
2aab0 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ags ){.    case 
2aac0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2aad0 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64  ISTS:.      amod
2aae0 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20  e = F_OK;.      
2aaf0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2ab00 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
2ab10 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61  ADWRITE:.      a
2ab20 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b  mode = W_OK|R_OK
2ab30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2ab40 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
2ab50 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20  CCESS_READ:.    
2ab60 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a    amode = R_OK;.
2ab70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
2ab80 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
2ab90 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69   assert(!"Invali
2aba0 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  d flags argument
2abb0 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f  ");.  }.  *pResO
2abc0 75 74 20 3d 20 28 6f 73 41 63 63 65 73 73 28 7a  ut = (osAccess(z
2abd0 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29  Path, amode)==0)
2abe0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 53  ;.  if( flags==S
2abf0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
2ac00 53 54 53 20 26 26 20 2a 70 52 65 73 4f 75 74 20  STS && *pResOut 
2ac10 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
2ac20 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28 20  at buf;.    if( 
2ac30 30 3d 3d 73 74 61 74 28 7a 50 61 74 68 2c 20 26  0==stat(zPath, &
2ac40 62 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73  buf) && buf.st_s
2ac50 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
2ac60 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20  *pResOut = 0;.  
2ac70 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2ac80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
2ac90 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c  /*.** Turn a rel
2aca0 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69  ative pathname i
2acb0 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e  nto a full pathn
2acc0 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76  ame. The relativ
2acd0 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f  e path.** is sto
2ace0 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72  red as a nul-ter
2acf0 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69  minated string i
2ad00 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
2ad10 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50  nted to by.** zP
2ad20 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74  ath. .**.** zOut
2ad30 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
2ad40 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
2ad50 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
2ad60 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a  thname bytes .**
2ad70 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20   (in this case, 
2ad80 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74  MAX_PATHNAME byt
2ad90 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61  es). The full-pa
2ada0 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  th is written to
2adb0 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20  .** this buffer 
2adc0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2add0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ade0 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  unixFullPathname
2adf0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2ae00 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
2ae10 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2ae20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
2ae30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2ae40 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  h,            /*
2ae50 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69   Possibly relati
2ae60 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f  ve input path */
2ae70 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20  .  int nOut,    
2ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae90 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70   /* Size of outp
2aea0 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74  ut buffer in byt
2aeb0 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f  es */.  char *zO
2aec0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
2aed0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2aee0 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20  buffer */.){..  
2aef0 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
2af00 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
2af10 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
2af20 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
2af30 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
2af40 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
2af50 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
2af60 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
2af70 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
2af80 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
2af90 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
2afa0 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f  ould fail if, fo
2afb0 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20  r example, the. 
2afc0 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b   ** current work
2afd0 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61  ing directory ha
2afe0 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
2aff0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
2b000 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
2b010 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
2b020 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d  .  assert( pVfs-
2b030 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58  >mxPathname==MAX
2b040 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55  _PATHNAME );.  U
2b050 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2b060 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e  pVfs);..  zOut[n
2b070 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out-1] = '\0';. 
2b080 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27   if( zPath[0]=='
2b090 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  /' ){.    sqlite
2b0a0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c  3_snprintf(nOut,
2b0b0 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61   zOut, "%s", zPa
2b0c0 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  th);.  }else{.  
2b0d0 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20    int nCwd;.    
2b0e0 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75  if( osGetcwd(zOu
2b0f0 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b  t, nOut-1)==0 ){
2b100 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e  .      return un
2b110 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
2b120 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
2b130 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68   "getcwd", zPath
2b140 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77  );.    }.    nCw
2b150 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  d = (int)strlen(
2b160 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
2b170 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
2b180 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77  -nCwd, &zOut[nCw
2b190 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68  d], "/%s", zPath
2b1a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b1b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
2b1c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b1d0 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
2b1e0 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  N./*.** Interfac
2b1f0 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
2b200 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
2b210 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
2b220 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
2b230 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
2b240 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
2b250 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
2b260 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ry..*/.#include 
2b270 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63  <dlfcn.h>.static
2b280 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65   void *unixDlOpe
2b290 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  n(sqlite3_vfs *N
2b2a0 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68  otUsed, const ch
2b2b0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
2b2c0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2b2d0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
2b2e0 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69  eturn dlopen(zFi
2b2f0 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57  lename, RTLD_NOW
2b300 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b   | RTLD_GLOBAL);
2b310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65  .}../*.** SQLite
2b320 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
2b330 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  tion immediately
2b340 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
2b350 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a   unixDlSym() or.
2b360 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20  ** unixDlOpen() 
2b370 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61  fails (returns a
2b380 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20   null pointer). 
2b390 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c  If a more detail
2b3a0 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73  ed error.** mess
2b3b0 61 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  age is available
2b3c0 2c 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20  , it is written 
2b3d0 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e  to zBufOut. If n
2b3e0 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  o error message.
2b3f0 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ** is available,
2b400 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74   zBufOut is left
2b410 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20   unmodified and 
2b420 53 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65  SQLite uses a de
2b430 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d  fault.** error m
2b440 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  essage..*/.stati
2b450 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72  c void unixDlErr
2b460 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
2b470 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
2b480 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
2b490 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
2b4a0 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f  *zErr;.  UNUSED_
2b4b0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2b4c0 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  d);.  unixEnterM
2b4d0 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d  utex();.  zErr =
2b4e0 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66   dlerror();.  if
2b4f0 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ( zErr ){.    sq
2b500 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
2b510 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25  Buf, zBufOut, "%
2b520 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20  s", zErr);.  }. 
2b530 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2b540 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
2b550 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c   (*unixDlSym(sql
2b560 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2b570 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73  d, void *p, cons
2b580 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f  t char*zSym))(vo
2b590 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  id){.  /* .  ** 
2b5a0 47 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74  GCC with -pedant
2b5b0 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74  ic-errors says t
2b5c0 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74  hat C90 does not
2b5d0 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74   allow a void* t
2b5e0 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69  o be.  ** cast i
2b5f0 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
2b600 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e   a function.  An
2b610 64 20 79 65 74 20 74 68 65 20 6c 69 62 72 61 72  d yet the librar
2b620 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e  y dlsym() routin
2b630 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61  e.  ** returns a
2b640 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20   void* which is 
2b650 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  really a pointer
2b660 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20   to a function. 
2b670 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20   So how do we.  
2b680 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77  ** use dlsym() w
2b690 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72  ith -pedantic-er
2b6a0 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rors?.  **.  ** 
2b6b0 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77  Variable x below
2b6c0 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
2b6d0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
2b6e0 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67   function taking
2b6f0 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  .  ** parameters
2b700 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74   void* and const
2b710 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72   char* and retur
2b720 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74  ning a pointer t
2b730 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  o a function..  
2b740 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** We initialize
2b750 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20   x by assigning 
2b760 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  it a pointer to 
2b770 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63  the dlsym() func
2b780 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74  tion..  ** (That
2b790 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75   assignment requ
2b7a0 69 72 65 73 20 61 20 63 61 73 74 2e 29 20 20 54  ires a cast.)  T
2b7b0 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20  hen we call the 
2b7c0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20  function that.  
2b7d0 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20  ** x points to. 
2b7e0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
2b7f0 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20   work-around is 
2b800 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b  unlikely to work
2b810 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e   correctly on an
2b820 79 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20  y system where. 
2b830 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63   ** you really c
2b840 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e  annot cast a fun
2b850 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e  ction pointer in
2b860 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74  to void*.  But t
2b870 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  hen, on the.  **
2b880 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73   other hand, dls
2b890 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  ym() will not wo
2b8a0 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73  rk on such a sys
2b8b0 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77  tem either, so w
2b8c0 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20  e have.  ** not 
2b8d0 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74  really lost anyt
2b8e0 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69  hing..  */.  voi
2b8f0 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63  d (*(*x)(void*,c
2b900 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
2b910 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
2b920 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
2b930 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a  .  x = (void(*(*
2b940 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
2b950 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79  ar*))(void))dlsy
2b960 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29  m;.  return (*x)
2b970 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61  (p, zSym);.}.sta
2b980 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43  tic void unixDlC
2b990 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
2b9a0 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20   *NotUsed, void 
2b9b0 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55  *pHandle){.  UNU
2b9c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2b9d0 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73  tUsed);.  dlclos
2b9e0 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65  e(pHandle);.}.#e
2b9f0 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45  lse /* if SQLITE
2ba00 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
2ba10 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a  SION is defined:
2ba20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e   */.  #define un
2ba30 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64  ixDlOpen  0.  #d
2ba40 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f  efine unixDlErro
2ba50 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e  r 0.  #define un
2ba60 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64  ixDlSym   0.  #d
2ba70 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73  efine unixDlClos
2ba80 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  e 0.#endif../*.*
2ba90 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74  * Write nBuf byt
2baa0 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74  es of random dat
2bab0 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  a to the supplie
2bac0 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a  d buffer zBuf..*
2bad0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2bae0 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  xRandomness(sqli
2baf0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2bb00 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
2bb10 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45   *zBuf){.  UNUSE
2bb20 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2bb30 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28  sed);.  assert((
2bb40 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69  size_t)nBuf>=(si
2bb50 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a  zeof(time_t)+siz
2bb60 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f  eof(int)));..  /
2bb70 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69  * We have to ini
2bb80 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20  tialize zBuf to 
2bb90 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64  prevent valgrind
2bba0 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a   from reporting.
2bbb0 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68    ** errors.  Th
2bbc0 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64  e reports issued
2bbd0 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65   by valgrind are
2bbe0 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20   incorrect - we 
2bbf0 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65  would.  ** prefe
2bc00 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f  r that the rando
2bc10 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73  mness be increas
2bc20 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65  ed by making use
2bc30 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   of the.  ** uni
2bc40 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65  nitialized space
2bc50 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76   in zBuf - but v
2bc60 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74  algrind errors t
2bc70 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a  end to worry.  *
2bc80 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52  * some users.  R
2bc90 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65  ather than argue
2bca0 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65  , it seems easie
2bcb0 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61  r just to initia
2bcc0 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68  lize.  ** the wh
2bcd0 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69  ole array and si
2bce0 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20  lence valgrind, 
2bcf0 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
2bd00 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65  ns less randomne
2bd10 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  ss.  ** in the r
2bd20 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a  andom seed..  **
2bd30 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69  .  ** When testi
2bd40 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  ng, initializing
2bd50 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20   zBuf[] to zero 
2bd60 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54  is all we do.  T
2bd70 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74  hat means.  ** t
2bd80 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73  hat we always us
2bd90 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f  e the same rando
2bda0 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63  m number sequenc
2bdb0 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74  e.  This makes t
2bdc0 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65  he.  ** tests re
2bdd0 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  peatable..  */. 
2bde0 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
2bdf0 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66   nBuf);.#if !def
2be00 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
2be10 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69  ).  {.    int pi
2be20 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20  d, fd;.    fd = 
2be30 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65  robust_open("/de
2be40 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44  v/urandom", O_RD
2be50 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  ONLY, 0);.    if
2be60 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
2be70 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20  time_t t;.      
2be80 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20  time(&t);.      
2be90 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c  memcpy(zBuf, &t,
2bea0 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20   sizeof(t));.   
2beb0 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28     pid = getpid(
2bec0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
2bed0 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d  &zBuf[sizeof(t)]
2bee0 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70  , &pid, sizeof(p
2bef0 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  id));.      asse
2bf00 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69  rt( sizeof(t)+si
2bf10 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65  zeof(pid)<=(size
2bf20 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20  _t)nBuf );.     
2bf30 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74   nBuf = sizeof(t
2bf40 29 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b  ) + sizeof(pid);
2bf50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2bf60 20 20 64 6f 7b 20 6e 42 75 66 20 3d 20 6f 73 52    do{ nBuf = osR
2bf70 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42  ead(fd, zBuf, nB
2bf80 75 66 29 3b 20 7d 77 68 69 6c 65 28 20 6e 42 75  uf); }while( nBu
2bf90 66 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  f<0 && errno==EI
2bfa0 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62  NTR );.      rob
2bfb0 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c  ust_close(0, fd,
2bfc0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2bfd0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
2bfe0 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a  eturn nBuf;.}...
2bff0 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
2c000 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
2c010 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
2c020 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
2c030 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  ..** The argumen
2c040 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
2c050 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
2c060 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70  we want to sleep
2c070 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
2c080 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
2c090 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
2c0a0 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74  nds of sleep act
2c0b0 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74  ually.** request
2c0c0 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65  ed from the unde
2c0d0 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
2c0e0 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65   system, a numbe
2c0f0 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  r which.** might
2c100 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
2c110 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
2c120 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e   argument, but n
2c130 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20  ot less.** than 
2c140 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
2c150 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2c160 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
2c170 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
2c180 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23  microseconds){.#
2c190 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2c1a0 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
2c1b0 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63  sp;..  sp.tv_sec
2c1c0 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20   = microseconds 
2c1d0 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e  / 1000000;.  sp.
2c1e0 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f  tv_nsec = (micro
2c1f0 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30  seconds % 100000
2c200 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e  0) * 1000;.  nan
2c210 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c  osleep(&sp, NULL
2c220 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2c230 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2c240 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
2c250 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66  conds;.#elif def
2c260 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50  ined(HAVE_USLEEP
2c270 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50  ) && HAVE_USLEEP
2c280 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73  .  usleep(micros
2c290 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45  econds);.  UNUSE
2c2a0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2c2b0 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  sed);.  return m
2c2c0 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c  icroseconds;.#el
2c2d0 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73  se.  int seconds
2c2e0 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
2c2f0 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30  +999999)/1000000
2c300 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64  ;.  sleep(second
2c310 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  s);.  UNUSED_PAR
2c320 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
2c330 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64  .  return second
2c340 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69  s*1000000;.#endi
2c350 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  f.}../*.** The f
2c360 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
2c370 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e  e, if set to a n
2c380 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69  on-zero value, i
2c390 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
2c3a0 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
2c3b0 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  f seconds since 
2c3c0 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64  1970 and is used
2c3d0 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75   to set the resu
2c3e0 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  lt of.** sqlite3
2c3f0 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20  OsCurrentTime() 
2c400 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a  during testing..
2c410 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2c420 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
2c430 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d  3_current_time =
2c440 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73   0;  /* Fake sys
2c450 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f  tem time in seco
2c460 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20  nds since 1970. 
2c470 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
2c480 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
2c490 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
2c4a0 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
2c4b0 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69   Time).  Write i
2c4c0 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68  nto *piNow.** th
2c4d0 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  e current time a
2c4e0 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
2c4f0 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74  ian Day number t
2c500 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e  imes 86_400_000.
2c510 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f    In.** other wo
2c520 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20  rds, write into 
2c530 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65  *piNow the numbe
2c540 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
2c550 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69  s since the Juli
2c560 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e  an.** epoch of n
2c570 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68  oon in Greenwich
2c580 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c   on November 24,
2c590 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64   4714 B.C accord
2c5a0 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72  ing to the.** pr
2c5b0 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61  oleptic Gregoria
2c5c0 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a  n calendar..**.*
2c5d0 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65  * On success, re
2c5e0 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
2c5f0 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
2c600 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
2c610 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
2c620 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
2c630 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
2c640 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2c650 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
2c660 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63  piNow){.  static
2c670 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2c680 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d  nt64 unixEpoch =
2c690 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74   24405875*(sqlit
2c6a0 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
2c6b0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  ;.#if defined(NO
2c6c0 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f  _GETTOD).  time_
2c6d0 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b  t t;.  time(&t);
2c6e0 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71  .  *piNow = ((sq
2c6f0 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29 2a 31  lite3_int64)t)*1
2c700 30 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  000 + unixEpoch;
2c710 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b  .#elif OS_VXWORK
2c720 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
2c730 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63  pec sNow;.  cloc
2c740 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f  k_gettime(CLOCK_
2c750 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29  REALTIME, &sNow)
2c760 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69  ;.  *piNow = uni
2c770 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73  xEpoch + 1000*(s
2c780 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f  qlite3_int64)sNo
2c790 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e  w.tv_sec + sNow.
2c7a0 74 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b  tv_nsec/1000000;
2c7b0 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20  .#else.  struct 
2c7c0 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20  timeval sNow;.  
2c7d0 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e  gettimeofday(&sN
2c7e0 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 69 4e 6f 77  ow, 0);.  *piNow
2c7f0 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
2c800 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
2c810 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
2c820 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30   sNow.tv_usec/10
2c830 30 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  00;.#endif..#ifd
2c840 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
2c850 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
2c860 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
2c870 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28   *piNow = 1000*(
2c880 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71  sqlite3_int64)sq
2c890 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
2c8a0 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  me + unixEpoch;.
2c8b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55    }.#endif.  UNU
2c8c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2c8d0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
2c8e0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   0;.}../*.** Fin
2c8f0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
2c900 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
2c910 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
2c920 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
2c930 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
2c940 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
2c950 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
2c960 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
2c970 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
2c980 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
2c990 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
2c9a0 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
2c9b0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75  tatic int unixCu
2c9c0 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
2c9d0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2c9e0 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
2c9f0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2ca00 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  i;.  UNUSED_PARA
2ca10 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2ca20 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d    unixCurrentTim
2ca30 65 49 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a 20  eInt64(0, &i);. 
2ca40 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30   *prNow = i/8640
2ca50 30 30 30 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e  0000.0;.  return
2ca60 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20   0;.}../*.** We 
2ca70 61 64 64 65 64 20 74 68 65 20 78 47 65 74 4c 61  added the xGetLa
2ca80 73 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64  stError() method
2ca90 20 77 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74   with the intent
2caa0 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67  ion of providing
2cab0 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c  .** better low-l
2cac0 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61  evel error messa
2cad0 67 65 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69  ges when operati
2cae0 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65  ng-system proble
2caf0 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75  ms come up.** du
2cb00 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72  ring SQLite oper
2cb10 61 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66  ation.  But so f
2cb20 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74  ar, none of that
2cb30 20 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d   has been implem
2cb40 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ented.** in the 
2cb50 63 6f 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72  core.  So this r
2cb60 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
2cb70 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77  called.  For now
2cb80 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a  , it is merely.*
2cb90 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72  * a place-holder
2cba0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2cbb0 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72  unixGetLastError
2cbc0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2cbd0 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
2cbe0 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73  ed2, char *NotUs
2cbf0 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed3){.  UNUSED_P
2cc00 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2cc10 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2cc20 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b  METER(NotUsed2);
2cc30 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2cc40 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20  TER(NotUsed3);. 
2cc50 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
2cc60 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
2cc70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
2cc80 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  f sqlite3_vfs me
2cc90 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
2cca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ccb0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
2ccc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ccd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ccf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cd00 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
2cd10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cd20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cd30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cd40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cd50 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
2cd60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
2cd70 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e  gin Proxy Lockin
2cd80 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
2cd90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cda0 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c  **.**.** Proxy l
2cdb0 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65  ocking is a "ube
2cdc0 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64  r-locking-method
2cdd0 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a  " in this sense:
2cde0 20 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a    It uses the.**
2cdf0 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d   other locking m
2ce00 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64  ethods on second
2ce10 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20  ary lock files. 
2ce20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
2ce30 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65  s a.** meta-laye
2ce40 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68  r over top of th
2ce50 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b  e primitive lock
2ce60 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ing implemented 
2ce70 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  above.  For.** t
2ce80 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  his reason, the 
2ce90 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d  division that im
2cea0 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78  plements of prox
2ceb0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66  y locking is def
2cec0 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c  erred.** until l
2ced0 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ate in the file 
2cee0 28 68 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c  (here) after all
2cef0 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f   of the other I/
2cf00 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a  O methods have.*
2cf10 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d  * been defined -
2cf20 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 72 69   so that the pri
2cf30 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d  mitive locking m
2cf40 65 74 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c  ethods are avail
2cf50 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69  able.** as servi
2cf60 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68  ces to help with
2cf70 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
2cf80 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63  ion of proxy loc
2cf90 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a  king..**.****.**
2cfa0 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
2cfb0 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20  locking schemes 
2cfc0 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79  in SQLite use by
2cfd0 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f  te-range locks o
2cfe0 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
2cff0 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69  e file to coordi
2d000 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75  nate safe, concu
2d010 72 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20  rrent access by 
2d020 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
2d030 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20  .** and writers 
2d040 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f  [http://sqlite.o
2d050 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d  rg/lockingv3.htm
2d060 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69  l].  The five fi
2d070 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  le locking.** st
2d080 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20  ates (UNLOCKED, 
2d090 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c  PENDING, SHARED,
2d0a0 20 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55   RESERVED, EXCLU
2d0b0 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d  SIVE) are implem
2d0c0 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49  ented.** as POSI
2d0d0 58 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c  X read & write l
2d0e0 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20  ocks over fixed 
2d0f0 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73  set of locations
2d100 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a   (via fsctl),.**
2d110 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20   on AFP and SMB 
2d120 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62  only exclusive b
2d130 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
2d140 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69  are available vi
2d150 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20  a fsctl.** with 
2d160 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73  _IOWR('z', 23, s
2d170 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
2d180 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b  ockPB2) to track
2d190 20 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74   the same 5 stat
2d1a0 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61  es..** To simula
2d1b0 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20  te a F_RDLCK on 
2d1c0 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65  the shared range
2d1d0 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f  , on AFP a rando
2d1e0 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20  mly selected.** 
2d1f0 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73  address in the s
2d200 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74  hared range is t
2d210 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45  aken for a SHARE
2d220 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69  D lock, the enti
2d230 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e  re.** shared ran
2d240 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20  ge is taken for 
2d250 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
2d260 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50  k):.**.**      P
2d270 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20  ENDING_BYTE     
2d280 20 20 20 30 78 34 30 30 30 30 30 30 30 09 09 20     0x40000000.. 
2d290 20 20 09 0a 2a 2a 20 20 20 20 20 20 52 45 53 45    ..**      RESE
2d2a0 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20  RVED_BYTE       
2d2b0 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20  0x40000001.**   
2d2c0 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20     SHARED_RANGE 
2d2d0 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
2d2e0 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a  2 -> 0x40000200.
2d2f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
2d300 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   well on the loc
2d310 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  al file system, 
2d320 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72  but shows a near
2d330 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64  ly 100x.** slowd
2d340 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66  own in read perf
2d350 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62  ormance on AFP b
2d360 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63  ecause the AFP c
2d370 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a  lient disables.*
2d380 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65  * the read cache
2d390 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65   when byte-range
2d3a0 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65   locks are prese
2d3b0 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68  nt.  Enabling th
2d3c0 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20  e read.** cache 
2d3d0 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20  exposes a cache 
2d3e0 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65  coherency proble
2d3f0 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e  m that is presen
2d400 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a  t on all OS X.**
2d410 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f   supported netwo
2d420 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  rk file systems.
2d430 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f    NFS and AFP bo
2d440 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a  th observe the.*
2d450 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20  * close-to-open 
2d460 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e  semantics for en
2d470 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68  suring cache coh
2d480 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a  erency.** [http:
2d490 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67  //nfs.sourceforg
2d4a0 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20  e.net/#faq_a8], 
2d4b0 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65  which does not e
2d4c0 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64  ffectively.** ad
2d4d0 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72  dress the requir
2d4e0 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75  ements for concu
2d4f0 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61  rrent database a
2d500 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
2d510 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64  e.** readers and
2d520 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74   writers.** [htt
2d530 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63  p://www.nabble.c
2d540 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53  om/SQLite-on-NFS
2d550 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79  -cache-coherency
2d560 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c  -td15655701.html
2d570 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72  ]..**.** To addr
2d580 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ess the performa
2d590 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f  nce and cache co
2d5a0 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20  herency issues, 
2d5b0 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  proxy file locki
2d5c0 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68  ng.** changes th
2d5d0 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61  e way database a
2d5e0 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c  ccess is control
2d5f0 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20  led by limiting 
2d600 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73  access to a.** s
2d610 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20  ingle host at a 
2d620 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20  time and moving 
2d630 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f  file locks off o
2d640 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2d650 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20  ile.** and onto 
2d660 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20  a proxy file on 
2d670 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
2d680 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a  ystem.  .**.**.*
2d690 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f  * Using proxy lo
2d6a0 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  cks.** ---------
2d6b0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43  --------.**.** C
2d6c0 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c   APIs.**.**  sql
2d6d0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
2d6e0 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51  l(db, dbname, SQ
2d6f0 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
2d700 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20  XYFILE,.**      
2d710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d720 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20   <proxy_path> | 
2d730 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73  ":auto:");.**  s
2d740 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
2d750 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20  rol(db, dbname, 
2d760 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
2d770 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78  ROXYFILE, &<prox
2d780 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a  y_path>);.**.**.
2d790 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a  ** SQL pragmas.*
2d7a0 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  *.**  PRAGMA [da
2d7b0 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
2d7c0 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70  xy_file=<proxy_p
2d7d0 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a  ath> | :auto:.**
2d7e0 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
2d7f0 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  se.]lock_proxy_f
2d800 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  ile.**.** Specif
2d810 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65  ying ":auto:" me
2d820 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72  ans that if ther
2d830 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c  e is a conch fil
2d840 65 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e  e with a matchin
2d850 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20  g.** host ID in 
2d860 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61  it, the proxy pa
2d870 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20  th in the conch 
2d880 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  file will be use
2d890 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20  d, otherwise.** 
2d8a0 61 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73  a proxy path bas
2d8b0 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73  ed on the user's
2d8c0 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69   temp dir.** (vi
2d8d0 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41  a confstr(_CS_DA
2d8e0 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
2d8f0 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65  IR,...)) will be
2d900 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a   used and the.**
2d910 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69   actual proxy fi
2d920 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72  le name is gener
2d930 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61  ated from the na
2d940 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74  me and path of t
2d950 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
2d960 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ile.  For exampl
2d970 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46  e:.**.**       F
2d980 6f 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68  or database path
2d990 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e   "/Users/me/foo.
2d9a0 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68  db" .**       Th
2d9b0 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  e lock path will
2d9c0 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71   be "<tmpdir>/sq
2d9d0 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72  liteplocks/_User
2d9e0 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f  s_me_foo.db:auto
2d9f0 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  :").**.** Once a
2da00 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63   lock proxy is c
2da10 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20  onfigured for a 
2da20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2da30 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a  ion, it can not.
2da40 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68  ** be removed, h
2da50 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65  owever it may be
2da60 20 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64   switched to a d
2da70 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70  ifferent proxy p
2da80 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61  ath via.** the a
2da90 62 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d  bove APIs (assum
2daa0 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69  ing the conch fi
2dab0 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  le is not being 
2dac0 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a  held by another.
2dad0 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  ** connection or
2dae0 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a   process). .**.*
2daf0 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c  *.** How proxy l
2db00 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20  ocking works.** 
2db10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2db20 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72  -------.**.** Pr
2db30 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
2db40 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c   relies primaril
2db50 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70  y on two new sup
2db60 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a  porting files: .
2db70 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68  **.**   *  conch
2db80 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61   file to limit a
2db90 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
2dba0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20  abase file to a 
2dbb0 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20  single host.**  
2dbc0 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a      at a time.**
2dbd0 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66  .**   *  proxy f
2dbe0 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20  ile to act as a 
2dbf0 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64  proxy for the ad
2dc00 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72  visory locks nor
2dc10 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61  mally.**      ta
2dc20 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
2dc30 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ase.**.** The co
2dc40 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73  nch file - to us
2dc50 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20  e a proxy file, 
2dc60 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73  sqlite must firs
2dc70 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63  t "hold the conc
2dc80 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20  h".** by taking 
2dc90 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20  an sqlite-style 
2dca0 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
2dcb0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72  he conch file, r
2dcc0 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  eading the.** co
2dcd0 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61  ntents and compa
2dce0 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20  ring the host's 
2dcf0 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28  unique host ID (
2dd00 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c  see below) and l
2dd10 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74  ock.** proxy pat
2dd20 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61  h against the va
2dd30 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
2dd40 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63  he conch.  The c
2dd50 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20  onch file is.** 
2dd60 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61  stored in the sa
2dd70 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
2dd80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2dd90 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e  e and the file n
2dda0 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72  ame.** is patter
2ddb0 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61  ned after the da
2ddc0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
2ddd0 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e   as ".<databasen
2dde0 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20  ame>-conch"..** 
2ddf0 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  If the conch fil
2de00 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
2de10 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e  , or it's conten
2de20 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20  ts do not match 
2de30 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61  the.** host ID a
2de40 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68  nd/or proxy path
2de50 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
2de60 69 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20  is escalated to 
2de70 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  an exclusive.** 
2de80 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e  lock and the con
2de90 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73  ch file contents
2dea0 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
2deb0 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64   the host ID and
2dec0 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61   proxy.** path a
2ded0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64  nd the lock is d
2dee0 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73  owngraded to a s
2def0 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e  hared lock again
2df00 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a  .  If the conch.
2df10 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e  ** is held by an
2df20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 77  other process (w
2df30 69 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ith a shared loc
2df40 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76  k), the exclusiv
2df50 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66  e lock.** will f
2df60 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42  ail and SQLITE_B
2df70 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
2df80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
2df90 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65   file - a single
2dfa0 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65 64 20  -byte file used 
2dfb0 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79  for all advisory
2dfc0 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e   file locks.** n
2dfd0 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e  ormally taken on
2dfe0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2dff0 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77  le.   This allow
2e000 73 20 66 6f 72 20 73 61 66 65 20 73 68 61 72 69  s for safe shari
2e010 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ng.** of the dat
2e020 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d  abase file for m
2e030 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
2e040 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74  and writers on t
2e050 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20  he same.** host 
2e060 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72  (the conch ensur
2e070 65 73 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c  es that they all
2e080 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f   use the same lo
2e090 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a  cal lock file)..
2e0a0 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67  **.** Requesting
2e0b0 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20   the lock proxy 
2e0c0 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61  does not immedia
2e0d0 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f  tely take the co
2e0e0 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e  nch, it is.** on
2e0f0 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  ly taken when th
2e100 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74 20  e first request 
2e110 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65  to lock database
2e120 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20   file is made.  
2e130 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73  .** This matches
2e140 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f   the semantics o
2e150 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61  f the traditiona
2e160 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69  l locking behavi
2e170 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65  or, where.** ope
2e180 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f  ning a connectio
2e190 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  n to a database 
2e1a0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61  file does not ta
2e1b0 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e  ke a lock on it.
2e1c0 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c  .** The shared l
2e1d0 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20  ock and an open 
2e1e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2e1f0 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75  are maintained u
2e200 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ntil .** the con
2e210 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64  nection to the d
2e220 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65  atabase is close
2e230 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  d. .**.** The pr
2e240 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65  oxy file and the
2e250 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e   lock file are n
2e260 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20  ever deleted so 
2e270 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a  they only need.*
2e280 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  * to be created 
2e290 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  the first time t
2e2a0 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a  hey are used..**
2e2b0 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
2e2c0 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d  n options.** ---
2e2d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e2e0 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45  --.**.**  SQLITE
2e2f0 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
2e300 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  CKING.**.**     
2e310 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 73    Database files
2e320 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e   accessed on non
2e330 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74  -local file syst
2e340 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20  ems are.**      
2e350 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
2e360 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70 72  onfigured for pr
2e370 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63  oxy locking, loc
2e380 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20  k files are.**  
2e390 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d       named autom
2e3a0 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74  atically using t
2e3b0 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73  he same logic as
2e3c0 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41  .**       PRAGMA
2e3d0 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65   lock_proxy_file
2e3e0 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20  =":auto:".**    
2e3f0 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58  .**  SQLITE_PROX
2e400 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20  Y_DEBUG.**.**   
2e410 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20      Enables the 
2e420 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72  logging of error
2e430 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67   messages during
2e440 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a   host id file.**
2e450 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61 6c         retrieval
2e460 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a   and creation.**
2e470 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49  .**  LOCKPROXYDI
2e480 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76  R.**.**       Ov
2e490 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61  errides the defa
2e4a0 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73  ult directory us
2e4b0 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78  ed for lock prox
2e4c0 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20  y files that.** 
2e4d0 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20        are named 
2e4e0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69  automatically vi
2e4f0 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73  a the ":auto:" s
2e500 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51  etting.**.**  SQ
2e510 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
2e520 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
2e530 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65  S.**.**       Pe
2e540 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65  rmissions to use
2e550 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
2e560 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73   directory for s
2e570 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  toring the.**   
2e580 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66      lock proxy f
2e590 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20  iles, only used 
2e5a0 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49  when LOCKPROXYDI
2e5b0 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a  R is not set..**
2e5c0 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41      .**    .** A
2e5d0 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76  s mentioned abov
2e5e0 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64  e, when compiled
2e5f0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45   with SQLITE_PRE
2e600 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
2e610 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68  G,.** setting th
2e620 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  e environment va
2e630 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f  riable SQLITE_FO
2e640 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
2e650 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66  G to 1 will.** f
2e660 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69  orce proxy locki
2e670 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ng to be used fo
2e680 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65  r every database
2e690 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e   file opened, an
2e6a0 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63  d 0.** will forc
2e6b0 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78  e automatic prox
2e6c0 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
2e6d0 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c  disabled for all
2e6e0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
2e6f0 65 73 20 28 65 78 70 6c 69 63 69 74 79 20 63 61  es (explicity ca
2e700 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45  lling the SQLITE
2e710 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
2e720 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20  LE pragma or.** 
2e730 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74  sqlite_file_cont
2e740 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61  rol API is not a
2e750 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54  ffected by SQLIT
2e760 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
2e770 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  CKING)..*/../*.*
2e780 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
2e790 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
2e7a0 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a  e on MacOSX .*/.
2e7b0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2e7c0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2e7d0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2e7e0 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  STYLE../*.** The
2e7f0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
2e800 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61 74  text has the pat
2e810 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63  h and file struc
2e820 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72 65  tures for the re
2e830 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63  mote .** and loc
2e840 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69  al proxy files i
2e850 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20  n it.*/.typedef 
2e860 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
2e870 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79  ingContext proxy
2e880 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
2e890 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
2e8a0 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75  ingContext {.  u
2e8b0 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
2e8c0 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  le;         /* O
2e8d0 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  pen conch file *
2e8e0 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46  /.  char *conchF
2e8f0 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20 20  ilePath;        
2e900 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2e910 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
2e920 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
2e930 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oxy;         /* 
2e940 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20  Open proxy lock 
2e950 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2e960 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20  lockProxyPath;  
2e970 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2e980 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  f the proxy lock
2e990 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
2e9a0 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
2e9b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2e9c0 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
2e9d0 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48   */.  int conchH
2e9e0 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  eld;            
2e9f0 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63     /* 1 if the c
2ea00 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31  onch is held, -1
2ea10 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   if lockless */.
2ea20 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69    void *oldLocki
2ea30 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f  ngContext;     /
2ea40 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69  * Original locki
2ea50 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73  ngcontext to res
2ea60 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  tore on close */
2ea70 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  .  sqlite3_io_me
2ea80 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c  thods const *pOl
2ea90 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20  dMethod;     /* 
2eaa0 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74  Original I/O met
2eab0 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a  hods for close *
2eac0 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65  /.};../* .** The
2ead0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
2eae0 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 64 61   path for the da
2eaf0 74 61 62 61 73 65 20 61 74 20 64 62 50 61 74 68  tabase at dbPath
2eb00 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
2eb10 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63   lPath, .** whic
2eb20 68 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  h must point to 
2eb30 76 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20  valid, writable 
2eb40 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f  memory large eno
2eb50 75 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e  ugh for a maxLen
2eb60 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20   length.** file 
2eb70 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  path. .*/.static
2eb80 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63   int proxyGetLoc
2eb90 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72  kPath(const char
2eba0 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a   *dbPath, char *
2ebb0 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61  lPath, size_t ma
2ebc0 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e  xLen){.  int len
2ebd0 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20  ;.  int dbLen;. 
2ebe0 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20   int i;..#ifdef 
2ebf0 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c  LOCKPROXYDIR.  l
2ec00 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61  en = strlcpy(lPa
2ec10 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  th, LOCKPROXYDIR
2ec20 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65  , maxLen);.#else
2ec30 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52  .# ifdef _CS_DAR
2ec40 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
2ec50 52 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63  R.  {.    if( !c
2ec60 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49  onfstr(_CS_DARWI
2ec70 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c  N_USER_TEMP_DIR,
2ec80 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20   lPath, maxLen) 
2ec90 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
2eca0 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20  (("GETLOCKPATH  
2ecb0 66 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d  failed %s errno=
2ecc0 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20  %d pid=%d\n",.  
2ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 50 61               lPa
2ece0 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69  th, errno, getpi
2ecf0 64 28 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  d()));.      ret
2ed00 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2ed10 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  _LOCK;.    }.   
2ed20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c   len = strlcat(l
2ed30 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f  Path, "sqliteplo
2ed40 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20  cks", maxLen);  
2ed50 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20    .  }.# else.  
2ed60 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
2ed70 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61  ath, "/tmp/", ma
2ed80 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23  xLen);.# endif.#
2ed90 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61  endif..  if( lPa
2eda0 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29  th[len-1]!='/' )
2edb0 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  {.    len = strl
2edc0 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20  cat(lPath, "/", 
2edd0 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a  maxLen);.  }.  .
2ede0 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74    /* transform t
2edf0 68 65 20 64 62 20 70 61 74 68 20 74 6f 20 61 20  he db path to a 
2ee00 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d  unique cache nam
2ee10 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28  e */.  dbLen = (
2ee20 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74  int)strlen(dbPat
2ee30 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20  h);.  for( i=0; 
2ee40 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65  i<dbLen && (i+le
2ee50 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e  n+7)<(int)maxLen
2ee60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
2ee70 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a   c = dbPath[i];.
2ee80 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d      lPath[i+len]
2ee90 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a   = (c=='/')?'_':
2eea0 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69  c;.  }.  lPath[i
2eeb0 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74  +len]='\0';.  st
2eec0 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61  rlcat(lPath, ":a
2eed0 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  uto:", maxLen);.
2eee0 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c    OSTRACE(("GETL
2eef0 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c  OCKPATH  proxy l
2ef00 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
2ef10 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65  %d\n", lPath, ge
2ef20 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75  tpid()));.  retu
2ef30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2ef40 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73  ./* . ** Creates
2ef50 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
2ef60 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64  nd any missing d
2ef70 69 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f  irectories in lo
2ef80 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69  ckPath. */.stati
2ef90 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
2efa0 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20  eLockPath(const 
2efb0 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b  char *lockPath){
2efc0 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20  .  int i, len;. 
2efd0 20 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54   char buf[MAXPAT
2efe0 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61  HLEN];.  int sta
2eff0 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73  rt = 0;.  .  ass
2f000 65 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55  ert(lockPath!=NU
2f010 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f  LL);.  /* try to
2f020 20 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20   create all the 
2f030 69 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72  intermediate dir
2f040 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65  ectories */.  le
2f050 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
2f060 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66  lockPath);.  buf
2f070 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30  [0] = lockPath[0
2f080 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69  ];.  for( i=1; i
2f090 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  <len; i++ ){.   
2f0a0 20 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d   if( lockPath[i]
2f0b0 20 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20   == '/' && (i - 
2f0c0 73 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20  start > 0) ){.  
2f0d0 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69      /* only mkdi
2f0e0 72 20 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d  r if leaf dir !=
2f0f0 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22   "." or "/" or "
2f100 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  .." */.      if(
2f110 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69   i-start>2 || (i
2f120 2d 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66  -start==1 && buf
2f130 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26  [start] != '.' &
2f140 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
2f150 27 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c  '/') .         |
2f160 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26  | (i-start==2 &&
2f170 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
2f180 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b  .' && buf[start+
2f190 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20  1] != '.') ){.  
2f1a0 20 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30        buf[i]='\0
2f1b0 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  ';.        if( m
2f1c0 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45  kdir(buf, SQLITE
2f1d0 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
2f1e0 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29  R_PERMISSIONS) )
2f1f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
2f200 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20  err=errno;.     
2f210 20 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45       if( err!=EE
2f220 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20  XIST ) {.       
2f230 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43       OSTRACE(("C
2f240 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46  REATELOCKPATH  F
2f250 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25  AILED creating %
2f260 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  s, ".           
2f270 20 20 20 20 20 20 20 20 20 20 22 27 25 73 27 20            "'%s' 
2f280 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d  proxy lock path=
2f290 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20  %s pid=%d\n",.  
2f2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2b0 20 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72     buf, strerror
2f2c0 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c  (err), lockPath,
2f2d0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20   getpid()));.   
2f2e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2f2f0 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  err;.          }
2f300 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f310 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69   }.      start=i
2f320 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75  +1;.    }.    bu
2f330 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b  f[i] = lockPath[
2f340 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  i];.  }.  OSTRAC
2f350 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41  E(("CREATELOCKPA
2f360 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70  TH  proxy lock p
2f370 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22  ath=%s pid=%d\n"
2f380 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70  , lockPath, getp
2f390 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  id()));.  return
2f3a0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
2f3b0 61 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69  ate a new VFS fi
2f3c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73  le descriptor (s
2f3d0 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
2f3e0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
2f3f0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
2f400 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69   and open the fi
2f410 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20  le named "path" 
2f420 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  in the file desc
2f430 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  riptor..**.** Th
2f440 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
2f450 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79  onsible not only
2f460 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65   for closing the
2f470 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2f480 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72  .** but also for
2f490 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d   freeing the mem
2f4a0 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
2f4b0 69 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73  ith the file des
2f4c0 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  criptor..*/.stat
2f4d0 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
2f4e0 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20  teUnixFile(.    
2f4f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
2f500 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68  ,        /* path
2f510 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69   for the new uni
2f520 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69  xFile */.    uni
2f530 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20  xFile **ppFile, 
2f540 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c        /* unixFil
2f550 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 65  e created and re
2f560 74 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f  turned by ref */
2f570 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66  .    int islockf
2f580 69 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ile           /*
2f590 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73   if non zero mis
2f5a0 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62  sing dirs will b
2f5b0 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b  e created */.) {
2f5c0 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
2f5d0 20 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31    int dirfd = -1
2f5e0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
2f5f0 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ew;.  int rc = S
2f600 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
2f610 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
2f620 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20  WR | O_CREAT;.  
2f630 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d  sqlite3_vfs dumm
2f640 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72  yVfs;.  int terr
2f650 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e  no = 0;.  UnixUn
2f660 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20  usedFd *pUnused 
2f670 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e  = NULL;..  /* 1.
2f680 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70   first try to op
2f690 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69  en/create the fi
2f6a0 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68  le.  ** 2. if th
2f6b0 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68  at fails, and th
2f6c0 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c  is is a lock fil
2f6d0 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74  e (not-conch), t
2f6e0 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a  ry creating.  **
2f6f0 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65   the parent dire
2f700 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e  ctories and then
2f710 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a   try again..  **
2f720 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c   3. if that fail
2f730 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74  s, try to open t
2f740 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c  he file read-onl
2f750 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65  y.  ** otherwise
2f760 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66   return BUSY (if
2f770 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43   lock file) or C
2f780 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20  ANTOPEN for the 
2f790 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a  conch file.  */.
2f7a0 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64    pUnused = find
2f7b0 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c  ReusableFd(path,
2f7c0 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69   openFlags);.  i
2f7d0 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
2f7e0 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e    fd = pUnused->
2f7f0 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  fd;.  }else{.   
2f800 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
2f810 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
2f820 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20  (*pUnused));.   
2f830 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b   if( !pUnused ){
2f840 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2f850 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2f860 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  }.  }.  if( fd<0
2f870 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62   ){.    fd = rob
2f880 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f  ust_open(path, o
2f890 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45  penFlags, SQLITE
2f8a0 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
2f8b0 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20  RMISSIONS);.    
2f8c0 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  terrno = errno;.
2f8d0 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20      if( fd<0 && 
2f8e0 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26  errno==ENOENT &&
2f8f0 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20   islockfile ){. 
2f900 20 20 20 20 20 69 66 28 20 70 72 6f 78 79 43 72       if( proxyCr
2f910 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74  eateLockPath(pat
2f920 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  h) == SQLITE_OK 
2f930 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20  ){.        fd = 
2f940 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68  robust_open(path
2f950 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c  , openFlags, SQL
2f960 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
2f970 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
2f980 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2f990 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
2f9a0 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f     openFlags = O
2f9b0 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20  _RDONLY;.    fd 
2f9c0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61  = robust_open(pa
2f9d0 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53  th, openFlags, S
2f9e0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
2f9f0 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
2fa00 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72  .    terrno = er
2fa10 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  rno;.  }.  if( f
2fa20 64 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  d<0 ){.    if( i
2fa30 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20  slockfile ){.   
2fa40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2fa50 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
2fa60 20 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29   switch (terrno)
2fa70 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45 41   {.      case EA
2fa80 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65  CCES:.        re
2fa90 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
2faa0 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 49 4f  ;.      case EIO
2fab0 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  : .        retur
2fac0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
2fad0 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f  OCK; /* even tho
2fae0 75 67 68 20 69 74 20 69 73 20 74 68 65 20 63 6f  ugh it is the co
2faf0 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66  nch */.      def
2fb00 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65  ault:.        re
2fb10 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
2fb20 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
2fb30 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d  .  }.  .  pNew =
2fb40 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c   (unixFile *)sql
2fb50 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
2fb60 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66  of(*pNew));.  if
2fb70 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a  ( pNew==NULL ){.
2fb80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2fb90 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
2fba0 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
2fbb0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
2fbc0 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  New, 0, sizeof(u
2fbd0 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65  nixFile));.  pNe
2fbe0 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f  w->openFlags = o
2fbf0 70 65 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73  penFlags;.  mems
2fc00 65 74 28 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c  et(&dummyVfs, 0,
2fc10 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73   sizeof(dummyVfs
2fc20 29 29 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70  ));.  dummyVfs.p
2fc30 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a  AppData = (void*
2fc40 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  )&autolockIoFind
2fc50 65 72 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a  er;.  dummyVfs.z
2fc60 4e 61 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a  Name = "dummy";.
2fc70 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20    pUnused->fd = 
2fc80 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66  fd;.  pUnused->f
2fc90 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
2fca0 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65  ;.  pNew->pUnuse
2fcb0 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a  d = pUnused;.  .
2fcc0 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
2fcd0 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c  xFile(&dummyVfs,
2fce0 20 66 64 2c 20 64 69 72 66 64 2c 20 28 73 71 6c   fd, dirfd, (sql
2fcf0 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c  ite3_file*)pNew,
2fd00 20 70 61 74 68 2c 20 30 2c 20 30 2c 20 30 29 3b   path, 0, 0, 0);
2fd10 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2fd20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46  E_OK ){.    *ppF
2fd30 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ile = pNew;.    
2fd40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2fd50 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65  ;.  }.end_create
2fd60 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f  _proxy:    .  ro
2fd70 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
2fd80 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
2fd90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2fda0 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  New);.  sqlite3_
2fdb0 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20  free(pUnused);. 
2fdc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
2fdd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2fde0 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75  T./* simulate mu
2fdf0 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20  ltiple hosts by 
2fe00 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20  creating unique 
2fe10 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68  hostid file path
2fe20 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s */.int sqlite3
2fe30 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b  _hostid_num = 0;
2fe40 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
2fe50 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
2fe60 20 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68      16  /* conch
2fe70 20 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65   file host id le
2fe80 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20  ngth */../* Not 
2fe90 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69  always defined i
2fea0 6e 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73  n the headers as
2feb0 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20   it ought to be 
2fec0 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65  */.extern int ge
2fed0 74 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74  thostuuid(uuid_t
2fee0 20 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63   id, const struc
2fef0 74 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74  t timespec *wait
2ff00 29 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68  );../* get the h
2ff10 6f 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f  ost ID via getho
2ff20 73 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49  stuuid(), pHostI
2ff30 44 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  D must point to 
2ff40 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
2ff50 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69  .** bytes of wri
2ff60 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  table memory..*/
2ff70 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2ff80 79 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67  yGetHostID(unsig
2ff90 6e 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49  ned char *pHostI
2ffa0 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b  D, int *pError){
2ffb0 0a 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f  .  assert(PROXY_
2ffc0 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a  HOSTIDLEN == siz
2ffd0 65 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20  eof(uuid_t));.  
2ffe0 6d 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20  memset(pHostID, 
2fff0 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  0, PROXY_HOSTIDL
30000 45 4e 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  EN);.#if defined
30010 28 5f 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53  (__MAX_OS_X_VERS
30020 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
30030 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )\.             
30040 20 20 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f    && __MAC_OS_X_
30050 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55  VERSION_MIN_REQU
30060 49 52 45 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20  IRED<1050.  {.  
30070 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
30080 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 74  truct timespec t
30090 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b  imeout = {1, 0};
300a0 20 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75   /* 1 sec timeou
300b0 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74  t */.    if( get
300c0 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44  hostuuid(pHostID
300d0 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20  , &timeout) ){. 
300e0 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65       int err = e
300f0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
30100 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  pError ){.      
30110 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b    *pError = err;
30120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
30130 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
30140 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  RR;.    }.  }.#e
30150 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
30160 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d  TE_TEST.  /* sim
30170 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68  ulate multiple h
30180 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  osts by creating
30190 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66   unique hostid f
301a0 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69  ile paths */.  i
301b0 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  f( sqlite3_hosti
301c0 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20  d_num != 0){.   
301d0 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63   pHostID[0] = (c
301e0 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20  har)(pHostID[0] 
301f0 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33  + (char)(sqlite3
30200 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78  _hostid_num & 0x
30210 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  FF));.  }.#endif
30220 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  .  .  return SQL
30230 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68  ITE_OK;.}../* Th
30240 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e  e conch file con
30250 74 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72  tains the header
30260 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f  , host id and lo
30270 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f  ck file path. */
30280 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43  .#define PROXY_C
30290 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20  ONCHVERSION 2   
302a0 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72  /* 1-byte header
302b0 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69  , 16-byte host i
302c0 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69  d, path */.#defi
302d0 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  ne PROXY_HEADERL
302e0 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e  EN    1   /* con
302f0 63 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c  ch file header l
30300 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65  ength */.#define
30310 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58   PROXY_PATHINDEX
30320 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45      (PROXY_HEADE
30330 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49  RLEN+PROXY_HOSTI
30340 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52  DLEN).#define PR
30350 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20  OXY_MAXCONCHLEN 
30360 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45   (PROXY_HEADERLE
30370 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
30380 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f  N+MAXPATHLEN)../
30390 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f  * .** Takes an o
303a0 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  pen conch file, 
303b0 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65  copies the conte
303c0 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74  nts to a new pat
303d0 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73  h and then moves
303e0 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54   .** it back.  T
303f0 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64  he newly created
30400 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73   file's file des
30410 63 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67  criptor is assig
30420 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  ned to the.** co
30430 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75  nch file structu
30440 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74  re and finally t
30450 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63  he original conc
30460 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  h file descripto
30470 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e  r is .** closed.
30480 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69    Returns zero i
30490 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f  f successful..*/
304a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
304b0 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28  yBreakConchLock(
304c0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
304d0 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44   uuid_t myHostID
304e0 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
304f0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
30500 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
30510 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
30520 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
30530 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
30540 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
30550 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20  nchFile;.  char 
30560 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  tPath[MAXPATHLEN
30570 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52  ];.  char buf[PR
30580 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
30590 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20  ;.  char *cPath 
305a0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
305b0 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20  ePath;.  size_t 
305c0 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73  readLen = 0;.  s
305d0 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20  ize_t pathLen = 
305e0 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67  0;.  char errmsg
305f0 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74  [64] = "";.  int
30600 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20   fd = -1;.  int 
30610 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45  rc = -1;.  UNUSE
30620 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f  D_PARAMETER(myHo
30630 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65  stID);..  /* cre
30640 61 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62  ate a new path b
30650 79 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72  y replace the tr
30660 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20  ailing '-conch' 
30670 77 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f  with '-break' */
30680 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72  .  pathLen = str
30690 6c 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74  lcpy(tPath, cPat
306a0 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
306b0 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41    if( pathLen>MA
306c0 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68  XPATHLEN || path
306d0 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28  Len<6 || .     (
306e0 73 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70  strlcpy(&tPath[p
306f0 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61  athLen-5], "brea
30700 6b 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a  k", 6) != 5) ){.
30710 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
30720 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
30730 73 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68  sg),errmsg,"path
30740 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22   error (len %d)"
30750 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a  ,(int)pathLen);.
30760 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
30770 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a  aklock;.  }.  /*
30780 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20   read the conch 
30790 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61  content */.  rea
307a0 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63  dLen = osPread(c
307b0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66  onchFile->h, buf
307c0 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
307d0 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  LEN, 0);.  if( r
307e0 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54  eadLen<PROXY_PAT
307f0 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71  HINDEX ){.    sq
30800 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
30810 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72  izeof(errmsg),er
30820 72 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72  rmsg,"read error
30830 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29   (len %d)",(int)
30840 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f  readLen);.    go
30850 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
30860 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65  ;.  }.  /* write
30870 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74   it out to the t
30880 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66  emporary break f
30890 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f  ile */.  fd = ro
308a0 62 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c  bust_open(tPath,
308b0 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54   (O_RDWR|O_CREAT
308c0 7c 4f 5f 45 58 43 4c 29 2c 0a 20 20 20 20 20 20  |O_EXCL),.      
308d0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
308e0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
308f0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
30900 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
30910 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
30920 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
30930 2c 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74  , errmsg, "creat
30940 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
30950 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
30960 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
30970 20 20 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69    }.  if( osPwri
30980 74 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64  te(fd, buf, read
30990 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a  Len, 0) != (ssiz
309a0 65 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20  e_t)readLen ){. 
309b0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
309c0 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
309d0 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69  g), errmsg, "wri
309e0 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c  te failed (%d)",
309f0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74   errno);.    got
30a00 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
30a10 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d  .  }.  if( renam
30a20 65 28 74 50 61 74 68 2c 20 63 50 61 74 68 29 20  e(tPath, cPath) 
30a30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
30a40 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
30a50 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20  rrmsg), errmsg, 
30a60 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28  "rename failed (
30a70 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  %d)", errno);.  
30a80 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
30a90 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  lock;.  }.  rc =
30aa0 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74   0;.  fprintf(st
30ab0 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61  derr, "broke sta
30ac0 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22  le lock on %s\n"
30ad0 2c 20 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75  , cPath);.  robu
30ae0 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
30af0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f  conchFile->h, __
30b00 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68  LINE__);.  conch
30b10 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20  File->h = fd;.  
30b20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46  conchFile->openF
30b30 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20  lags = O_RDWR | 
30b40 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72  O_CREAT;..end_br
30b50 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72  eaklock:.  if( r
30b60 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e  c ){.    if( fd>
30b70 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 69  =0 ){.      unli
30b80 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20  nk(tPath);.     
30b90 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
30ba0 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  ile, fd, __LINE_
30bb0 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  _);.    }.    fp
30bc0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
30bd0 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73  ailed to break s
30be0 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c  tale lock on %s,
30bf0 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65   %s\n", cPath, e
30c00 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65  rrmsg);.  }.  re
30c10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
30c20 61 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65  ake the requeste
30c30 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
30c40 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65  nch file and bre
30c50 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20  ak a stale lock 
30c60 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20  if the .** host 
30c70 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73  id matches..*/.s
30c80 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
30c90 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  onchLock(unixFil
30ca0 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74  e *pFile, uuid_t
30cb0 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c   myHostID, int l
30cc0 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78  ockType){.  prox
30cd0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
30ce0 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
30cf0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
30d00 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
30d10 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c  text; .  unixFil
30d20 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
30d30 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
30d40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
30d50 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69  E_OK;.  int nTri
30d60 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  es = 0;.  struct
30d70 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d   timespec conchM
30d80 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 64 6f 20  odTime;.  .  do 
30d90 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68  {.    rc = conch
30da0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
30db0 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
30dc0 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c  le*)conchFile, l
30dd0 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54  ockType);.    nT
30de0 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28  ries ++;.    if(
30df0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
30e00 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
30e10 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20  the lock failed 
30e20 28 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a  (busy):.       *
30e30 20 31 73 74 20 74 72 79 3a 20 67 65 74 20 74 68   1st try: get th
30e40 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68  e mod time of th
30e50 65 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e  e conch, wait 0.
30e60 35 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  5s and try again
30e70 2e 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20  . .       * 2nd 
30e80 74 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65  try: fail if the
30e90 20 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65   mod time change
30ea0 64 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20  d or host id is 
30eb0 64 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20  different, wait 
30ec0 0a 20 20 20 20 20 20 20 2a 20 20 20 20 20 20 20  .       *       
30ed0 20 20 20 20 31 30 20 73 65 63 20 61 6e 64 20 74      10 sec and t
30ee0 72 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20  ry again.       
30ef0 2a 20 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b  * 3rd try: break
30f00 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73   the lock unless
30f10 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61   the mod time ha
30f20 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20  s changed..     
30f30 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63    */.      struc
30f40 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
30f50 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 63 6f    if( osFstat(co
30f60 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  nchFile->h, &buf
30f70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
30f80 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
30f90 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
30fa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
30fb0 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  RR_LOCK;.      }
30fc0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  .      .      if
30fd0 28 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20  ( nTries==1 ){. 
30fe0 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54         conchModT
30ff0 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69  ime = buf.st_mti
31000 6d 65 73 70 65 63 3b 0a 20 20 20 20 20 20 20 20  mespec;.        
31010 75 73 6c 65 65 70 28 35 30 30 30 30 30 29 3b 20  usleep(500000); 
31020 2f 2a 20 77 61 69 74 20 30 2e 35 20 73 65 63 20  /* wait 0.5 sec 
31030 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b  and try the lock
31040 20 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20   again*/.       
31050 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20   continue;  .   
31060 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
31070 72 74 28 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a  rt( nTries>1 );.
31080 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d        if( conchM
31090 6f 64 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d  odTime.tv_sec !=
310a0 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65   buf.st_mtimespe
310b0 63 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20  c.tv_sec || .   
310c0 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69        conchModTi
310d0 6d 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75  me.tv_nsec != bu
310e0 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74  f.st_mtimespec.t
310f0 76 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20  v_nsec ){.      
31100 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31110 42 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BUSY;.      }.  
31120 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e      .      if( n
31130 54 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20  Tries==2 ){  .  
31140 20 20 20 20 20 20 63 68 61 72 20 74 42 75 66 5b        char tBuf[
31150 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
31160 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  N];.        int 
31170 6c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f  len = osPread(co
31180 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66  nchFile->h, tBuf
31190 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
311a0 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  LEN, 0);.       
311b0 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20   if( len<0 ){.  
311c0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
311d0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
311e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
311f0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
31200 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LOCK;.        }.
31210 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e          if( len>
31220 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
31230 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61  && tBuf[0]==(cha
31240 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52  r)PROXY_CONCHVER
31250 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20  SION){.         
31260 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20   /* don't break 
31270 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  the lock if the 
31280 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20  host id doesn't 
31290 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
312a0 20 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70     if( 0!=memcmp
312b0 28 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41  (&tBuf[PROXY_HEA
312c0 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49  DERLEN], myHostI
312d0 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  D, PROXY_HOSTIDL
312e0 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EN) ){.         
312f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
31300 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20  _BUSY;.         
31310 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
31320 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64  {.          /* d
31330 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c  on't break the l
31340 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61  ock on short rea
31350 64 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d  d or a version m
31360 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  ismatch */.     
31370 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
31380 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
31390 20 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65   }.        uslee
313a0 70 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20  p(10000000); /* 
313b0 77 61 69 74 20 31 30 20 73 65 63 20 61 6e 64 20  wait 10 sec and 
313c0 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61  try the lock aga
313d0 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  in */.        co
313e0 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d  ntinue; .      }
313f0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 61 73  .      .      as
31400 73 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20  sert( nTries==3 
31410 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
31420 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c  proxyBreakConchL
31430 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
31440 74 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tID) ){.        
31450 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
31460 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b          if( lock
31470 54 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Type==EXCLUSIVE_
31480 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  LOCK ){.        
31490 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
314a0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
314b0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
314c0 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45  conchFile, SHARE
314d0 44 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20 20  D_LOCK);        
314e0 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20    .        }.   
314f0 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a       if( !rc ){.
31500 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
31510 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
31520 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65  d->xLock((sqlite
31530 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
31540 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  e, lockType);.  
31550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
31560 20 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28      }.  } while(
31570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
31580 20 26 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a   && nTries<3 );.
31590 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
315a0 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20  }../* Takes the 
315b0 63 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20  conch by taking 
315c0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  a shared lock an
315d0 64 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65  d read the conte
315e0 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a  nts conch, if .*
315f0 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f  * lockPath is no
31600 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74  n-NULL, the host
31610 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c   ID and lock fil
31620 65 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63  e path must matc
31630 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c  h.  A NULL .** l
31640 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68  ockPath means th
31650 61 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20  at the lockPath 
31660 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  in the conch fil
31670 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69  e will be used i
31680 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49  f the .** host I
31690 44 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e  Ds match, or a n
316a0 65 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c  ew lock path wil
316b0 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61  l be generated a
316c0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
316d0 20 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20   and written to 
316e0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a  the conch file..
316f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
31700 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69  oxyTakeConch(uni
31710 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
31720 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
31730 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
31740 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
31750 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
31760 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20  ngContext; .  . 
31770 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
31780 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72  Held!=0 ){.    r
31790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
317a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e  .  }else{.    un
317b0 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
317c0 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
317d0 69 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20  ile;.    uuid_t 
317e0 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e  myHostID;.    in
317f0 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20  t pError = 0;.  
31800 20 20 63 68 61 72 20 72 65 61 64 42 75 66 5b 50    char readBuf[P
31810 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
31820 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b  ];.    char lock
31830 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
31840 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70  ;.    char *temp
31850 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b  LockPath = NULL;
31860 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
31870 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74  LITE_OK;.    int
31880 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30   createConch = 0
31890 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64  ;.    int hostId
318a0 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69  Match = 0;.    i
318b0 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a  nt readLen = 0;.
318c0 20 20 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f      int tryOldLo
318d0 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20  ckPath = 0;.    
318e0 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b  int forceNewLock
318f0 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20  Path = 0;.    . 
31900 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b     OSTRACE(("TAK
31910 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25  ECONCH  %d for %
31920 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e  s pid=%d\n", con
31930 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20  chFile->h,.     
31940 20 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c          (pCtx->l
31950 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70  ockProxyPath ? p
31960 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
31970 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20  th : ":auto:"), 
31980 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 20  getpid()));..   
31990 20 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f   rc = proxyGetHo
319a0 73 74 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26  stID(myHostID, &
319b0 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28  pError);.    if(
319c0 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49   (rc&0xff)==SQLI
319d0 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
319e0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
319f0 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20  no = pError;.   
31a00 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
31a10 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20  conch;.    }.   
31a20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68   rc = proxyConch
31a30 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f  Lock(pFile, myHo
31a40 73 74 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43  stID, SHARED_LOC
31a50 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
31a60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31a70 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
31a80 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20  conch;.    }.   
31a90 20 2f 2a 20 72 65 61 64 20 74 68 65 20 65 78 69   /* read the exi
31aa0 73 74 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65  sting conch file
31ab0 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20   */.    readLen 
31ac0 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75  = seekAndRead((u
31ad0 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69  nixFile*)conchFi
31ae0 6c 65 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20  le, 0, readBuf, 
31af0 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
31b00 4e 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64  N);.    if( read
31b10 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f  Len<0 ){.      /
31b20 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73  * I/O error: las
31b30 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
31b40 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20  ekAndRead */.   
31b50 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
31b60 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d  rno = conchFile-
31b70 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
31b80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
31b90 45 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20  ERR_READ;.      
31ba0 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
31bb0 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ch;.    }else if
31bc0 28 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58  ( readLen<=(PROX
31bd0 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58  Y_HEADERLEN+PROX
31be0 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20  Y_HOSTIDLEN) || 
31bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65  .             re
31c00 61 64 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29  adBuf[0]!=(char)
31c10 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
31c20 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61  ON ){.      /* a
31c30 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76   short read or v
31c40 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69  ersion format mi
31c50 73 6d 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20  smatch means we 
31c60 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  need to create a
31c70 20 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63   new .      ** c
31c80 6f 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20  onch file. .    
31c90 20 20 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74    */.      creat
31ca0 65 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20  eConch = 1;.    
31cb0 7d 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20  }.    /* if the 
31cc0 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 20  host id matches 
31cd0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74  and the lock pat
31ce0 68 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  h already exists
31cf0 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20   in the conch.  
31d00 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74    ** we'll try t
31d10 6f 20 75 73 65 20 74 68 65 20 70 61 74 68 20 74  o use the path t
31d20 68 65 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27  here, if we can'
31d30 74 20 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68  t open that path
31d40 2c 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20  , we'll .    ** 
31d50 72 65 74 72 79 20 77 69 74 68 20 61 20 6e 65 77  retry with a new
31d60 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20   auto-generated 
31d70 70 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20  path .    */.   
31d80 20 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65   do { /* in case
31d90 20 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20   we need to try 
31da0 61 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75  again for an :au
31db0 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66  to: named lock f
31dc0 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  ile */..      if
31dd0 28 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 26  ( !createConch &
31de0 26 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50  & !forceNewLockP
31df0 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 68  ath ){.        h
31e00 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 21 6d 65  ostIdMatch = !me
31e10 6d 63 6d 70 28 26 72 65 61 64 42 75 66 5b 50 52  mcmp(&readBuf[PR
31e20 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20  OXY_HEADERLEN], 
31e30 6d 79 48 6f 73 74 49 44 2c 20 0a 20 20 20 20 20  myHostID, .     
31e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e50 20 20 20 20 20 20 20 20 20 20 20 20 20 50 52 4f               PRO
31e60 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20  XY_HOSTIDLEN);. 
31e70 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65         /* if the
31e80 20 63 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20   conch has data 
31e90 63 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74  compare the cont
31ea0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
31eb0 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50  if( !pCtx->lockP
31ec0 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20  roxyPath ){.    
31ed0 20 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74        /* for aut
31ee0 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f  o-named local lo
31ef0 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68  ck file, just ch
31f00 65 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20  eck the host ID 
31f10 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20  and we'll.      
31f20 20 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20       ** use the 
31f30 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20  local lock file 
31f40 70 61 74 68 20 74 68 61 74 27 73 20 61 6c 72 65  path that's alre
31f50 61 64 79 20 69 6e 20 74 68 65 72 65 0a 20 20 20  ady in there.   
31f60 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
31f70 20 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d       if( hostIdM
31f80 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
31f90 20 20 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c      size_t pathL
31fa0 65 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20  en = (readLen - 
31fb0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29  PROXY_PATHINDEX)
31fc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  ;.            . 
31fd0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
31fe0 61 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c  athLen>=MAXPATHL
31ff0 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EN ){.          
32000 20 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50      pathLen=MAXP
32010 41 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20  ATHLEN-1;.      
32020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32030 20 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50      memcpy(lockP
32040 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52  ath, &readBuf[PR
32050 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20  OXY_PATHINDEX], 
32060 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20  pathLen);.      
32070 20 20 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70        lockPath[p
32080 61 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20  athLen] = 0;.   
32090 20 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63           tempLoc
320a0 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68  kPath = lockPath
320b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ;.            tr
320c0 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31  yOldLockPath = 1
320d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;.            /*
320e0 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f   create a copy o
320f0 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20  f the lock path 
32100 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20  if the conch is 
32110 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20  taken */.       
32120 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
32130 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20  keconch;.       
32140 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
32150 73 65 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74  se if( hostIdMat
32160 63 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ch.             
32170 20 20 26 26 20 21 73 74 72 6e 63 6d 70 28 70 43    && !strncmp(pC
32180 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
32190 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58  h, &readBuf[PROX
321a0 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20  Y_PATHINDEX],.  
321b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321c0 20 20 20 20 20 20 20 20 20 72 65 61 64 4c 65 6e           readLen
321d0 2d 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  -PROXY_PATHINDEX
321e0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
321f0 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20         /* conch 
32200 68 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61  host and lock pa
32210 74 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  th match */.    
32220 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
32230 61 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20  akeconch; .     
32240 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
32250 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 69 66 20     .      /* if 
32260 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20  the conch isn't 
32270 77 72 69 74 61 62 6c 65 20 61 6e 64 20 64 6f 65  writable and doe
32280 73 6e 27 74 20 6d 61 74 63 68 2c 20 77 65 20 63  sn't match, we c
32290 61 6e 27 74 20 74 61 6b 65 20 69 74 20 2a 2f 0a  an't take it */.
322a0 20 20 20 20 20 20 69 66 28 20 28 63 6f 6e 63 68        if( (conch
322b0 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26  File->openFlags&
322c0 4f 5f 52 44 57 52 29 20 3d 3d 20 30 20 29 7b 0a  O_RDWR) == 0 ){.
322d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
322e0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
322f0 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
32300 6f 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20  onch;.      }.  
32310 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 65 69      .      /* ei
32320 74 68 65 72 20 74 68 65 20 63 6f 6e 63 68 20 64  ther the conch d
32330 69 64 6e 27 74 20 6d 61 74 63 68 20 6f 72 20 77  idn't match or w
32340 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  e need to create
32350 20 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20   a new one */.  
32360 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c      if( !pCtx->l
32370 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
32380 20 20 20 20 20 20 20 20 70 72 6f 78 79 47 65 74          proxyGet
32390 4c 6f 63 6b 50 61 74 68 28 70 43 74 78 2d 3e 64  LockPath(pCtx->d
323a0 62 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c  bPath, lockPath,
323b0 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
323c0 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61        tempLockPa
323d0 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20  th = lockPath;. 
323e0 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65         /* create
323f0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c   a copy of the l
32400 6f 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79 5f 20  ock path _only_ 
32410 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20  if the conch is 
32420 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d  taken */.      }
32430 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a  .      .      /*
32440 20 75 70 64 61 74 65 20 63 6f 6e 63 68 20 77 69   update conch wi
32450 74 68 20 68 6f 73 74 20 61 6e 64 20 70 61 74 68  th host and path
32460 20 28 74 68 69 73 20 77 69 6c 6c 20 66 61 69 6c   (this will fail
32470 20 69 66 20 6f 74 68 65 72 20 70 72 6f 63 65 73   if other proces
32480 73 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61  s.      ** has a
32490 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72   shared lock alr
324a0 65 61 64 79 29 2c 20 69 66 20 74 68 65 20 68 6f  eady), if the ho
324b0 73 74 20 69 64 20 6d 61 74 63 68 65 73 2c 20 75  st id matches, u
324c0 73 65 20 74 68 65 20 62 69 67 0a 20 20 20 20 20  se the big.     
324d0 20 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20 20 20   ** stick..     
324e0 20 2a 2f 0a 20 20 20 20 20 20 66 75 74 69 6d 65   */.      futime
324f0 73 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  s(conchFile->h, 
32500 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28  NULL);.      if(
32510 20 68 6f 73 74 49 64 4d 61 74 63 68 20 26 26 20   hostIdMatch && 
32520 21 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a  !createConch ){.
32530 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63          if( conc
32540 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26  hFile->pInode &&
32550 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f   conchFile->pIno
32560 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b  de->nShared>1 ){
32570 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
32580 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20   are trying for 
32590 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
325a0 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68  k but another th
325b0 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20  read in this.   
325c0 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20          ** same 
325d0 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
325e0 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65   holding a share
325f0 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20  d lock. */.     
32600 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
32610 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
32620 20 65 6c 73 65 20 7b 20 20 20 20 20 20 20 20 20   else {         
32630 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d   .          rc =
32640 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28   proxyConchLock(
32650 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c  pFile, myHostID,
32660 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
32670 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32690 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
326a0 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
326b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
326c0 6f 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c 55 53  onchFile, EXCLUS
326d0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
326e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
326f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32700 20 20 20 20 20 20 63 68 61 72 20 77 72 69 74 65        char write
32710 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58  Buffer[PROXY_MAX
32720 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20  CONCHLEN];.     
32730 20 20 20 69 6e 74 20 77 72 69 74 65 53 69 7a 65     int writeSize
32740 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 0a 20   = 0;.        . 
32750 20 20 20 20 20 20 20 77 72 69 74 65 42 75 66 66         writeBuff
32760 65 72 5b 30 5d 20 3d 20 28 63 68 61 72 29 50 52  er[0] = (char)PR
32770 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
32780 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
32790 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52  (&writeBuffer[PR
327a0 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20  OXY_HEADERLEN], 
327b0 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f  myHostID, PROXY_
327c0 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20  HOSTIDLEN);.    
327d0 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f      if( pCtx->lo
327e0 63 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c  ckProxyPath!=NUL
327f0 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  L ){.          s
32800 74 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66  trlcpy(&writeBuf
32810 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  fer[PROXY_PATHIN
32820 44 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b  DEX], pCtx->lock
32830 50 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41  ProxyPath, MAXPA
32840 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20  THLEN);.        
32850 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
32860 20 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42   strlcpy(&writeB
32870 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48  uffer[PROXY_PATH
32880 49 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b  INDEX], tempLock
32890 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
328a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
328b0 20 20 20 20 20 77 72 69 74 65 53 69 7a 65 20 3d       writeSize =
328c0 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58   PROXY_PATHINDEX
328d0 20 2b 20 73 74 72 6c 65 6e 28 26 77 72 69 74 65   + strlen(&write
328e0 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54  Buffer[PROXY_PAT
328f0 48 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20 20 20  HINDEX]);.      
32900 20 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61    robust_ftrunca
32910 74 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  te(conchFile->h,
32920 20 77 72 69 74 65 53 69 7a 65 29 3b 0a 20 20 20   writeSize);.   
32930 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 57 72       rc = unixWr
32940 69 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ite((sqlite3_fil
32950 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77  e *)conchFile, w
32960 72 69 74 65 42 75 66 66 65 72 2c 20 77 72 69 74  riteBuffer, writ
32970 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20  eSize, 0);.     
32980 20 20 20 66 73 79 6e 63 28 63 6f 6e 63 68 46 69     fsync(conchFi
32990 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 20 20  le->h);.        
329a0 2f 2a 20 49 66 20 77 65 20 63 72 65 61 74 65 64  /* If we created
329b0 20 61 20 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c   a new conch fil
329c0 65 20 28 6e 6f 74 20 6a 75 73 74 20 75 70 64 61  e (not just upda
329d0 74 65 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ted the contents
329e0 20 6f 66 20 61 20 0a 20 20 20 20 20 20 20 20 20   of a .         
329f0 2a 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68 20 66  ** valid conch f
32a00 69 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d 61 74  ile), try to mat
32a10 63 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  ch the permissio
32a20 6e 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ns of the databa
32a30 73 65 20 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a  se .         */.
32a40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
32a50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 72 65  SQLITE_OK && cre
32a60 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20  ateConch ){.    
32a70 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
32a80 74 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20  t buf;.         
32a90 20 69 6e 74 20 65 72 72 20 3d 20 6f 73 46 73 74   int err = osFst
32aa0 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
32ab0 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  f);.          if
32ac0 28 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  ( err==0 ){.    
32ad0 20 20 20 20 20 20 20 20 6d 6f 64 65 5f 74 20 63          mode_t c
32ae0 6d 6f 64 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f  mode = buf.st_mo
32af0 64 65 26 28 53 5f 49 52 55 53 52 7c 53 5f 49 57  de&(S_IRUSR|S_IW
32b00 55 53 52 20 7c 20 53 5f 49 52 47 52 50 7c 53 5f  USR | S_IRGRP|S_
32b10 49 57 47 52 50 20 7c 0a 20 20 20 20 20 20 20 20  IWGRP |.        
32b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b40 53 5f 49 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29  S_IROTH|S_IWOTH)
32b50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;.            /*
32b60 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68   try to match th
32b70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
32b80 52 2f 57 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c  R/W permissions,
32b90 20 69 67 6e 6f 72 65 20 66 61 69 6c 75 72 65 20   ignore failure 
32ba0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
32bb0 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 20 20  E_PROXY_DEBUG.  
32bc0 20 20 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d            osFchm
32bd0 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  od(conchFile->h,
32be0 20 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20   cmode);.#else. 
32bf0 20 20 20 20 20 20 20 20 20 20 20 64 6f 7b 0a 20             do{. 
32c00 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
32c10 3d 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68  = osFchmod(conch
32c20 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b  File->h, cmode);
32c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 77 68  .            }wh
32c40 69 6c 65 28 20 72 63 3d 3d 28 2d 31 29 20 26 26  ile( rc==(-1) &&
32c50 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
32c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
32c70 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
32c80 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65          int code
32c90 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
32ca0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
32cb0 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20  stderr, "fchmod 
32cc0 25 6f 20 46 41 49 4c 45 44 20 77 69 74 68 20 25  %o FAILED with %
32cd0 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
32ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
32cf0 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74 72 65  mode, code, stre
32d00 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20 20  rror(code));.   
32d10 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
32d20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
32d30 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
32d40 22 66 63 68 6d 6f 64 20 25 6f 20 53 55 43 43 45  "fchmod %o SUCCE
32d50 44 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20  DED\n",cmode);. 
32d60 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
32d70 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
32d80 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f            int co
32d90 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  de = errno;.    
32da0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
32db0 73 74 64 65 72 72 2c 20 22 53 54 41 54 20 46 41  stderr, "STAT FA
32dc0 49 4c 45 44 5b 25 64 5d 20 77 69 74 68 20 25 64  ILED[%d] with %d
32dd0 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20   %s\n", .       
32de0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
32df0 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72  , code, strerror
32e00 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a  (code));.#endif.
32e10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32e20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
32e30 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70      conchFile->p
32e40 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
32e50 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
32e60 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44  onchFile, SHARED
32e70 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20  _LOCK);.      . 
32e80 20 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68     end_takeconch
32e90 3a 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  :.      OSTRACE(
32ea0 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c  ("TRANSPROXY: CL
32eb0 4f 53 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c  OSE  %d\n", pFil
32ec0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 69 66  e->h));.      if
32ed0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32ee0 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  && pFile->openFl
32ef0 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ags ){.        i
32f00 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29  f( pFile->h>=0 )
32f10 7b 0a 20 20 20 20 20 20 20 20 20 20 72 6f 62 75  {.          robu
32f20 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
32f30 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  pFile->h, __LINE
32f40 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  __);.        }. 
32f50 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20         pFile->h 
32f60 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 6e  = -1;.        in
32f70 74 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70  t fd = robust_op
32f80 65 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c  en(pCtx->dbPath,
32f90 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67   pFile->openFlag
32fa0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
32fb0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
32fc0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
32fd0 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20  MISSIONS);.     
32fe0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41     OSTRACE(("TRA
32ff0 4e 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25  NSPROXY: OPEN  %
33000 64 5c 6e 22 2c 20 66 64 29 29 3b 0a 20 20 20 20  d\n", fd));.    
33010 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
33020 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
33030 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20 20 20  ->h = fd;.      
33040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
33050 20 20 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e     rc=SQLITE_CAN
33060 54 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53  TOPEN_BKPT; /* S
33070 51 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f 78  QLITE_BUSY? prox
33080 79 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65  yTakeConch calle
33090 64 0a 20 20 20 20 20 20 20 20 20 20 20 64 75 72  d.           dur
330a0 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  ing locking */. 
330b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
330c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
330d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43 74  QLITE_OK && !pCt
330e0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a  x->lockProxy ){.
330f0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 61          char *pa
33100 74 68 20 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74  th = tempLockPat
33110 68 20 3f 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  h ? tempLockPath
33120 20 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   : pCtx->lockPro
33130 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20  xyPath;.        
33140 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65  rc = proxyCreate
33150 55 6e 69 78 46 69 6c 65 28 70 61 74 68 2c 20 26  UnixFile(path, &
33160 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c  pCtx->lockProxy,
33170 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
33180 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
33190 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
331a0 45 4d 20 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b  EM && tryOldLock
331b0 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
331c0 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74    /* we couldn't
331d0 20 63 72 65 61 74 65 20 74 68 65 20 70 72 6f 78   create the prox
331e0 79 20 6c 6f 63 6b 20 66 69 6c 65 20 77 69 74 68  y lock file with
331f0 20 74 68 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69   the old lock fi
33200 6c 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20  le path.        
33210 20 20 20 2a 2a 20 73 6f 20 74 72 79 20 61 67 61     ** so try aga
33220 69 6e 20 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69  in via auto-nami
33230 6e 67 20 0a 20 20 20 20 20 20 20 20 20 20 20 2a  ng .           *
33240 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 63  /.          forc
33250 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31  eNewLockPath = 1
33260 3b 0a 20 20 20 20 20 20 20 20 20 20 74 72 79 4f  ;.          tryO
33270 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ldLockPath = 0;.
33280 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
33290 75 65 3b 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74  ue; /* go back t
332a0 6f 20 74 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c  o the do {} whil
332b0 65 20 73 74 61 72 74 20 70 6f 69 6e 74 2c 20 74  e start point, t
332c0 72 79 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20  ry again */.    
332d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
332e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
332f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33300 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
33310 20 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68 20   a copy of path 
33320 69 66 20 77 65 20 65 78 74 72 61 63 74 65 64 20  if we extracted 
33330 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
33340 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63     ** from the c
33350 6f 6e 63 68 20 66 69 6c 65 20 6f 72 20 74 68 65  onch file or the
33360 20 70 61 74 68 20 77 61 73 20 61 6c 6c 6f 63 61   path was alloca
33370 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  ted on the stack
33380 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  .         */.   
33390 20 20 20 20 20 69 66 28 20 74 65 6d 70 4c 6f 63       if( tempLoc
333a0 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  kPath ){.       
333b0 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
333c0 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  xyPath = sqlite3
333d0 44 62 53 74 72 44 75 70 28 30 2c 20 74 65 6d 70  DbStrDup(0, temp
333e0 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 20  LockPath);.     
333f0 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e       if( !pCtx->
33400 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
33410 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
33420 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
33430 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33440 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
33450 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
33460 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33470 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
33480 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20   = 1;.        . 
33490 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d         if( pCtx-
334a0 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74  >lockProxy->pMet
334b0 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74  hod == &afpIoMet
334c0 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20  hods ){.        
334d0 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
334e0 65 78 74 20 2a 61 66 70 43 74 78 3b 0a 20 20 20  ext *afpCtx;.   
334f0 20 20 20 20 20 20 20 61 66 70 43 74 78 20 3d 20         afpCtx = 
33500 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
33510 78 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50  xt *)pCtx->lockP
33520 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  roxy->lockingCon
33530 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  text;.          
33540 61 66 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d  afpCtx->dbPath =
33550 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
33560 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Path;.        }.
33570 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
33580 20 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65         conchFile
33590 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
335a0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
335b0 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f  *)conchFile, NO_
335c0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
335d0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
335e0 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c  AKECONCH  %d %s\
335f0 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  n", conchFile->h
33600 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33610 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22   rc==SQLITE_OK?"
33620 6f 6b 22 3a 22 66 61 69 6c 65 64 22 29 29 3b 0a  ok":"failed"));.
33630 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
33640 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 31 29  .    } while (1)
33650 3b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20  ; /* in case we 
33660 6e 65 65 64 20 74 6f 20 72 65 74 72 79 20 74 68  need to retry th
33670 65 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b 20 66 69  e :auto: lock fi
33680 6c 65 20 2d 20 0a 20 20 20 20 20 20 20 20 20 20  le - .          
33690 20 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f         ** we sho
336a0 75 6c 64 20 6e 65 76 65 72 20 67 65 74 20 68 65  uld never get he
336b0 72 65 20 65 78 63 65 70 74 20 76 69 61 20 74 68  re except via th
336c0 65 20 27 63 6f 6e 74 69 6e 75 65 27 20 63 61 6c  e 'continue' cal
336d0 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  l. */.  }.}../*.
336e0 2a 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c 64  ** If pFile hold
336f0 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f  s a lock on a co
33700 6e 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20 72  nch file, then r
33710 65 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63 6b  elease that lock
33720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33730 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63  proxyReleaseConc
33740 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  h(unixFile *pFil
33750 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
33760 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
33770 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
33780 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
33790 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
337a0 74 65 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a 20  text *pCtx;  /* 
337b0 54 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  The locking cont
337c0 65 78 74 20 66 6f 72 20 74 68 65 20 70 72 6f 78  ext for the prox
337d0 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69 78  y lock */.  unix
337e0 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b  File *conchFile;
337f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
33800 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  of the conch fil
33810 65 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20 28  e */..  pCtx = (
33820 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
33830 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
33840 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63  kingContext;.  c
33850 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d  onchFile = pCtx-
33860 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f 53  >conchFile;.  OS
33870 54 52 41 43 45 28 28 22 52 45 4c 45 41 53 45 43  TRACE(("RELEASEC
33880 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20  ONCH  %d for %s 
33890 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68  pid=%d\n", conch
338a0 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
338b0 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50      (pCtx->lockP
338c0 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d  roxyPath ? pCtx-
338d0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a  >lockProxyPath :
338e0 20 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20   ":auto:"), .   
338f0 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29          getpid()
33900 29 29 3b 0a 20 20 69 66 28 20 70 43 74 78 2d 3e  ));.  if( pCtx->
33910 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20  conchHeld>0 ){. 
33920 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
33930 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
33940 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
33950 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f  e*)conchFile, NO
33960 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 70 43  _LOCK);.  }.  pC
33970 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20  tx->conchHeld = 
33980 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  0;.  OSTRACE(("R
33990 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20  ELEASECONCH  %d 
339a0 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %s\n", conchFile
339b0 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
339c0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f  (rc==SQLITE_OK ?
339d0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
339e0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
339f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
33a00 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
33a10 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 63 6f  atabase file, co
33a20 6d 70 75 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  mpute the name o
33a30 66 20 69 74 73 20 63 6f 6e 63 68 20 66 69 6c 65  f its conch file
33a40 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 63  ..** Store the c
33a50 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 69 6e  onch filename in
33a60 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
33a70 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
33a80 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20  lloc()..** Make 
33a90 2a 70 43 6f 6e 63 68 50 61 74 68 20 70 6f 69 6e  *pConchPath poin
33aa0 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 61 6d  t to the new nam
33ab0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
33ac0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
33ad0 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ** or SQLITE_NOM
33ae0 45 4d 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  EM if unable to 
33af0 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  obtain memory..*
33b00 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
33b10 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
33b20 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74  or ensuring that
33b30 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d   the allocated m
33b40 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20 69  emory.** space i
33b50 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  s eventually fre
33b60 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63  ed..**.** *pConc
33b70 68 50 61 74 68 20 69 73 20 73 65 74 20 74 6f 20  hPath is set to 
33b80 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f 72 79  NULL if a memory
33b90 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
33ba0 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  r occurs..*/.sta
33bb0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65  tic int proxyCre
33bc0 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65  ateConchPathname
33bd0 28 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63  (char *dbPath, c
33be0 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61 74 68  har **pConchPath
33bf0 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
33c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c10 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
33c20 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 20  er */.  int len 
33c30 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62  = (int)strlen(db
33c40 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67 74 68  Path); /* Length
33c50 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   of database fil
33c60 65 6e 61 6d 65 20 2d 20 64 62 50 61 74 68 20 2a  ename - dbPath *
33c70 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 50  /.  char *conchP
33c80 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
33c90 20 20 2f 2a 20 62 75 66 66 65 72 20 69 6e 20 77    /* buffer in w
33ca0 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63  hich to construc
33cb0 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a  t conch name */.
33cc0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
33cd0 70 61 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  pace for the con
33ce0 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  ch filename and 
33cf0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e  initialize the n
33d00 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ame to.  ** the 
33d10 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 72 69 67  name of the orig
33d20 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
33d30 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e  le. */  .  *pCon
33d40 63 68 50 61 74 68 20 3d 20 63 6f 6e 63 68 50 61  chPath = conchPa
33d50 74 68 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  th = (char *)sql
33d60 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20  ite3_malloc(len 
33d70 2b 20 38 29 3b 0a 20 20 69 66 28 20 63 6f 6e 63  + 8);.  if( conc
33d80 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20  hPath==0 ){.    
33d90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
33da0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70  MEM;.  }.  memcp
33db0 79 28 63 6f 6e 63 68 50 61 74 68 2c 20 64 62 50  y(conchPath, dbP
33dc0 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a  ath, len+1);.  .
33dd0 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72 74 20    /* now insert 
33de0 61 20 22 2e 22 20 62 65 66 6f 72 65 20 74 68 65  a "." before the
33df0 20 6c 61 73 74 20 2f 20 63 68 61 72 61 63 74 65   last / characte
33e00 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d 28 6c  r */.  for( i=(l
33e10 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d  en-1); i>=0; i--
33e20 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6e 63   ){.    if( conc
33e30 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b  hPath[i]=='/' ){
33e40 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
33e50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
33e60 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68 5b 69   }.  conchPath[i
33e70 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65 20 28  ]='.';.  while (
33e80 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 63 6f   i<len ){.    co
33e90 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64 62 50  nchPath[i+1]=dbP
33ea0 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b  ath[i];.    i++;
33eb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65 6e  .  }..  /* appen
33ec0 64 20 74 68 65 20 22 2d 63 6f 6e 63 68 22 20 73  d the "-conch" s
33ed0 75 66 66 69 78 20 74 6f 20 74 68 65 20 66 69 6c  uffix to the fil
33ee0 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 63  e */.  memcpy(&c
33ef0 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c 20 22  onchPath[i+1], "
33f00 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20 20 61  -conch", 7);.  a
33f10 73 73 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c  ssert( (int)strl
33f20 65 6e 28 63 6f 6e 63 68 50 61 74 68 29 20 3d 3d  en(conchPath) ==
33f30 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72 65 74   len+7 );..  ret
33f40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
33f50 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20 66 75  .../* Takes a fu
33f60 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 70  lly configured p
33f70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73 74 79  roxy locking-sty
33f80 6c 65 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64  le unix file and
33f90 20 73 77 69 74 63 68 65 73 0a 2a 2a 20 74 68 65   switches.** the
33fa0 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65   local lock file
33fb0 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74 69 63   path .*/.static
33fc0 20 69 6e 74 20 73 77 69 74 63 68 4c 6f 63 6b 50   int switchLockP
33fd0 72 6f 78 79 50 61 74 68 28 75 6e 69 78 46 69 6c  roxyPath(unixFil
33fe0 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20  e *pFile, const 
33ff0 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20  char *path) {.  
34000 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
34010 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
34020 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
34030 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
34040 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61 72 20  Context;.  char 
34050 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43 74 78 2d  *oldPath = pCtx-
34060 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a  >lockProxyPath;.
34070 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
34080 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 46 69  E_OK;..  if( pFi
34090 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
340a0 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  O_LOCK ){.    re
340b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
340c0 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f  ;.  }  ..  /* no
340d0 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 66 20 74  thing to do if t
340e0 68 65 20 70 61 74 68 20 69 73 20 4e 55 4c 4c 2c  he path is NULL,
340f0 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74 63 68   :auto: or match
34100 65 73 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  es the existing 
34110 70 61 74 68 20 2a 2f 0a 20 20 69 66 28 20 21 70  path */.  if( !p
34120 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d  ath || path[0]==
34130 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28  '\0' || !strcmp(
34140 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20  path, ":auto:") 
34150 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74 68 20  ||.    (oldPath 
34160 26 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64 50  && !strncmp(oldP
34170 61 74 68 2c 20 70 61 74 68 2c 20 4d 41 58 50 41  ath, path, MAXPA
34180 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20 20 72  THLEN)) ){.    r
34190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
341a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e  .  }else{.    un
341b0 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78  ixFile *lockProx
341c0 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
341d0 6f 78 79 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c  oxy;.    pCtx->l
341e0 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20  ockProxy=NULL;. 
341f0 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65     pCtx->conchHe
34200 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ld = 0;.    if( 
34210 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c 20  lockProxy!=NULL 
34220 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f 63 6b  ){.      rc=lock
34230 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  Proxy->pMethod->
34240 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  xClose((sqlite3_
34250 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f 78 79  file *)lockProxy
34260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
34270 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
34280 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
34290 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20  lockProxy);.    
342a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
342b0 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20 20 20  ee(oldPath);.   
342c0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
342d0 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62  Path = sqlite3Db
342e0 53 74 72 44 75 70 28 30 2c 20 70 61 74 68 29 3b  StrDup(0, path);
342f0 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e  .  }.  .  return
34300 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46   rc;.}../*.** pF
34310 69 6c 65 20 69 73 20 61 20 66 69 6c 65 20 74 68  ile is a file th
34320 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e  at has been open
34330 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 78 4f  ed by a prior xO
34340 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50 61 74  pen call.  dbPat
34350 68 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67  h.** is a string
34360 20 62 75 66 66 65 72 20 61 74 20 6c 65 61 73 74   buffer at least
34370 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20 63 68   MAXPATHLEN+1 ch
34380 61 72 61 63 74 65 72 73 20 69 6e 20 73 69 7a 65  aracters in size
34390 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
343a0 74 69 6e 65 20 66 69 6e 64 20 74 68 65 20 66 69  tine find the fi
343b0 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69 61 74 65  lename associate
343c0 64 20 77 69 74 68 20 70 46 69 6c 65 20 61 6e 64  d with pFile and
343d0 20 77 72 69 74 65 73 20 69 74 0a 2a 2a 20 69 6e   writes it.** in
343e0 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73 74 61  t dbPath..*/.sta
343f0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
34400 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c  DbPathForUnixFil
34410 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
34420 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68 29  e, char *dbPath)
34430 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  {.#if defined(__
34440 41 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28 20 70  APPLE__).  if( p
34450 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d  File->pMethod ==
34460 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29   &afpIoMethods )
34470 7b 0a 20 20 20 20 2f 2a 20 61 66 70 20 73 74 79  {.    /* afp sty
34480 6c 65 20 6b 65 65 70 73 20 61 20 72 65 66 65 72  le keeps a refer
34490 65 6e 63 65 20 74 6f 20 74 68 65 20 64 62 20 70  ence to the db p
344a0 61 74 68 20 69 6e 20 74 68 65 20 66 69 6c 65 50  ath in the fileP
344b0 61 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20 2a  ath field .    *
344c0 2a 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 20  * of the struct 
344d0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
344e0 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 68 61 72  int)strlen((char
344f0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
34500 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54  Context)<=MAXPAT
34510 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c  HLEN );.    strl
34520 63 70 79 28 64 62 50 61 74 68 2c 20 28 28 61 66  cpy(dbPath, ((af
34530 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
34540 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
34550 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74 68  Context)->dbPath
34560 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
34570 20 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20   } else.#endif. 
34580 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74   if( pFile->pMet
34590 68 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49  hod == &dotlockI
345a0 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
345b0 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79 6c  /* dot lock styl
345c0 65 20 75 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  e uses the locki
345d0 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74  ng context to st
345e0 6f 72 65 20 74 68 65 20 64 6f 74 20 6c 6f 63 6b  ore the dot lock
345f0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 70 61 74  .    ** file pat
34600 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e  h */.    int len
34610 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20   = strlen((char 
34620 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
34630 43 6f 6e 74 65 78 74 29 20 2d 20 73 74 72 6c 65  Context) - strle
34640 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  n(DOTLOCK_SUFFIX
34650 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62  );.    memcpy(db
34660 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46  Path, (char *)pF
34670 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
34680 65 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20  ext, len + 1);. 
34690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 61   }else{.    /* a
346a0 6c 6c 20 6f 74 68 65 72 20 73 74 79 6c 65 73 20  ll other styles 
346b0 75 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  use the locking 
346c0 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65  context to store
346d0 20 74 68 65 20 64 62 20 66 69 6c 65 20 70 61 74   the db file pat
346e0 68 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  h */.    assert(
346f0 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70   strlen((char*)p
34700 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
34710 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45  text)<=MAXPATHLE
34720 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79  N );.    strlcpy
34730 28 64 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a  (dbPath, (char *
34740 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34750 6f 6e 74 65 78 74 2c 20 4d 41 58 50 41 54 48 4c  ontext, MAXPATHL
34760 45 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  EN);.  }.  retur
34770 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
34780 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61  /*.** Takes an a
34790 6c 72 65 61 64 79 20 66 69 6c 6c 65 64 20 69 6e  lready filled in
347a0 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 61   unix file and a
347b0 6c 74 65 72 73 20 69 74 20 73 6f 20 61 6c 6c 20  lters it so all 
347c0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a  file locking .**
347d0 20 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d   will be perform
347e0 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ed on the local 
347f0 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e  proxy lock file.
34800 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
34810 66 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70 72  fields.** are pr
34820 65 73 65 72 76 65 64 20 69 6e 20 74 68 65 20 6c  eserved in the l
34830 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 73  ocking context s
34840 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20  o that they can 
34850 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20  be restored and 
34860 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20 73 74 72  .** the unix str
34870 75 63 74 75 72 65 20 70 72 6f 70 65 72 6c 79 20  ucture properly 
34880 63 6c 65 61 6e 65 64 20 75 70 20 61 74 20 63 6c  cleaned up at cl
34890 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e  ose time:.**  ->
348a0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 2a  lockingContext.*
348b0 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a  *  ->pMethod.*/.
348c0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
348d0 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
348e0 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
348f0 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  e, const char *p
34900 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f  ath) {.  proxyLo
34910 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
34920 74 78 3b 0a 20 20 63 68 61 72 20 64 62 50 61 74  tx;.  char dbPat
34930 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d 3b  h[MAXPATHLEN+1];
34940 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
34950 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
34960 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c  ile */.  char *l
34970 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20  ockPath=NULL;.  
34980 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
34990 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46 69  OK;.  .  if( pFi
349a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
349b0 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  O_LOCK ){.    re
349c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
349d0 3b 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47 65 74  ;.  }.  proxyGet
349e0 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c  DbPathForUnixFil
349f0 65 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68 29  e(pFile, dbPath)
34a00 3b 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c  ;.  if( !path ||
34a10 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c   path[0]=='\0' |
34a20 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20  | !strcmp(path, 
34a30 22 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20  ":auto:") ){.   
34a40 20 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a   lockPath=NULL;.
34a50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63    }else{.    loc
34a60 6b 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70 61  kPath=(char *)pa
34a70 74 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54  th;.  }.  .  OST
34a80 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58  RACE(("TRANSPROX
34a90 59 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64  Y  %d for %s pid
34aa0 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
34ab0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c 6f  ,.           (lo
34ac0 63 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74  ckPath ? lockPat
34ad0 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67  h : ":auto:"), g
34ae0 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 70 43  etpid()));..  pC
34af0 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  tx = sqlite3_mal
34b00 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74  loc( sizeof(*pCt
34b10 78 29 20 29 3b 0a 20 20 69 66 28 20 70 43 74 78  x) );.  if( pCtx
34b20 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
34b30 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
34b40 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 74    }.  memset(pCt
34b50 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43  x, 0, sizeof(*pC
34b60 74 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72  tx));..  rc = pr
34b70 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61  oxyCreateConchPa
34b80 74 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20 26  thname(dbPath, &
34b90 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
34ba0 61 74 68 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ath);.  if( rc==
34bb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34bc0 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74   rc = proxyCreat
34bd0 65 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d 3e  eUnixFile(pCtx->
34be0 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26  conchFilePath, &
34bf0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c  pCtx->conchFile,
34c00 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
34c10 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
34c20 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f 70 65   && ((pFile->ope
34c30 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d  nFlags&O_RDWR) =
34c40 3d 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  = 0) ){.      /*
34c50 20 69 66 20 28 61 29 20 74 68 65 20 6f 70 65 6e   if (a) the open
34c60 20 66 6c 61 67 73 20 61 72 65 20 6e 6f 74 20 4f   flags are not O
34c70 5f 52 44 57 52 2c 20 28 62 29 20 74 68 65 20 63  _RDWR, (b) the c
34c80 6f 6e 63 68 20 69 73 6e 27 74 20 74 68 65 72 65  onch isn't there
34c90 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28  , and.      ** (
34ca0 63 29 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  c) the file syst
34cb0 65 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c  em is read-only,
34cc0 20 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d   then enable no-
34cd0 6c 6f 63 6b 69 6e 67 20 61 63 63 65 73 73 2e 0a  locking access..
34ce0 20 20 20 20 20 20 2a 2a 20 55 67 68 2c 20 73 69        ** Ugh, si
34cf0 6e 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78  nce O_RDONLY==0x
34d00 30 30 30 30 20 77 65 20 74 65 73 74 20 66 6f 72  0000 we test for
34d10 20 21 4f 5f 52 44 57 52 20 73 69 6e 63 65 20 75   !O_RDWR since u
34d20 6e 69 78 4f 70 65 6e 20 61 73 73 65 72 74 73 0a  nixOpen asserts.
34d30 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70        ** that op
34d40 65 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68 61 76  enFlags will hav
34d50 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f  e only one of O_
34d60 52 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44 57 52  RDONLY or O_RDWR
34d70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
34d80 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
34d90 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  sInfo;.      str
34da0 75 63 74 20 73 74 61 74 20 63 6f 6e 63 68 49 6e  uct stat conchIn
34db0 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 67 6f  fo;.      int go
34dc0 4c 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a 20  Lockless = 0;.. 
34dd0 20 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28       if( osStat(
34de0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
34df0 61 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29  ath, &conchInfo)
34e00 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20   == -1 ) {.     
34e10 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72     int err = err
34e20 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  no;.        if( 
34e30 28 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26  (err==ENOENT) &&
34e40 20 28 73 74 61 74 66 73 28 64 62 50 61 74 68 2c   (statfs(dbPath,
34e50 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29   &fsInfo) != -1)
34e60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
34e70 4c 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e  Lockless = (fsIn
34e80 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52  fo.f_flags&MNT_R
34e90 44 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44  DONLY) == MNT_RD
34ea0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ONLY;.        }.
34eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
34ec0 28 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a  ( goLockless ){.
34ed0 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f          pCtx->co
34ee0 6e 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a  nchHeld = -1; /*
34ef0 20 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c   read only FS/ l
34f00 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20  ockless */.     
34f10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
34f20 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
34f30 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 72 63 3d  .  }  .  if( rc=
34f40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f  =SQLITE_OK && lo
34f50 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 70 43  ckPath ){.    pC
34f60 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
34f70 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  h = sqlite3DbStr
34f80 44 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29  Dup(0, lockPath)
34f90 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
34fa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34fb0 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d    pCtx->dbPath =
34fc0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
34fd0 28 30 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 20  (0, dbPath);.   
34fe0 20 69 66 28 20 70 43 74 78 2d 3e 64 62 50 61 74   if( pCtx->dbPat
34ff0 68 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  h==NULL ){.     
35000 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
35010 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
35020 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35030 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20  K ){.    /* all 
35040 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61  memory is alloca
35050 74 65 64 2c 20 70 72 6f 78 79 73 20 61 72 65 20  ted, proxys are 
35060 63 72 65 61 74 65 64 20 61 6e 64 20 61 73 73 69  created and assi
35070 67 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77  gned, .    ** sw
35080 69 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67  itch the locking
35090 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65   context and pMe
350a0 74 68 6f 64 20 74 68 65 6e 20 72 65 74 75 72 6e  thod then return
350b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 74  ..    */.    pCt
350c0 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e  x->oldLockingCon
350d0 74 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  text = pFile->lo
350e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
350f0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67    pFile->locking
35100 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 3b 0a  Context = pCtx;.
35110 20 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65      pCtx->pOldMe
35120 74 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d  thod = pFile->pM
35130 65 74 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65  ethod;.    pFile
35140 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f  ->pMethod = &pro
35150 78 79 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  xyIoMethods;.  }
35160 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 43  else{.    if( pC
35170 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b  tx->conchFile ){
35180 20 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f   .      pCtx->co
35190 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
351a0 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65  ->xClose((sqlite
351b0 33 5f 66 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63  3_file *)pCtx->c
351c0 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20  onchFile);.     
351d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
351e0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a  tx->conchFile);.
351f0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
35200 33 44 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d  3DbFree(0, pCtx-
35210 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b  >lockProxyPath);
35220 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
35230 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  e(pCtx->conchFil
35240 65 50 61 74 68 29 3b 20 0a 20 20 20 20 73 71 6c  ePath); .    sql
35250 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b  ite3_free(pCtx);
35260 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
35270 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64 20  "TRANSPROXY  %d 
35280 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
35290 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d  .           (rc=
352a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
352b0 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29 3b  " : "failed")));
352c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
352d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
352e0 74 69 6e 65 20 68 61 6e 64 6c 65 73 20 73 71 6c  tine handles sql
352f0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
35300 6c 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 61  l() calls that a
35310 72 65 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74  re specific.** t
35320 6f 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e  o proxy locking.
35330 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
35340 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  roxyFileControl(
35350 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
35360 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
35370 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28  pArg){.  switch(
35380 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
35390 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
353a0 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20  ROXYFILE: {.    
353b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
353c0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
353d0 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69  d;.      if( pFi
353e0 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26  le->pMethod == &
353f0 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 20 29  proxyIoMethods )
35400 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c  {.        proxyL
35410 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
35420 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
35430 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c  ingContext*)pFil
35440 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
35450 74 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79  t;.        proxy
35460 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29  TakeConch(pFile)
35470 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
35480 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
35490 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  h ){.          *
354a0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70  (const char **)p
354b0 41 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  Arg = pCtx->lock
354c0 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20  ProxyPath;.     
354d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
354e0 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72      *(const char
354f0 20 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61 75 74   **)pArg = ":aut
35500 6f 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22 3b 0a  o: (not held)";.
35510 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35520 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
35530 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a   *(const char **
35540 29 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20  )pArg = NULL;.  
35550 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
35560 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
35570 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
35580 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
35590 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75  YFILE: {.      u
355a0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
355b0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
355c0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53        int rc = S
355d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
355e0 69 6e 74 20 69 73 50 72 6f 78 79 53 74 79 6c 65  int isProxyStyle
355f0 20 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68   = (pFile->pMeth
35600 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65  od == &proxyIoMe
35610 74 68 6f 64 73 29 3b 0a 20 20 20 20 20 20 69 66  thods);.      if
35620 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20  ( pArg==NULL || 
35630 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41  (const char *)pA
35640 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rg==0 ){.       
35650 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c   if( isProxyStyl
35660 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  e ){.          /
35670 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79  * turn off proxy
35680 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74 20 73   locking - not s
35690 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20  upported */.    
356a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
356b0 45 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49 54 45  E_ERROR /*SQLITE
356c0 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49 54  _PROTOCOL? SQLIT
356d0 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20 20 20  E_MISUSE?*/;.   
356e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
356f0 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66        /* turn of
35700 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  f proxy locking 
35710 2d 20 61 6c 72 65 61 64 79 20 6f 66 66 20 2d 20  - already off - 
35720 4e 4f 4f 50 20 2a 2f 0a 20 20 20 20 20 20 20 20  NOOP */.        
35730 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
35740 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35760 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f   const char *pro
35770 78 79 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20  xyPath = (const 
35780 63 68 61 72 20 2a 29 70 41 72 67 3b 0a 20 20 20  char *)pArg;.   
35790 20 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79       if( isProxy
357a0 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Style ){.       
357b0 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43     proxyLockingC
357c0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 0a  ontext *pCtx = .
357d0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 72 6f              (pro
357e0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
357f0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
35800 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20  Context;.       
35810 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 70     if( !strcmp(p
35820 41 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29 20 0a  Arg, ":auto:") .
35830 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
35840 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
35850 74 68 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  th &&.          
35860 20 20 20 20 20 21 73 74 72 6e 63 6d 70 28 70 43       !strncmp(pC
35870 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
35880 68 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 4d 41  h, proxyPath, MA
35890 58 50 41 54 48 4c 45 4e 29 29 0a 20 20 20 20 20  XPATHLEN)).     
358a0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
358b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
358c0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  OK;.          }e
358d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
358e0 20 72 63 20 3d 20 73 77 69 74 63 68 4c 6f 63 6b   rc = switchLock
358f0 50 72 6f 78 79 50 61 74 68 28 70 46 69 6c 65 2c  ProxyPath(pFile,
35900 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20   proxyPath);.   
35910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35930 20 20 2f 2a 20 74 75 72 6e 20 6f 6e 20 70 72 6f    /* turn on pro
35940 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  xy file locking 
35950 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
35960 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  = proxyTransform
35970 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20  UnixFile(pFile, 
35980 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  proxyPath);.    
35990 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
359a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
359b0 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
359c0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
359d0 28 20 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 63  ( 0 );  /* The c
359e0 61 6c 6c 20 61 73 73 75 72 65 73 20 74 68 61 74  all assures that
359f0 20 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70 63 6f   only valid opco
35a00 64 65 73 20 61 72 65 20 73 65 6e 74 20 2a 2f 0a  des are sent */.
35a10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f      }.  }.  /*NO
35a20 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 72 65 74  TREACHED*/.  ret
35a30 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
35a40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69  ;.}../*.** Withi
35a50 6e 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 20  n this division 
35a60 28 74 68 65 20 70 72 6f 78 79 69 6e 67 20 6c 6f  (the proxying lo
35a70 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
35a80 74 69 6f 6e 29 20 74 68 65 20 70 72 6f 63 65 64  tion) the proced
35a90 75 72 65 73 0a 2a 2a 20 61 62 6f 76 65 20 74 68  ures.** above th
35aa0 69 73 20 70 6f 69 6e 74 20 61 72 65 20 61 6c 6c  is point are all
35ab0 20 75 74 69 6c 69 74 69 65 73 2e 20 20 54 68 65   utilities.  The
35ac0 20 6c 6f 63 6b 2d 72 65 6c 61 74 65 64 20 6d 65   lock-related me
35ad0 74 68 6f 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20  thods of the.** 
35ae0 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 73 71  proxy-locking sq
35af0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 20  lite3_io_method 
35b00 6f 62 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a  object follow..*
35b10 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  /.../*.** This r
35b20 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
35b30 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
35b40 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
35b50 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
35b60 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
35b70 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
35b80 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
35b90 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
35ba0 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
35bb0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
35bc0 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
35bd0 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
35be0 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
35bf0 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
35c00 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
35c10 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
35c20 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
35c30 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
35c40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
35c50 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
35c60 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
35c70 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
35c80 75 74 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ut) {.  unixFile
35c90 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
35ca0 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  ile*)id;.  int r
35cb0 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  c = proxyTakeCon
35cc0 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ch(pFile);.  if(
35cd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
35ce0 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69  {.    proxyLocki
35cf0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
35d00 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
35d10 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
35d20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
35d30 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f      if( pCtx->co
35d40 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20  nchHeld>0 ){.   
35d50 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f     unixFile *pro
35d60 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
35d70 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 65 74 75  roxy;.      retu
35d80 72 6e 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f  rn proxy->pMetho
35d90 64 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76 65  d->xCheckReserve
35da0 64 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  dLock((sqlite3_f
35db0 69 6c 65 2a 29 70 72 6f 78 79 2c 20 70 52 65 73  ile*)proxy, pRes
35dc0 4f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Out);.    }else{
35dd0 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20   /* conchHeld < 
35de0 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f  0 is lockless */
35df0 0a 20 20 20 20 20 20 70 52 65 73 4f 75 74 3d 30  .      pResOut=0
35e00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
35e10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
35e20 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
35e30 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
35e40 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
35e50 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
35e60 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
35e70 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
35e80 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
35e90 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
35ea0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
35eb0 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
35ec0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
35ed0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
35ee0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
35ef0 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
35f00 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
35f10 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
35f20 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
35f30 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
35f40 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
35f50 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
35f60 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
35f70 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
35f80 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
35f90 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
35fa0 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
35fb0 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
35fc0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
35fd0 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
35fe0 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
35ff0 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
36000 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
36010 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
36020 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
36030 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
36040 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
36050 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
36060 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
36070 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
36080 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
36090 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
360a0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
360b0 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
360c0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
360d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
360e0 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
360f0 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
36100 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
36110 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
36120 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
36130 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
36140 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
36150 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
36160 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
36170 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
36180 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
36190 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
361a0 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43   rc = proxyTakeC
361b0 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69  onch(pFile);.  i
361c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
361d0 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63   ){.    proxyLoc
361e0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
361f0 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
36200 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
36210 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
36220 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  ;.    if( pCtx->
36230 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20  conchHeld>0 ){. 
36240 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70       unixFile *p
36250 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
36260 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63  kProxy;.      rc
36270 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f   = proxy->pMetho
36280 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65  d->xLock((sqlite
36290 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65  3_file*)proxy, e
362a0 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  FileLock);.     
362b0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
362c0 6b 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65  k = proxy->eFile
362d0 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Lock;.    }else{
362e0 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48  .      /* conchH
362f0 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c  eld < 0 is lockl
36300 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  ess */.    }.  }
36310 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
36320 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
36330 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
36340 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
36350 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
36360 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
36370 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
36380 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
36390 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
363a0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
363b0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
363c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
363d0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
363e0 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
363f0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
36400 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
36410 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
36420 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
36430 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  yUnlock(sqlite3_
36440 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
36450 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
36460 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
36470 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
36480 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61  int rc = proxyTa
36490 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  keConch(pFile);.
364a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
364b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79  _OK ){.    proxy
364c0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
364d0 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
364e0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
364f0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
36500 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ext;.    if( pCt
36510 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29  x->conchHeld>0 )
36520 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  {.      unixFile
36530 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e   *proxy = pCtx->
36540 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20  lockProxy;.     
36550 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65   rc = proxy->pMe
36560 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73  thod->xUnlock((s
36570 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f  qlite3_file*)pro
36580 78 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a  xy, eFileLock);.
36590 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
365a0 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e  leLock = proxy->
365b0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  eFileLock;.    }
365c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63  else{.      /* c
365d0 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20  onchHeld < 0 is 
365e0 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20  lockless */.    
365f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
36600 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
36610 65 20 61 20 66 69 6c 65 20 74 68 61 74 20 75 73  e a file that us
36620 65 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a  es proxy locks..
36630 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
36640 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  oxyClose(sqlite3
36650 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
36660 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
36670 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
36680 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
36690 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
366a0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
366b0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
366c0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
366d0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
366e0 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
366f0 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
36700 50 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78 46  Proxy;.    unixF
36710 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d  ile *conchFile =
36720 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
36730 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53  ;.    int rc = S
36740 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20  QLITE_OK;.    . 
36750 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79     if( lockProxy
36760 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c   ){.      rc = l
36770 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f  ockProxy->pMetho
36780 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
36790 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72  te3_file*)lockPr
367a0 6f 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  oxy, NO_LOCK);. 
367b0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
367c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
367d0 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70  c = lockProxy->p
367e0 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28  Method->xClose((
367f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f  sqlite3_file*)lo
36800 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20  ckProxy);.      
36810 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
36820 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
36830 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79  3_free(lockProxy
36840 29 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 6c  );.      pCtx->l
36850 6f 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20  ockProxy = 0;.  
36860 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e 63    }.    if( conc
36870 68 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  hFile ){.      i
36880 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  f( pCtx->conchHe
36890 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ld ){.        rc
368a0 20 3d 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43   = proxyReleaseC
368b0 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20  onch(pFile);.   
368c0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
368d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
368e0 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63  .      rc = conc
368f0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
36900 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  xClose((sqlite3_
36910 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29  file*)conchFile)
36920 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
36930 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
36940 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63    sqlite3_free(c
36950 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d  onchFile);.    }
36960 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
36970 65 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b  ee(0, pCtx->lock
36980 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  ProxyPath);.    
36990 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
369a0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
369b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
369c0 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 64 62  Free(0, pCtx->db
369d0 50 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65  Path);.    /* re
369e0 73 74 6f 72 65 20 74 68 65 20 6f 72 69 67 69 6e  store the origin
369f0 61 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  al locking conte
36a00 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74  xt and pMethod t
36a10 68 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a  hen close it */.
36a20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69      pFile->locki
36a30 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
36a40 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ->oldLockingCont
36a50 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ext;.    pFile->
36a60 70 4d 65 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e  pMethod = pCtx->
36a70 70 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20  pOldMethod;.    
36a80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
36a90 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  x);.    return p
36aa0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
36ab0 43 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20  Close(id);.  }. 
36ac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
36ad0 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f  K;.}....#endif /
36ae0 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
36af0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
36b00 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
36b10 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65  YLE */./*.** The
36b20 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73   proxy locking s
36b30 74 79 6c 65 20 69 73 20 69 6e 74 65 6e 64 65 64  tyle is intended
36b40 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 41 46   for use with AF
36b50 50 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a  P filesystems..*
36b60 2a 20 41 6e 64 20 73 69 6e 63 65 20 41 46 50 20  * And since AFP 
36b70 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65  is only supporte
36b80 64 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65  d on MacOSX, the
36b90 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
36ba0 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69  s also.** restri
36bb0 63 74 65 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a  cted to MacOSX..
36bc0 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ** .**.*********
36bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
36be0 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  f the proxy lock
36bf0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
36c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36c10 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
36c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36c60 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  *****/../*.** In
36c70 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65  itialize the ope
36c80 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e  rating system in
36c90 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  terface..**.** T
36ca0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69  his routine regi
36cb0 73 74 65 72 73 20 61 6c 6c 20 56 46 53 20 69 6d  sters all VFS im
36cc0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f  plementations fo
36cd0 72 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72  r unix-like oper
36ce0 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73  ating.** systems
36cf0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 2c  .  This routine,
36d00 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33   and the sqlite3
36d10 5f 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e  _os_end() routin
36d20 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a  e that follows,.
36d30 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ** should be the
36d40 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73 20 69   only routines i
36d50 6e 20 74 68 69 73 20 66 69 6c 65 20 74 68 61 74  n this file that
36d60 20 61 72 65 20 76 69 73 69 62 6c 65 20 66 72 6f   are visible fro
36d70 6d 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73  m other.** files
36d80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
36d90 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f  tine is called o
36da0 6e 63 65 20 64 75 72 69 6e 67 20 53 51 4c 69 74  nce during SQLit
36db0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
36dc0 20 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e   and by a.** sin
36dd0 67 6c 65 20 74 68 72 65 61 64 2e 20 20 54 68 65  gle thread.  The
36de0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
36df0 6f 6e 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62  on and mutex sub
36e00 73 79 73 74 65 6d 73 20 68 61 76 65 20 6e 6f 74  systems have not
36e10 0a 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20  .** necessarily 
36e20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
36e30 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
36e40 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e  ne is called, an
36e50 64 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f  d so they.** sho
36e60 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  uld not be used.
36e70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
36e80 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a  os_init(void){ .
36e90 20 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66    /* .  ** The f
36ea0 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64  ollowing macro d
36eb0 65 66 69 6e 65 73 20 61 6e 20 69 6e 69 74 69 61  efines an initia
36ec0 6c 69 7a 65 72 20 66 6f 72 20 61 6e 20 73 71 6c  lizer for an sql
36ed0 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
36ee0 0a 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f  .  ** The name o
36ef0 66 20 74 68 65 20 56 46 53 20 69 73 20 4e 41 4d  f the VFS is NAM
36f00 45 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61  E.  The pAppData
36f10 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
36f20 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20   a pointer.  ** 
36f30 74 6f 20 74 68 65 20 22 66 69 6e 64 65 72 22 20  to the "finder" 
36f40 66 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41 70 70  function.  (pApp
36f50 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65  Data is a pointe
36f60 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 62  r to a pointer b
36f70 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c  ecause.  ** sill
36f80 79 20 43 39 30 20 72 75 6c 65 73 20 70 72 6f 68  y C90 rules proh
36f90 69 62 69 74 20 61 20 76 6f 69 64 2a 20 66 72 6f  ibit a void* fro
36fa0 6d 20 62 65 69 6e 67 20 63 61 73 74 20 74 6f 20  m being cast to 
36fb0 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
36fc0 65 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77  er.  ** and so w
36fd0 65 20 68 61 76 65 20 74 6f 20 67 6f 20 74 68 72  e have to go thr
36fe0 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72 6d 65  ough the interme
36ff0 64 69 61 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  diate pointer to
37000 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a   avoid problems.
37010 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c    ** when compil
37020 69 6e 67 20 77 69 74 68 20 2d 70 65 64 61 6e 74  ing with -pedant
37030 69 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47 43 43  ic-errors on GCC
37040 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  .).  **.  ** The
37050 20 46 49 4e 44 45 52 20 70 61 72 61 6d 65 74 65   FINDER paramete
37060 72 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  r to this macro 
37070 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
37080 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  he pointer to th
37090 65 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75  e.  ** finder-fu
370a0 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e  nction.  The fin
370b0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74  der-function ret
370c0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
370d0 6f 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  o the.  ** sqlit
370e0 65 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  e_io_methods obj
370f0 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
37100 6e 74 73 20 74 68 65 20 64 65 73 69 72 65 64 20  nts the desired 
37110 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68  locking.  ** beh
37120 61 76 69 6f 72 73 2e 20 20 53 65 65 20 74 68 65  aviors.  See the
37130 20 64 69 76 69 73 69 6f 6e 20 61 62 6f 76 65 20   division above 
37140 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
37150 65 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a  e IOMETHODS.  **
37160 20 6d 61 63 72 6f 20 66 6f 72 20 61 64 64 69 74   macro for addit
37170 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ion information 
37180 6f 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  on finder-functi
37190 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ons..  **.  ** M
371a0 6f 73 74 20 66 69 6e 64 65 72 73 20 73 69 6d 70  ost finders simp
371b0 6c 79 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ly return a poin
371c0 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73  ter to a fixed s
371d0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
371e0 73 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20  s.  ** object.  
371f0 42 75 74 20 74 68 65 20 22 61 75 74 6f 6c 6f 63  But the "autoloc
37200 6b 49 6f 46 69 6e 64 65 72 22 20 61 76 61 69 6c  kIoFinder" avail
37210 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64  able on MacOSX d
37220 6f 65 73 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a  oes a little.  *
37230 2a 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 61 74  * more than that
37240 3b 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68  ; it looks at th
37250 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70  e filesystem typ
37260 65 20 74 68 61 74 20 68 6f 73 74 73 20 74 68 65  e that hosts the
37270 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20   .  ** database 
37280 66 69 6c 65 20 61 6e 64 20 74 72 69 65 73 20 74  file and tries t
37290 6f 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b  o choose an lock
372a0 69 6e 67 20 6d 65 74 68 6f 64 20 61 70 70 72 6f  ing method appro
372b0 70 72 69 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20  priate for.  ** 
372c0 74 68 61 74 20 66 69 6c 65 73 79 73 74 65 6d 20  that filesystem 
372d0 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65  time..  */.  #de
372e0 66 69 6e 65 20 55 4e 49 58 56 46 53 28 56 46 53  fine UNIXVFS(VFS
372f0 4e 41 4d 45 2c 20 46 49 4e 44 45 52 29 20 7b 20  NAME, FINDER) { 
37300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37310 20 20 20 20 20 20 20 5c 0a 20 20 20 20 33 2c 20         \.    3, 
37320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37330 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
37340 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
37350 20 20 20 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f       \.    sizeo
37360 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 20  f(unixFile),    
37370 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20   /* szOsFile */ 
37380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37390 20 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54     \.    MAX_PAT
373a0 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 2f  HNAME,         /
373b0 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20  * mxPathname */ 
373c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
373d0 20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20   \.    0,       
373e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
373f0 70 4e 65 78 74 20 2a 2f 20 20 20 20 20 20 20 20  pNext */        
37400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
37410 0a 20 20 20 20 56 46 53 4e 41 4d 45 2c 20 20 20  .    VFSNAME,   
37420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e             /* zN
37430 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ame */          
37440 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37450 20 20 20 28 76 6f 69 64 2a 29 26 46 49 4e 44 45     (void*)&FINDE
37460 52 2c 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70  R,       /* pApp
37470 44 61 74 61 20 2a 2f 20 20 20 20 20 20 20 20 20  Data */         
37480 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
37490 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20 20   unixOpen,      
374a0 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
374b0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
374c0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
374d0 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20 20  nixDelete,      
374e0 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
374f0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
37500 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
37510 78 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  xAccess,        
37520 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f     /* xAccess */
37530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37540 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 46       \.    unixF
37550 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20  ullPathname,    
37560 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d   /* xFullPathnam
37570 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
37580 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f     \.    unixDlO
37590 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pen,           /
375a0 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20  * xDlOpen */    
375b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
375c0 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45 72 72   \.    unixDlErr
375d0 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
375e0 78 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20 20  xDlError */     
375f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
37600 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20  .    unixDlSym, 
37610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
37620 6c 53 79 6d 20 2a 2f 20 20 20 20 20 20 20 20 20  lSym */         
37630 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37640 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20     unixDlClose, 
37650 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43           /* xDlC
37660 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lose */         
37670 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
37680 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c   unixRandomness,
37690 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f         /* xRando
376a0 6d 6e 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20  mness */        
376b0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
376c0 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20 20  nixSleep,       
376d0 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
376e0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
376f0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
37700 78 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20  xCurrentTime,   
37710 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
37720 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
37730 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47       \.    unixG
37740 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
37750 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f   /* xGetLastErro
37760 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  r */            
37770 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75 72     \.    unixCur
37780 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f  rentTimeInt64, /
37790 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  * xCurrentTimeIn
377a0 74 36 34 20 2a 2f 20 20 20 20 20 20 20 20 20 20  t64 */          
377b0 20 5c 0a 20 20 20 20 75 6e 69 78 53 65 74 53 79   \.    unixSetSy
377c0 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20  stemCall,    /* 
377d0 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xSetSystemCall *
377e0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  /              \
377f0 0a 20 20 20 20 75 6e 69 78 47 65 74 53 79 73 74  .    unixGetSyst
37800 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47  emCall,    /* xG
37810 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20  etSystemCall */ 
37820 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37830 20 20 20 75 6e 69 78 4e 65 78 74 53 79 73 74 65     unixNextSyste
37840 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78  mCall,   /* xNex
37850 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20  tSystemCall */  
37860 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
37870 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 20  ..  /*.  ** All 
37880 64 65 66 61 75 6c 74 20 56 46 53 65 73 20 66 6f  default VFSes fo
37890 72 20 75 6e 69 78 20 61 72 65 20 63 6f 6e 74 61  r unix are conta
378a0 69 6e 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ined in the foll
378b0 6f 77 69 6e 67 20 61 72 72 61 79 2e 0a 20 20 2a  owing array..  *
378c0 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
378d0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73   the sqlite3_vfs
378e0 2e 70 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20  .pNext field of 
378f0 74 68 65 20 56 46 53 20 6f 62 6a 65 63 74 20 69  the VFS object i
37900 73 20 6d 6f 64 69 66 69 65 64 0a 20 20 2a 2a 20  s modified.  ** 
37910 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  by the SQLite co
37920 72 65 20 77 68 65 6e 20 74 68 65 20 56 46 53 20  re when the VFS 
37930 69 73 20 72 65 67 69 73 74 65 72 65 64 2e 20 20  is registered.  
37940 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  So the following
37950 0a 20 20 2a 2a 20 61 72 72 61 79 20 63 61 6e 6e  .  ** array cann
37960 6f 74 20 62 65 20 63 6f 6e 73 74 2e 0a 20 20 2a  ot be const..  *
37970 2f 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74  /.  static sqlit
37980 65 33 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d 20  e3_vfs aVfs[] = 
37990 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  {.#if SQLITE_ENA
379a0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
379b0 45 20 26 26 20 28 4f 53 5f 56 58 57 4f 52 4b 53  E && (OS_VXWORKS
379c0 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   || defined(__AP
379d0 50 4c 45 5f 5f 29 29 0a 20 20 20 20 55 4e 49 58  PLE__)).    UNIX
379e0 56 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20  VFS("unix",     
379f0 20 20 20 20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46       autolockIoF
37a00 69 6e 64 65 72 20 29 2c 0a 23 65 6c 73 65 0a 20  inder ),.#else. 
37a10 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
37a20 22 2c 20 20 20 20 20 20 20 20 20 20 70 6f 73 69  ",          posi
37a30 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e  xIoFinder ),.#en
37a40 64 69 66 0a 20 20 20 20 55 4e 49 58 56 46 53 28  dif.    UNIXVFS(
37a50 22 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20  "unix-none",    
37a60 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20   nolockIoFinder 
37a70 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  ),.    UNIXVFS("
37a80 75 6e 69 78 2d 64 6f 74 66 69 6c 65 22 2c 20 20  unix-dotfile",  
37a90 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20  dotlockIoFinder 
37aa0 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  ),.    UNIXVFS("
37ab0 75 6e 69 78 2d 65 78 63 6c 22 2c 20 20 20 20 20  unix-excl",     
37ac0 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c  posixIoFinder ),
37ad0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
37ae0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
37af0 78 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73 65 6d  x-namedsem", sem
37b00 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64  IoFinder ),.#end
37b10 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
37b20 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
37b30 4c 45 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  LE.    UNIXVFS("
37b40 75 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20 20 20  unix-posix",    
37b50 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c  posixIoFinder ),
37b60 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53  .#if !OS_VXWORKS
37b70 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
37b80 69 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20 66 6c  ix-flock",    fl
37b90 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  ockIoFinder ),.#
37ba0 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66  endif.#endif.#if
37bb0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
37bc0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
37bd0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
37be0 5f 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  _).    UNIXVFS("
37bf0 75 6e 69 78 2d 61 66 70 22 2c 20 20 20 20 20 20  unix-afp",      
37c00 61 66 70 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20  afpIoFinder ),. 
37c10 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
37c20 2d 6e 66 73 22 2c 20 20 20 20 20 20 6e 66 73 49  -nfs",      nfsI
37c30 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55  oFinder ),.    U
37c40 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70 72 6f  NIXVFS("unix-pro
37c50 78 79 22 2c 20 20 20 20 70 72 6f 78 79 49 6f 46  xy",    proxyIoF
37c60 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a  inder ),.#endif.
37c70 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20    };.  unsigned 
37c80 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
37c90 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
37ca0 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d  */..  /* Double-
37cb0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  check that the a
37cc0 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20  Syscall[] array 
37cd0 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75  has been constru
37ce0 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63  cted.  ** correc
37cf0 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74  tly.  See ticket
37d00 20 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39   [bb3a86e890c8e9
37d10 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74  6ab] */.  assert
37d20 28 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  ( ArraySize(aSys
37d30 63 61 6c 6c 29 3d 3d 31 36 20 29 3b 0a 0a 20 20  call)==16 );..  
37d40 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20  /* Register all 
37d50 56 46 53 65 73 20 64 65 66 69 6e 65 64 20 69 6e  VFSes defined in
37d60 20 74 68 65 20 61 56 66 73 5b 5d 20 61 72 72 61   the aVfs[] arra
37d70 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  y */.  for(i=0; 
37d80 69 3c 28 73 69 7a 65 6f 66 28 61 56 66 73 29 2f  i<(sizeof(aVfs)/
37d90 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76  sizeof(sqlite3_v
37da0 66 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  fs)); i++){.    
37db0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
37dc0 73 74 65 72 28 26 61 56 66 73 5b 69 5d 2c 20 69  ster(&aVfs[i], i
37dd0 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ==0);.  }.  retu
37de0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
37df0 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
37e00 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
37e10 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e  ystem interface.
37e20 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70 65 72  .**.** Some oper
37e30 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6d 69  ating systems mi
37e40 67 68 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 73  ght need to do s
37e50 6f 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e 20 74  ome cleanup in t
37e60 68 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20  his routine,.** 
37e70 74 6f 20 72 65 6c 65 61 73 65 20 64 79 6e 61 6d  to release dynam
37e80 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
37e90 20 6f 62 6a 65 63 74 73 2e 20 20 42 75 74 20 6e   objects.  But n
37ea0 6f 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54  ot on unix..** T
37eb0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
37ec0 20 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69 78 2e   no-op for unix.
37ed0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
37ee0 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20  os_end(void){ . 
37ef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
37f00 4b 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66 20 2f  K; .}. .#endif /
37f10 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58  * SQLITE_OS_UNIX
37f20 20 2a 2f 0a                                       */.