/ Hex Artifact Content
Login

Artifact 03630dd062c3d1fb9f25e2a227048b709c5babff:


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: 72 65 61 64 4f 6e 6c 79 53 68 6d 3b 20 20 20 20  readOnlyShm;    
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 2f 2a 20 54 72 75 65 20 74 6f 20 6f 70 65 6e 20  /* True to open 
1d40: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1d50: 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74  ad-only */.  int
1d60: 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20   szChunk;       
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62   /* Configured b
1d90: 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  y FCNTL_CHUNK_SI
1da0: 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ZE */.#if SQLITE
1db0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1dc0: 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e  STYLE.  int open
1dd0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1df0: 68 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69  he flags specifi
1e00: 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed at open() */.
1e10: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1e20: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1e30: 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65  _STYLE || define
1e40: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75  d(__APPLE__).  u
1e50: 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b  nsigned fsFlags;
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74     /* cached det
1e80: 61 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73  ails from statfs
1e90: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  () */.#endif.#if
1ea0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e   OS_VXWORKS.  in
1eb0: 74 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20  t isDelete;     
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63    /* Delete on c
1ee0: 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a  lose if true */.
1ef0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1f00: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1f10: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1f20: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1f30: 66 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  f.#ifndef NDEBUG
1f40: 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67  .  /* The next g
1f50: 72 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65  roup of variable
1f60: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72  s are used to tr
1f70: 61 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ack whether or n
1f80: 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  ot the.  ** tran
1f90: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1fa0: 69 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f  in bytes 24-27 o
1fb0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  f database files
1fc0: 20 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a   are updated.  *
1fd0: 2a 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70  * whenever any p
1fe0: 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
1ff0: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e  ase changes.  An
2000: 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74   assertion fault
2010: 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72   will.  ** occur
2020: 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70   if a file is up
2030: 64 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c  dated without al
2040: 73 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20  so updating the 
2050: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
2060: 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20   counter.  This 
2070: 74 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20  test is made to 
2080: 61 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65  avoid new proble
2090: 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68  ms similar to th
20a0: 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72  e.  ** one descr
20b0: 69 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23  ibed by ticket #
20c0: 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e  3584. .  */.  un
20d0: 73 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e  signed char tran
20e0: 73 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20  sCntrChng;   /* 
20f0: 54 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e  True if the tran
2100: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
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 64 62 55 70 64  igned char dbUpd
2130: 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ate;        /* T
2140: 72 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20  rue if any part 
2150: 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
2160: 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e   changed */.  un
2170: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f  signed char inNo
2180: 72 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20  rmalWrite;   /* 
2190: 54 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72  True if in a nor
21a0: 6d 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74  mal write operat
21b0: 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ion */.#endif.#i
21c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
21d0: 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f  .  /* In test mo
21e0: 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  de, increase the
21f0: 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74   size of this st
2200: 72 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f  ructure a bit so
2210: 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69   that .  ** it i
2220: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
2230: 65 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69  e struct CrashFi
2240: 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65  le defined in te
2250: 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68  st6.c..  */.  ch
2260: 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b  ar aPadding[32];
2270: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
2280: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
2290: 20 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c   for the unixFil
22a0: 65 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d  e.ctrlFlags bitm
22b0: 61 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ask:.*/.#define 
22c0: 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20  UNIXFILE_EXCL   
22d0: 30 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  0x01     /* Conn
22e0: 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65  ections from one
22f0: 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f   process only */
2300: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2310: 45 5f 52 44 4f 4e 4c 59 20 30 78 30 32 20 20 20  E_RDONLY 0x02   
2320: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
2330: 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a  is read only */.
2340: 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63  ./*.** Include c
2350: 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d  ode that is comm
2360: 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63  on to all os_*.c
2370: 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75   files.*/.#inclu
2380: 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22  de "os_common.h"
2390: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76  ../*.** Define v
23a0: 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68  arious macros th
23b0: 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66  at are missing f
23c0: 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  rom some systems
23d0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c  ..*/.#ifndef O_L
23e0: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
23f0: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
2400: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
2410: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
2420: 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .# undef O_LARGE
2430: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
2440: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
2450: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46  if.#ifndef O_NOF
2460: 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f  OLLOW.# define O
2470: 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64  _NOFOLLOW 0.#end
2480: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e  if.#ifndef O_BIN
2490: 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42  ARY.# define O_B
24a0: 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a  INARY 0.#endif..
24b0: 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64  /*.** The thread
24c0: 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65  id macro resolve
24d0: 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d  s to the thread-
24e0: 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65  id or to 0.  Use
24f0: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
2500: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
2510: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  nly..*/.#if SQLI
2520: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64  TE_THREADSAFE.#d
2530: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
2540: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
2550: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
2560: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  adid 0.#endif../
2570: 2a 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 55  *.** Different U
2580: 6e 69 78 20 73 79 73 74 65 6d 73 20 64 65 63 6c  nix systems decl
2590: 61 72 65 20 6f 70 65 6e 28 29 20 69 6e 20 64 69  are open() in di
25a0: 66 66 65 72 65 6e 74 20 77 61 79 73 2e 20 20 53  fferent ways.  S
25b0: 61 6d 65 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28  ame use.** open(
25c0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c  const char*,int,
25d0: 6d 6f 64 65 5f 74 29 2e 20 20 4f 74 68 65 72 73  mode_t).  Others
25e0: 20 75 73 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20   use open(const 
25f0: 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a  char*,int,...)..
2600: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2610: 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 77  e is important w
2620: 68 65 6e 20 75 73 69 6e 67 20 61 20 70 6f 69 6e  hen using a poin
2630: 74 65 72 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ter to the funct
2640: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
2650: 61 66 65 73 74 20 77 61 79 20 74 6f 20 64 65 61  afest way to dea
2660: 6c 20 77 69 74 68 20 74 68 65 20 70 72 6f 62 6c  l with the probl
2670: 65 6d 20 69 73 20 74 6f 20 61 6c 77 61 79 73 20  em is to always 
2680: 75 73 65 20 74 68 69 73 20 77 72 61 70 70 65 72  use this wrapper
2690: 0a 2a 2a 20 77 68 69 63 68 20 61 6c 77 61 79 73  .** which always
26a0: 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 77 65   has the same we
26b0: 6c 6c 2d 64 65 66 69 6e 65 64 20 69 6e 74 65 72  ll-defined inter
26c0: 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  face..*/.static 
26d0: 69 6e 74 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f  int posixOpen(co
26e0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c  nst char *zFile,
26f0: 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20   int flags, int 
2700: 6d 6f 64 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  mode){.  return 
2710: 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67  open(zFile, flag
2720: 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a  s, mode);.}../*.
2730: 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63  ** Many system c
2740: 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65  alls are accesse
2750: 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65  d through pointe
2760: 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73  r-to-functions s
2770: 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d  o that.** they m
2780: 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  ay be overridden
2790: 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66   at runtime to f
27a0: 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20  acilitate fault 
27b0: 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67  injection during
27c0: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
27d0: 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65  sandboxing.  The
27e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79   following array
27f0: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73   holds the names
2800: 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a   and pointers.**
2810: 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65   to all override
2820: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
2830: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  s..*/.static str
2840: 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c  uct unix_syscall
2850: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
2860: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
2870: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2880: 65 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a  e sytem call */.
2890: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
28a0: 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20  l_ptr pCurrent; 
28b0: 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65  /* Current value
28c0: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
28d0: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
28e0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65  _syscall_ptr pDe
28f0: 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c  fault; /* Defaul
2900: 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79  t value */.} aSy
2910: 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20  scall[] = {.  { 
2920: 22 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20  "open",         
2930: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
2940: 5f 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20  _ptr)posixOpen, 
2950: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
2960: 73 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74  sOpen      ((int
2970: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
2980: 69 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c  int,int))aSyscal
2990: 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[0].pCurrent)..
29a0: 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20    { "close",    
29b0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
29c0: 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20  call_ptr)close, 
29d0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
29e0: 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28  ne osClose     (
29f0: 28 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79  (int(*)(int))aSy
2a00: 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e  scall[1].pCurren
2a10: 74 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22  t)..  { "access"
2a20: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
2a30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63  _syscall_ptr)acc
2a40: 65 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  ess,     0  },.#
2a50: 64 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20  define osAccess 
2a60: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
2a70: 74 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79  t char*,int))aSy
2a80: 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e  scall[2].pCurren
2a90: 74 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22  t)..  { "getcwd"
2aa0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
2ab0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74  _syscall_ptr)get
2ac0: 63 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  cwd,     0  },.#
2ad0: 64 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20  define osGetcwd 
2ae0: 20 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68     ((char*(*)(ch
2af0: 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  ar*,size_t))aSys
2b00: 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74  call[3].pCurrent
2b10: 29 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20  )..  { "stat",  
2b20: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2b30: 73 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74  syscall_ptr)stat
2b40: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
2b50: 65 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20  efine osStat    
2b60: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
2b70: 20 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74   char*,struct st
2b80: 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d  at*))aSyscall[4]
2b90: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a  .pCurrent)../*.*
2ba0: 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70  * The DJGPP comp
2bb0: 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  iler environment
2bc0: 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69   looks mostly li
2bd0: 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a  ke Unix, but it.
2be0: 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e  ** lacks the fcn
2bf0: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
2c00: 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66  .  So redefine f
2c10: 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d  cntl() to be som
2c20: 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61  ething.** that a
2c30: 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
2c40: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
2c50: 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f   locking does no
2c60: 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a  t occur under.**
2c70: 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20   DJGPP.  But it 
2c80: 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69  is DOS - what di
2c90: 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f  d you expect?.*/
2ca0: 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f  .#ifdef __DJGPP_
2cb0: 5f 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20  _.  { "fstat",  
2cc0: 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20        0,        
2cd0: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
2ce0: 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61  define osFstat(a
2cf0: 2c 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65  ,b,c)    0.#else
2d00: 20 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74       .  { "fstat
2d10: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
2d20: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
2d30: 73 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c  stat,      0  },
2d40: 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74  .#define osFstat
2d50: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e       ((int(*)(in
2d60: 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29  t,struct stat*))
2d70: 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72  aSyscall[5].pCur
2d80: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20  rent).#endif..  
2d90: 7b 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20  { "ftruncate",  
2da0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
2db0: 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65  ll_ptr)ftruncate
2dc0: 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65  ,  0  },.#define
2dd0: 20 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69   osFtruncate ((i
2de0: 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29  nt(*)(int,off_t)
2df0: 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75  )aSyscall[6].pCu
2e00: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e  rrent)..  { "fcn
2e10: 74 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  tl",        (sql
2e20: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2e30: 29 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20  )fcntl,      0  
2e40: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e  },.#define osFcn
2e50: 74 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  tl     ((int(*)(
2e60: 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79  int,int,...))aSy
2e70: 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e  scall[7].pCurren
2e80: 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20  t)..  { "read", 
2e90: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2ea0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61  _syscall_ptr)rea
2eb0: 64 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  d,       0  },.#
2ec0: 64 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20  define osRead   
2ed0: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
2ee0: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
2ef0: 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43  ))aSyscall[8].pC
2f00: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
2f10: 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20  ined(USE_PREAD) 
2f20: 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
2f30: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2f40: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
2f50: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2f60: 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20  all_ptr)pread,  
2f70: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a      0  },.#else.
2f80: 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20    { "pread",    
2f90: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
2fa0: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
2fb0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69       0  },.#endi
2fc0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61  f.#define osPrea
2fd0: 64 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28  d     ((ssize_t(
2fe0: 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a  *)(int,void*,siz
2ff0: 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  e_t,off_t))aSysc
3000: 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29  all[9].pCurrent)
3010: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
3020: 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22  E_PREAD64).  { "
3030: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3040: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3050: 70 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20  ptr)pread64,    
3060: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3070: 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20  "pread64",      
3080: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3090: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
30a0: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
30b0: 65 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20  efine osPread64 
30c0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
30d0: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  nt,void*,size_t,
30e0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
30f0: 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  10].pCurrent).. 
3100: 20 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20   { "write",     
3110: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3120: 61 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20  all_ptr)write,  
3130: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
3140: 65 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28  e osWrite     ((
3150: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
3160: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
3170: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e  t))aSyscall[11].
3180: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3190: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
31a0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
31b0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
31c0: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
31d0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
31e0: 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65  scall_ptr)pwrite
31f0: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  ,     0  },.#els
3200: 65 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20  e.  { "pwrite", 
3210: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3220: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
3230: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
3240: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77  dif.#define osPw
3250: 72 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f  rite    ((ssize_
3260: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
3270: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f  oid*,size_t,off_
3280: 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20  t))\.           
3290: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
32a0: 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[12].pCurrent).
32b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
32c0: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
32d0: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
32e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
32f0: 74 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30  tr)pwrite64,   0
3300: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
3310: 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28  pwrite64",     (
3320: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3330: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3340: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3350: 66 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20  fine osPwrite64 
3360: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3370: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69  t,const void*,si
3380: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20  ze_t,off_t))\.  
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a0: 20 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70    aSyscall[13].p
33b0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
33c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
33d0: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 66  ING_STYLE.  { "f
33e0: 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73  chmod",       (s
33f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3400: 74 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 30  tr)fchmod,     0
3410: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
3420: 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28  fchmod",       (
3430: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3440: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3450: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3460: 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20  fine osFchmod   
3470: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f   ((int(*)(int,mo
3480: 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  de_t))aSyscall[1
3490: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
34a0: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50  f defined(HAVE_P
34b0: 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20  OSIX_FALLOCATE) 
34c0: 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  && HAVE_POSIX_FA
34d0: 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c  LLOCATE.  { "fal
34e0: 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  locate",    (sql
34f0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3500: 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65  )posix_fallocate
3510: 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  ,  0 },.#else.  
3520: 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20  { "fallocate",  
3530: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3540: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3550: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3560: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46  ndif.#define osF
3570: 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a  allocate ((int(*
3580: 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f  )(int,off_t,off_
3590: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e  t))aSyscall[15].
35a0: 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a  pCurrent)..}; /*
35b0: 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   End of the over
35c0: 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20  rideable system 
35d0: 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  calls */../*.** 
35e0: 54 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74  This is the xSet
35f0: 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74  SystemCall() met
3600: 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76  hod of sqlite3_v
3610: 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  fs for all of th
3620: 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65  e.** "unix" VFSe
3630: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
3640: 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73  E_OK opon succes
3650: 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20  sfully updating 
3660: 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  the.** system ca
3670: 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53  ll pointer, or S
3680: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69  QLITE_NOTFOUND i
3690: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f  f there is no co
36a0: 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79  nfigurable.** sy
36b0: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20  stem call named 
36c0: 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  zName..*/.static
36d0: 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74   int unixSetSyst
36e0: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
36f0: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
3700: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
3710: 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74  FS pointer.  Not
3720: 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74   used */.  const
3730: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
3740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3750: 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   of system call 
3760: 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20  to override */. 
3770: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
3780: 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f  _ptr pNewFunc  /
3790: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
37a0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c   system call val
37b0: 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  ue */.){.  unsig
37c0: 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ned int i;.  int
37d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
37e0: 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44  FOUND;..  UNUSED
37f0: 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55  _PARAMETER(pNotU
3800: 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  sed);.  if( zNam
3810: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  e==0 ){.    /* I
3820: 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69  f no zName is gi
3830: 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c  ven, restore all
3840: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f   system calls to
3850: 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20   their default. 
3860: 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61     ** settings a
3870: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20  nd return NULL. 
3880: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
3890: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f  QLITE_OK;.    fo
38a0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
38b0: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
38c0: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
38d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
38e0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
38f0: 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ult ){.        a
3900: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
3910: 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ent = aSyscall[i
3920: 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20  ].pDefault;.    
3930: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
3940: 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  e{.    /* If zNa
3950: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
3960: 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79   operate on only
3970: 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20   the one system 
3980: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63  call.    ** spec
3990: 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ified..    */.  
39a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
39b0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
39c0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
39d0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
39e0: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
39f0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
3a00: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
3a10: 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69    if( aSyscall[i
3a20: 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b  ].pDefault==0 ){
3a30: 0a 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63  .          aSysc
3a40: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
3a50: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  = aSyscall[i].pC
3a60: 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  urrent;.        
3a70: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  }.        rc = S
3a80: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
3a90: 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d    if( pNewFunc==
3aa0: 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61  0 ) pNewFunc = a
3ab0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
3ac0: 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79  ult;.        aSy
3ad0: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
3ae0: 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20  t = pNewFunc;.  
3af0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
3b10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3b20: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
3b30: 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65  value of a syste
3b40: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
3b50: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73  NULL if zName is
3b60: 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e   not a.** recogn
3b70: 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c  ized system call
3b80: 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20   name.  NULL is 
3b90: 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
3ba0: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
3bb0: 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
3bc0: 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
3bd0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79  tatic sqlite3_sy
3be0: 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65  scall_ptr unixGe
3bf0: 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73  tSystemCall(.  s
3c00: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74  qlite3_vfs *pNot
3c10: 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Used,.  const ch
3c20: 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75  ar *zName.){.  u
3c30: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a  nsigned int i;..
3c40: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
3c50: 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20  ER(pNotUsed);.  
3c60: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
3c70: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
3c80: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
3c90: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
3ca0: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
3cb0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
3cc0: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
3cd0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
3ce0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
3cf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3d00: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
3d10: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
3d20: 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e  all after zName.
3d30: 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c    If zName==NULL
3d40: 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
3d50: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
3d60: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
3d70: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
3d80: 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74  if zName.** is t
3d90: 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63  he last system c
3da0: 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20  all or if zName 
3db0: 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20  is not the name 
3dc0: 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79  of a valid.** sy
3dd0: 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74  stem call..*/.st
3de0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3df0: 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43  *unixNextSystemC
3e00: 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20  all(sqlite3_vfs 
3e10: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
3e20: 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20  zName){.  int i 
3e30: 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  = -1;..  UNUSED_
3e40: 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20  PARAMETER(p);.  
3e50: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
3e60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
3e70: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d  ySize(aSyscall)-
3e80: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  1; i++){.      i
3e90: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
3ea0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
3eb0: 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
3ec0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
3ed0: 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i++; i<ArraySize
3ee0: 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29  (aSyscall); i++)
3ef0: 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61  {.    if( aSysca
3f00: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d  ll[i].pCurrent!=
3f10: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
3f20: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  all[i].zName;.  
3f30: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 6f 70 65  ./*.** Retry ope
3f50: 6e 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66  n() calls that f
3f60: 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52  ail due to EINTR
3f70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
3f80: 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74  obust_open(const
3f90: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c   char *z, int f,
3fa0: 20 69 6e 74 20 6d 29 7b 0a 20 20 69 6e 74 20 72   int m){.  int r
3fb0: 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73  c;.  do{ rc = os
3fc0: 4f 70 65 6e 28 7a 2c 66 2c 6d 29 3b 20 7d 77 68  Open(z,f,m); }wh
3fd0: 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
3fe0: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72  no==EINTR );.  r
3ff0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4000: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
4010: 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
4020: 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
4030: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
4040: 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
4050: 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
4060: 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e  otect the unixIn
4070: 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76  odeInfo and.** v
4080: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
4090: 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69  ects used by thi
40a0: 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
40b0: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
40c0: 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70  shared by multip
40d0: 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a  le threads..**.*
40e0: 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d  * Function unixM
40f0: 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
4100: 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
4110: 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
4120: 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64  utex .** is held
4130: 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
4140: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
4150: 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
4160: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a  rt of assert() .
4170: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
4180: 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78  .g..**.**   unix
4190: 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
41a0: 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78      assert( unix
41b0: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
41c0: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61  *   unixEnterLea
41d0: 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ve().*/.static v
41e0: 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  oid unixEnterMut
41f0: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
4200: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
4210: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
4220: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
4230: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
4240: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
4250: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  ixLeaveMutex(voi
4260: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
4270: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
4280: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
4290: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
42a0: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64  MASTER));.}.#ifd
42b0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
42c0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
42d0: 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b  utexHeld(void) {
42e0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
42f0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
4300: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
4310: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
4320: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
4330: 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53  endif...#ifdef S
4340: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
4350: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
4360: 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f  n for printing o
4370: 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61  ut trace informa
4380: 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67  tion from debugg
4390: 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e  ing.** binaries.
43a0: 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
43b0: 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
43c0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
43d0: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
43e0: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
43f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
4400: 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e  r *azFileLock(in
4410: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
4420: 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63  switch( eFileLoc
4430: 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f  k ){.    case NO
4440: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e  _LOCK: return "N
4450: 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53  ONE";.    case S
4460: 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  HARED_LOCK: retu
4470: 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20  rn "SHARED";.   
4480: 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c   case RESERVED_L
4490: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53  OCK: return "RES
44a0: 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65  ERVED";.    case
44b0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72   PENDING_LOCK: r
44c0: 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b  eturn "PENDING";
44d0: 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53  .    case EXCLUS
44e0: 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  IVE_LOCK: return
44f0: 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20   "EXCLUSIVE";.  
4500: 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f  }.  return "ERRO
4510: 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  R";.}.#endif..#i
4520: 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fdef SQLITE_LOCK
4530: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69  _TRACE./*.** Pri
4540: 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69  nt out informati
4550: 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63  on about all loc
4560: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
4570: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4580: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
4590: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20  troubleshooting 
45a0: 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68  locks on multith
45b0: 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f  readed.** platfo
45c0: 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20  rms.  Enable by 
45d0: 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74  compiling with t
45e0: 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b  he -DSQLITE_LOCK
45f0: 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e  _TRACE.** comman
4600: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e  d-line option on
4610: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20   the compiler.  
4620: 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72  This code is nor
4630: 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20  mally.** turned 
4640: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
4650: 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74  nt lockTrace(int
4660: 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72   fd, int op, str
4670: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20  uct flock *p){. 
4680: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20   char *zOpName, 
4690: 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b  *zType;.  int s;
46a0: 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e  .  int savedErrn
46b0: 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47  o;.  if( op==F_G
46c0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
46d0: 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20  ame = "GETLK";. 
46e0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46   }else if( op==F
46f0: 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _SETLK ){.    zO
4700: 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b  pName = "SETLK";
4710: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20  .  }else{.    s 
4720: 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70  = osFcntl(fd, op
4730: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
4740: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
4750: 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25  ntl unknown %d %
4760: 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c  d %d\n", fd, op,
4770: 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   s);.    return 
4780: 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  s;.  }.  if( p->
4790: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
47a0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
47b0: 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  RDLCK";.  }else 
47c0: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
47d0: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _WRLCK ){.    zT
47e0: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
47f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
4800: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
4810: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e  .    zType = "UN
4820: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  LCK";.  }else{. 
4830: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
4840: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
4850: 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f  >l_whence==SEEK_
4860: 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46  SET );.  s = osF
4870: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
4880: 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20  .  savedErrno = 
4890: 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  errno;.  sqlite3
48a0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
48b0: 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25  tl %d %d %s %s %
48c0: 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  d %d %d %d\n",. 
48d0: 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64      threadid, fd
48e0: 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65  , zOpName, zType
48f0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72  , (int)p->l_star
4900: 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e  t, (int)p->l_len
4910: 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c  ,.     (int)p->l
4920: 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20  _pid, s);.  if( 
4930: 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46  s==(-1) && op==F
4940: 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f  _SETLK && (p->l_
4950: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c  type==F_RDLCK ||
4960: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
4970: 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75  LCK) ){.    stru
4980: 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20  ct flock l2;.   
4990: 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73   l2 = *p;.    os
49a0: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  Fcntl(fd, F_GETL
49b0: 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28  K, &l2);.    if(
49c0: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   l2.l_type==F_RD
49d0: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
49e0: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
49f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
4a00: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
4a10: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
4a20: 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "WRLCK";.    }el
4a30: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
4a40: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
4a50: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
4a60: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  K";.    }else{. 
4a70: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
4a80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
4a90: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4aa0: 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65  fcntl-failure-re
4ab0: 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25  ason: %s %d %d %
4ac0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79  d\n",.       zTy
4ad0: 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74  pe, (int)l2.l_st
4ae0: 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c  art, (int)l2.l_l
4af0: 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69  en, (int)l2.l_pi
4b00: 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20  d);.  }.  errno 
4b10: 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  = savedErrno;.  
4b20: 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64  return s;.}.#und
4b30: 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69  ef osFcntl.#defi
4b40: 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54  ne osFcntl lockT
4b50: 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  race.#endif /* S
4b60: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
4b70: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79   */../*.** Retry
4b80: 20 66 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c   ftruncate() cal
4b90: 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64 75 65  ls that fail due
4ba0: 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61   to EINTR.*/.sta
4bb0: 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66  tic int robust_f
4bc0: 74 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20  truncate(int h, 
4bd0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
4be0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  ){.  int rc;.  d
4bf0: 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63  o{ rc = osFtrunc
4c00: 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c  ate(h,sz); }whil
4c10: 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
4c20: 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
4c30: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4c40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72   This routine tr
4c50: 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64  anslates a stand
4c60: 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20  ard POSIX errno 
4c70: 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68  code into someth
4c80: 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f  ing.** useful to
4c90: 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20   the clients of 
4ca0: 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63  the sqlite3 func
4cb0: 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63  tions.  Specific
4cc0: 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69  ally, it is.** i
4cd0: 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73  ntended to trans
4ce0: 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f  late a variety o
4cf0: 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72  f "try again" er
4d00: 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45  rors into SQLITE
4d10: 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76  _BUSY.** and a v
4d20: 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73  ariety of "pleas
4d30: 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  e close the file
4d40: 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22   descriptor NOW"
4d50: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a   errors into .**
4d60: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a   SQLITE_IOERR.**
4d70: 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69   .** Errors duri
4d80: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
4d90: 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66  n of locks, or f
4da0: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
4db0: 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a  rt for locks,.**
4dc0: 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45   should handle E
4dd0: 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20  NOLCK, ENOTSUP, 
4de0: 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72  EOPNOTSUPP separ
4df0: 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
4e00: 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72   int sqliteError
4e10: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69  FromPosixError(i
4e20: 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69  nt posixError, i
4e30: 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20  nt sqliteIOErr) 
4e40: 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73 69  {.  switch (posi
4e50: 78 45 72 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a  xError) {.#if 0.
4e60: 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    /* At one poin
4e70: 74 20 74 68 69 73 20 63 6f 64 65 20 77 61 73 20  t this code was 
4e80: 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75  not commented ou
4e90: 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  t. In theory, th
4ea0: 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73  is branch.  ** s
4eb0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 68  hould never be h
4ec0: 69 74 2c 20 61 73 20 74 68 69 73 20 66 75 6e 63  it, as this func
4ed0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tion should only
4ee0: 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
4ef0: 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d  .  ** a locking-
4f00: 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e  related function
4f10: 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20   (i.e. fcntl()) 
4f20: 68 61 73 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e  has returned non
4f30: 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20  -zero with.  ** 
4f40: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72  the value of err
4f50: 6e 6f 20 61 73 20 74 68 65 20 66 69 72 73 74 20  no as the first 
4f60: 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20  argument. Since 
4f70: 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 68 61  a system call ha
4f80: 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65  s failed,.  ** e
4f90: 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e  rrno should be n
4fa0: 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20  on-zero..  **.  
4fb0: 2a 2a 20 44 65 73 70 69 74 65 20 74 68 69 73 2c  ** Despite this,
4fc0: 20 69 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79   if errno really
4fd0: 20 69 73 20 7a 65 72 6f 2c 20 77 65 20 73 74 69   is zero, we sti
4fe0: 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  ll don't want to
4ff0: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c   return.  ** SQL
5000: 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74  ITE_OK. The syst
5010: 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20  em call failed, 
5020: 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74  and *some* SQLit
5030: 65 20 65 72 72 6f 72 20 73 68 6f 75 6c 64 20 62  e error should b
5040: 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 65  e.  ** propagate
5050: 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61  d back to the ca
5060: 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67  ller. Commenting
5070: 20 74 68 69 73 20 62 72 61 6e 63 68 20 6f 75 74   this branch out
5080: 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a   means errno==0.
5090: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e    ** will be han
50a0: 64 6c 65 64 20 62 79 20 74 68 65 20 22 64 65 66  dled by the "def
50b0: 61 75 6c 74 3a 22 20 63 61 73 65 20 62 65 6c 6f  ault:" case belo
50c0: 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 30  w..  */.  case 0
50d0: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  : .    return SQ
50e0: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
50f0: 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a  .  case EAGAIN:.
5100: 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54    case ETIMEDOUT
5110: 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a  :.  case EBUSY:.
5120: 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20    case EINTR:.  
5130: 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20  case ENOLCK:  . 
5140: 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53     /* random NFS
5150: 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e   retry error, un
5160: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
5170: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
5180: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
5190: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
51a0: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
51b0: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
51c0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
51d0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20  ITE_BUSY;.    . 
51e0: 20 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20   case EACCES: . 
51f0: 20 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20     /* EACCES is 
5200: 6c 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69  like EAGAIN duri
5210: 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ng locking opera
5220: 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61  tions, but not a
5230: 6e 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a  ny other time*/.
5240: 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 49      if( (sqliteI
5250: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
5260: 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09  OERR_LOCK) || ..
5270: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
5280: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
5290: 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74  OCK) || ..(sqlit
52a0: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
52b0: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c  _IOERR_RDLOCK) |
52c0: 7c 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20  |..(sqliteIOErr 
52d0: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
52e0: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
52f0: 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  K) ){.      retu
5300: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
5310: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73      }.    /* els
5320: 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  e fall through *
5330: 2f 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20  /.  case EPERM: 
5340: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5350: 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20  TE_PERM;.    .  
5360: 2f 2a 20 45 44 45 41 44 4c 4b 20 69 73 20 6f 6e  /* EDEADLK is on
5370: 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 61  ly possible if a
5380: 20 63 61 6c 6c 20 74 6f 20 66 63 6e 74 6c 28 46   call to fcntl(F
5390: 5f 53 45 54 4c 4b 57 29 20 69 73 20 6d 61 64 65  _SETLKW) is made
53a0: 2e 20 41 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20  . And.  ** this 
53b0: 6d 6f 64 75 6c 65 20 6e 65 76 65 72 20 6d 61 6b  module never mak
53c0: 65 73 20 73 75 63 68 20 61 20 63 61 6c 6c 2e 20  es such a call. 
53d0: 41 6e 64 20 74 68 65 20 63 6f 64 65 20 69 6e 20  And the code in 
53e0: 53 51 4c 69 74 65 20 69 74 73 65 6c 66 20 0a 20  SQLite itself . 
53f0: 20 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74   ** asserts that
5400: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c   SQLITE_IOERR_BL
5410: 4f 43 4b 45 44 20 69 73 20 6e 65 76 65 72 20 72  OCKED is never r
5420: 65 74 75 72 6e 65 64 2e 20 46 6f 72 20 74 68 65  eturned. For the
5430: 73 65 20 72 65 61 73 6f 6e 73 0a 20 20 2a 2a 20  se reasons.  ** 
5440: 74 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73  this case is als
5450: 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e  o commented out.
5460: 20 49 66 20 74 68 65 20 73 79 73 74 65 6d 20 64   If the system d
5470: 6f 65 73 20 73 65 74 20 65 72 72 6e 6f 20 74 6f  oes set errno to
5480: 20 45 44 45 41 44 4c 4b 2c 0a 20 20 2a 2a 20 74   EDEADLK,.  ** t
5490: 68 65 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54  he default SQLIT
54a0: 45 5f 49 4f 45 52 52 5f 58 58 58 20 63 6f 64 65  E_IOERR_XXX code
54b0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
54c0: 64 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 63 61  d. */.#if 0.  ca
54d0: 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20  se EDEADLK:.    
54e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
54f0: 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 23 65 6e  ERR_BLOCKED;.#en
5500: 64 69 66 0a 20 20 20 20 0a 23 69 66 20 45 4f 50  dif.    .#if EOP
5510: 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50  NOTSUPP!=ENOTSUP
5520: 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55  .  case EOPNOTSU
5530: 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65  PP: .    /* some
5540: 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69  thing went terri
5550: 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73  bly awry, unless
5560: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
5570: 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20  tem support .   
5580: 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f    * introspectio
5590: 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61  n, in which it a
55a0: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
55b0: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
55c0: 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54  ndif.#ifdef ENOT
55d0: 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53  SUP.  case ENOTS
55e0: 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61  UP: .    /* inva
55f0: 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64  lid fd, unless d
5600: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
5610: 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73  m support intros
5620: 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63  pection, in whic
5630: 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74  h .     * it act
5640: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
5650: 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64   it says */.#end
5660: 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20  if.  case EIO:. 
5670: 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63   case EBADF:.  c
5680: 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61  ase EINVAL:.  ca
5690: 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63  se ENOTCONN:.  c
56a0: 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61  ase ENODEV:.  ca
56b0: 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65  se ENXIO:.  case
56c0: 20 45 4e 4f 45 4e 54 3a 0a 20 20 63 61 73 65 20   ENOENT:.  case 
56d0: 45 53 54 41 4c 45 3a 0a 20 20 63 61 73 65 20 45  ESTALE:.  case E
56e0: 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68  NOSYS:.    /* th
56f0: 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65  ese should force
5700: 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63   the client to c
5710: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e  lose the file an
5720: 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20  d reconnect */. 
5730: 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a     .  default: .
5740: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
5750: 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a  eIOErr;.  }.}...
5760: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
5770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57b0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
57c0: 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65  *** Begin Unique
57d0: 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79   File ID Utility
57e0: 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73   Used By VxWorks
57f0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
5800: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76  .**.** On most v
5810: 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c  ersions of unix,
5820: 20 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e   we can get a un
5830: 69 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69  ique ID for a fi
5840: 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74  le by concatenat
5850: 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63  ing.** the devic
5860: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
5870: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
5880: 42 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  But this does no
5890: 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b  t work on VxWork
58a0: 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73  s..** On VxWorks
58b0: 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  , a unique file 
58c0: 69 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64  id must be based
58d0: 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   on the canonica
58e0: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a  l filename..**.*
58f0: 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
5900: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
5910: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
5920: 63 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65  cture can be use
5930: 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65  d as a.** unique
5940: 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f   file ID in VxWo
5950: 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61  rks.  Each insta
5960: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
5970: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  cture contains.*
5980: 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  * a copy of the 
5990: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
59a0: 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c  me.  There is al
59b0: 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63  so a reference c
59c0: 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73  ount.  .** The s
59d0: 74 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c  tructure is recl
59e0: 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e  aimed when the n
59f0: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
5a00: 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f  s to it drops to
5a10: 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  .** zero..**.** 
5a20: 54 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20  There are never 
5a30: 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20  very many files 
5a40: 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65  open at one time
5a50: 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65   and lookups are
5a60: 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72   not.** a perfor
5a70: 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70  mance-critical p
5a80: 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75  ath, so it is su
5a90: 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20  fficient to put 
5aa0: 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75  these.** structu
5ab0: 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  res on a linked 
5ac0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  list..*/.struct 
5ad0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a  vxworksFileId {.
5ae0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
5af0: 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20  FileId *pNext;  
5b00: 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73  /* Next in a lis
5b10: 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f  t of them all */
5b20: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
5b50: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
5b60: 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e   one */.  int nN
5b70: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
5b80: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
5b90: 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69  h of the zCanoni
5ba0: 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67  calName[] string
5bb0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e   */.  char *zCan
5bc0: 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20  onicalName;     
5bd0: 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c      /* Canonical
5be0: 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a   filename */.};.
5bf0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
5c00: 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75  /* .** All uniqu
5c10: 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
5c20: 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64  held on a linked
5c30: 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20   list headed by 
5c40: 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65  this.** variable
5c50: 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  :.*/.static stru
5c60: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
5c70: 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73   *vxworksFileLis
5c80: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69  t = 0;../*.** Si
5c90: 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d  mplify a filenam
5ca0: 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e  e into its canon
5cb0: 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20  ical form.** by 
5cc0: 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  making the follo
5cd0: 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a  wing changes:.**
5ce0: 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20  .**  * removing 
5cf0: 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64  any trailing and
5d00: 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20   duplicate /.** 
5d10: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69   * convert /./ i
5d20: 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a  nto just /.**  *
5d30: 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20   convert /A/../ 
5d40: 77 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73  where A is any s
5d50: 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20  imple name into 
5d60: 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61  just /.**.** Cha
5d70: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e  nges are made in
5d80: 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20  -place.  Return 
5d90: 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e  the new name len
5da0: 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  gth..**.** The o
5db0: 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
5dc0: 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d   is in z[0..n-1]
5dd0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
5de0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61  mber of.** chara
5df0: 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d  cters in the sim
5e00: 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f  plified name..*/
5e10: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f  .static int vxwo
5e20: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
5e30: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
5e40: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77  .  int i, j;.  w
5e50: 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e  hile( n>1 && z[n
5e60: 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b  -1]=='/' ){ n--;
5e70: 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20   }.  for(i=j=0; 
5e80: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
5e90: 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  f( z[i]=='/' ){.
5ea0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
5eb0: 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65  =='/' ) continue
5ec0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  ;.      if( z[i+
5ed0: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e  1]=='.' && i+2<n
5ee0: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20   && z[i+2]=='/' 
5ef0: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  ){.        i += 
5f00: 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  1;.        conti
5f10: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
5f20: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
5f30: 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a  .' && i+3<n && z
5f40: 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b  [i+2]=='.' && z[
5f50: 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+3]=='/' ){.   
5f60: 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20       while( j>0 
5f70: 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29  && z[j-1]!='/' )
5f80: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
5f90: 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b   if( j>0 ){ j--;
5fa0: 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20   }.        i += 
5fb0: 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  2;.        conti
5fc0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
5fd0: 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20   }.    z[j++] = 
5fe0: 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d  z[i];.  }.  z[j]
5ff0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a   = 0;.  return j
6000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
6010: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44  a unique file ID
6020: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61   for the given a
6030: 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65  bsolute pathname
6040: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
6050: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78  ointer to the vx
6060: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
6070: 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65  ct.  This pointe
6080: 72 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a  r is the unique.
6090: 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a  ** file ID..**.*
60a0: 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64  * The nRef field
60b0: 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46   of the vxworksF
60c0: 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20  ileId object is 
60d0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f  incremented befo
60e0: 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  re.** the object
60f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41   is returned.  A
6100: 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65   new vxworksFile
6110: 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  Id object is cre
6120: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65  ated.** and adde
6130: 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20  d to the global 
6140: 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72  list if necessar
6150: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  y..**.** If a me
6160: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
6170: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
6180: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
6190: 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f  atic struct vxwo
61a0: 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72  rksFileId *vxwor
61b0: 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e  ksFindFileId(con
61c0: 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75  st char *zAbsolu
61d0: 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63  teName){.  struc
61e0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
61f0: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f  *pNew;         /
6200: 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64  * search key and
6210: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
6220: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
6230: 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61  FileId *pCandida
6240: 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  te;   /* For loo
6250: 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69  ping over existi
6260: 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20  ng file IDs */. 
6270: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6290: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
62a0: 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20  f zAbsoluteName 
62b0: 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73  string */..  ass
62c0: 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ert( zAbsoluteNa
62d0: 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20  me[0]=='/' );.  
62e0: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
62f0: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a  zAbsoluteName);.
6300: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
6310: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
6320: 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29  *pNew) + (n+1) )
6330: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
6340: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
6350: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
6360: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
6370: 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  w[1];.  memcpy(p
6380: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
6390: 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ame, zAbsoluteNa
63a0: 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20  me, n+1);.  n = 
63b0: 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e  vxworksSimplifyN
63c0: 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  ame(pNew->zCanon
63d0: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20  icalName, n);.. 
63e0: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
63f0: 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
6400: 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74   that matching t
6410: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d  he canonical nam
6420: 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64  e..  ** If found
6430: 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  , increment the 
6440: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
6450: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
6460: 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65  nter to.  ** the
6470: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
6480: 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  D..  */.  unixEn
6490: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f  terMutex();.  fo
64a0: 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77  r(pCandidate=vxw
64b0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43  orksFileList; pC
64c0: 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69  andidate; pCandi
64d0: 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d  date=pCandidate-
64e0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
64f0: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61   pCandidate->nNa
6500: 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d  me==n .     && m
6510: 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65  emcmp(pCandidate
6520: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
6530: 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  , pNew->zCanonic
6540: 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20  alName, n)==0.  
6550: 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69    ){.       sqli
6560: 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
6570: 20 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74         pCandidat
6580: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  e->nRef++;.     
6590: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
65a0: 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72  ();.       retur
65b0: 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20  n pCandidate;.  
65c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
65d0: 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64   match was found
65e0: 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20  .  We will make 
65f0: 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f  a new file ID */
6600: 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20  .  pNew->nRef = 
6610: 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65  1;.  pNew->nName
6620: 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = n;.  pNew->pN
6630: 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c  ext = vxworksFil
6640: 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73  eList;.  vxworks
6650: 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b  FileList = pNew;
6660: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
6670: 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  x();.  return pN
6680: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  ew;.}../*.** Dec
6690: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
66a0: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20  ence count on a 
66b0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
66c0: 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74  ject.  Free.** t
66d0: 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74  he object when t
66e0: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
66f0: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  nt reaches zero.
6700: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6710: 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
6720: 6c 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f  leId(struct vxwo
6730: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b  rksFileId *pId){
6740: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
6750: 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
6760: 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Id->nRef>0 );.  
6770: 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pId->nRef--;.  i
6780: 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20  f( pId->nRef==0 
6790: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78  ){.    struct vx
67a0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70  worksFileId **pp
67b0: 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78  ;.    for(pp=&vx
67c0: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a  worksFileList; *
67d0: 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20  pp && *pp!=pId; 
67e0: 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e  pp = &((*pp)->pN
67f0: 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65  ext)){}.    asse
6800: 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a  rt( *pp==pId );.
6810: 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70      *pp = pId->p
6820: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
6830: 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d  3_free(pId);.  }
6840: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
6850: 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  x();.}.#endif /*
6860: 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
6870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
6880: 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69  End of Unique Fi
6890: 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73  le ID Utility Us
68a0: 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a  ed By VxWorks **
68b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
68c0: 2a 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 2f 0a 0a  *************/..
6910: 0a 2f 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 2a 2a 2a 2a 2a  ****************
6930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6960: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
6970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73  ************ Pos
6980: 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b  ix Advisory Lock
6990: 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
69a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69b0: 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76  .**.** POSIX adv
69c0: 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20  isory locks are 
69d0: 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e  broken by design
69e0: 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33  .  ANSI STD 1003
69f0: 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63  .1 (1996).** sec
6a00: 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e  tion 6.5.2.2 lin
6a10: 65 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34  es 483 through 4
6a20: 39 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20  90 specify that 
6a30: 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a  when a process.*
6a40: 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73  * sets or clears
6a50: 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70   a lock, that op
6a60: 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65  eration override
6a70: 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b  s any prior lock
6a80: 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20  s set.** by the 
6a90: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49  same process.  I
6aa0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69  t does not expli
6ab0: 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75  citly say so, bu
6ac0: 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a  t this implies.*
6ad0: 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69  * that it overri
6ae0: 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79  des locks set by
6af0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
6b00: 73 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72  s using a differ
6b10: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
6b20: 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65  riptor.  Conside
6b30: 72 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65  r this test case
6b40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e  :.**.**       in
6b50: 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f  t fd1 = open("./
6b60: 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f  file1", O_RDWR|O
6b70: 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a  _CREAT, 0644);.*
6b80: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20  *       int fd2 
6b90: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22  = open("./file2"
6ba0: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
6bb0: 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53  , 0644);.**.** S
6bc0: 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61  uppose ./file1 a
6bd0: 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72  nd ./file2 are r
6be0: 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66  eally the same f
6bf0: 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ile (because.** 
6c00: 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72  one is a hard or
6c10: 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74   symbolic link t
6c20: 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65  o the other) the
6c30: 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20  n if you set.** 
6c40: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
6c50: 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74  k on fd1, then t
6c60: 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63  ry to get an exc
6c70: 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f  lusive lock.** o
6c80: 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e  n fd2, it works.
6c90: 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65    I would have e
6ca0: 78 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f  xpected the seco
6cb0: 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61  nd lock to.** fa
6cc0: 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  il since there w
6cd0: 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  as already a loc
6ce0: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75  k on the file du
6cf0: 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74  e to fd1..** But
6d00: 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20   not so.  Since 
6d10: 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20  both locks came 
6d20: 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72  from the same pr
6d30: 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65  ocess, the.** se
6d40: 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74  cond overrides t
6d50: 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74  he first, even t
6d60: 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20  hough they were 
6d70: 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  on different.** 
6d80: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
6d90: 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65   opened on diffe
6da0: 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e  rent file names.
6db0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e  .**.** This mean
6dc0: 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74  s that we cannot
6dd0: 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73   use POSIX locks
6de0: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
6df0: 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61  file access.** a
6e00: 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74  mong competing t
6e10: 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61  hreads of the sa
6e20: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53  me process.  POS
6e30: 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f  IX locks will wo
6e40: 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79  rk fine.** to sy
6e50: 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73  nchronize access
6e60: 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20   for threads in 
6e70: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
6e80: 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74  es, but not.** t
6e90: 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68  hreads within th
6ea0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a  e same process..
6eb0: 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  **.** To work ar
6ec0: 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d  ound the problem
6ed0: 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20  , SQLite has to 
6ee0: 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b  manage file lock
6ef0: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  s internally.** 
6f00: 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65  on its own.  Whe
6f10: 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61  never a new data
6f20: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  base is opened, 
6f30: 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20  we have to find 
6f40: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  the.** specific 
6f50: 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74  inode of the dat
6f60: 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20  abase file (the 
6f70: 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69  inode is determi
6f80: 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ned by the.** st
6f90: 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20  _dev and st_ino 
6fa0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74  fields of the st
6fb0: 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61  at structure tha
6fc0: 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20  t fstat() fills 
6fd0: 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b  in).** and check
6fe0: 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61   for locks alrea
6ff0: 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74  dy existing on t
7000: 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e  hat inode.  When
7010: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72   locks are.** cr
7020: 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64  eated or removed
7030: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f  , we have to loo
7040: 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74  k at our own int
7050: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
7060: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20  the.** locks to 
7070: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74  see if another t
7080: 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f  hread has previo
7090: 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20  usly set a lock 
70a0: 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  on that same.** 
70b0: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73  inode..**.** (As
70c0: 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20  ide: The use of 
70d0: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73  inode numbers as
70e0: 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73   unique IDs does
70f0: 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57   not work on VxW
7100: 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57  orks..** For VxW
7110: 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f  orks, we have to
7120: 20 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61   use the alterna
7130: 74 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73  tive unique ID s
7140: 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a  ystem based on.*
7150: 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  * canonical file
7160: 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65  name and impleme
7170: 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76  nted in the prev
7180: 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a  ious division.).
7190: 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  **.** The sqlite
71a0: 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
71b0: 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f   for POSIX is no
71c0: 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20   longer just an 
71d0: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
71e0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20  descriptor.  It 
71f0: 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75  is now a structu
7200: 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  re that holds th
7210: 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  e integer file.*
7220: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  * descriptor and
7230: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
7240: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
7250: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74  escribes the int
7260: 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f  ernal.** locks o
7270: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
7280: 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72  ing inode.  Ther
7290: 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67  e is one locking
72a0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65   structure.** pe
72b0: 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74  r inode, so if t
72c0: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73  he same inode is
72d0: 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62   opened twice, b
72e0: 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72  oth unixFile str
72f0: 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74  uctures.** point
7300: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63   to the same loc
7310: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  king structure. 
7320: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   The locking str
7330: 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20  ucture keeps.** 
7340: 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  a reference coun
7350: 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e  t (so we will kn
7360: 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74  ow when to delet
7370: 65 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74  e it) and a "cnt
7380: 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20  ".** field that 
7390: 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74  tells us its int
73a0: 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75  ernal lock statu
73b0: 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73  s.  cnt==0 means
73c0: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
73d0: 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d  unlocked.  cnt==
73e0: 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c  -1 means the fil
73f0: 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  e has an exclusi
7400: 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e  ve lock..** cnt>
7410: 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72  0 means there ar
7420: 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63  e cnt shared loc
7430: 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ks on the file..
7440: 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70  **.** Any attemp
7450: 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  t to lock or unl
7460: 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74  ock a file first
7470: 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b   checks the lock
7480: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
7490: 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73  .  The fcntl() s
74a0: 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e  ystem call is on
74b0: 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  ly invoked to se
74c0: 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f  t a .** POSIX lo
74d0: 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e  ck if the intern
74e0: 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72  al lock structur
74f0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65  e transitions be
7500: 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65  tween.** a locke
7510: 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65  d and an unlocke
7520: 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42  d state..**.** B
7530: 75 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20  ut wait:  there 
7540: 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f  are yet more pro
7550: 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58  blems with POSIX
7560: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e   advisory locks.
7570: 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c  .**.** If you cl
7580: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
7590: 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  iptor that point
75a0: 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74  s to a file that
75b0: 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61   has locks,.** a
75c0: 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74  ll locks on that
75d0: 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f   file that are o
75e0: 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72  wned by the curr
75f0: 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a  ent process are.
7600: 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f  ** released.  To
7610: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
7620: 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20  s problem, each 
7630: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
7640: 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e  ject.** maintain
7650: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
7660: 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69   number of pendi
7670: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20  ng locks on tha 
7680: 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61  inode..** When a
7690: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
76a0: 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e  e to close an un
76b0: 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65  ixFile, if there
76c0: 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e   are.** other un
76d0: 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74  ixFile open on t
76e0: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68  he same inode th
76f0: 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c  at are holding l
7700: 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a  ocks, the call.*
7710: 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65  * to close() the
7720: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7730: 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
7740: 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f  il all of the lo
7750: 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68  cks clear..** Th
7760: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
7770: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
7780: 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64  a list of file d
7790: 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20  escriptors that 
77a0: 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c  need to.** be cl
77b0: 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69  osed and that li
77c0: 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e  st is walked (an
77d0: 64 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20  d cleared) when 
77e0: 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a  the last lock.**
77f0: 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59   clears..**.** Y
7800: 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c  et another probl
7810: 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64  em:  LinuxThread
7820: 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65  s do not play we
7830: 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f  ll with posix lo
7840: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20  cks..**.** Many 
7850: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
7860: 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20  f linux use the 
7870: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62  LinuxThreads lib
7880: 72 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a  rary which is.**
7890: 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c   not posix compl
78a0: 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e  iant.  Under Lin
78b0: 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63  uxThreads, a loc
78c0: 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72  k created by thr
78d0: 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20  ead.** A cannot 
78e0: 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f  be modified or o
78f0: 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64  verridden by a d
7900: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20  ifferent thread 
7910: 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61  B..** Only threa
7920: 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74  d A can modify t
7930: 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e  he lock.  Lockin
7940: 67 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f  g behavior is co
7950: 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20  rrect.** if the 
7960: 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20  appliation uses 
7970: 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65  the newer Native
7980: 20 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69   Posix Thread Li
7990: 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20  brary (NPTL).** 
79a0: 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20  on linux - with 
79b0: 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61  NPTL a lock crea
79c0: 74 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20  ted by thread A 
79d0: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
79e0: 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20  ks.** in thread 
79f0: 42 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  B.  But there is
7a00: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
7a10: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
7a20: 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69  which.** threadi
7a30: 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65  ng library is be
7a40: 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68  ing used.  So th
7a50: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
7a60: 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70   know at.** comp
7a70: 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72  ile-time whether
7a80: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41   or not thread A
7a90: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f   can override lo
7aa0: 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e  cks on thread B.
7ab0: 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64  .** One has to d
7ac0: 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65  o a run-time che
7ad0: 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  ck to discover t
7ae0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
7af0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72  he.** current pr
7b00: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  ocess..**.** SQL
7b10: 69 74 65 20 75 73 65 64 20 74 6f 20 73 75 70 70  ite used to supp
7b20: 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73  ort LinuxThreads
7b30: 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74 20 66  .  But support f
7b40: 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a  or LinuxThreads.
7b50: 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20 62  ** was dropped b
7b60: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65  eginning with ve
7b70: 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51  rsion 3.7.0.  SQ
7b80: 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  Lite will still 
7b90: 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e  work with.** Lin
7ba0: 75 78 54 68 72 65 61 64 73 20 70 72 6f 76 69 64  uxThreads provid
7bb0: 65 64 20 74 68 61 74 20 28 31 29 20 74 68 65 72  ed that (1) ther
7bc0: 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  e is no more tha
7bd0: 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n one connection
7be0: 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73   .** per databas
7bf0: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61  e file in the sa
7c00: 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28  me process and (
7c10: 32 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  2) database conn
7c20: 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f  ections.** do no
7c30: 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68  t move across th
7c40: 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  reads..*/../*.**
7c50: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
7c60: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
7c70: 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61  ructure serves a
7c80: 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a  s the key used.*
7c90: 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  * to locate a pa
7ca0: 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f  rticular unixIno
7cb0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a  deInfo object..*
7cc0: 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  /.struct unixFil
7cd0: 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65  eId {.  dev_t de
7ce0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
7cf0: 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75      /* Device nu
7d00: 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56  mber */.#if OS_V
7d10: 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
7d20: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
7d30: 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66  Id;  /* Unique f
7d40: 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72  ile ID for vxwor
7d50: 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69  ks. */.#else.  i
7d60: 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20  no_t ino;       
7d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
7d80: 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65  ode number */.#e
7d90: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
7da0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
7db0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
7dc0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
7dd0: 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  ed for each open
7de0: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20  .** inode.  Or, 
7df0: 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c  on LinuxThreads,
7e00: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66   there is one of
7e10: 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65   these structure
7e20: 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e  s for.** each in
7e30: 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61  ode opened by ea
7e40: 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ch thread..**.**
7e50: 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20   A single inode 
7e60: 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c  can have multipl
7e70: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
7e80: 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78  rs, so each unix
7e90: 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  File.** structur
7ea0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
7eb0: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
7ec0: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
7ed0: 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f  ct and this.** o
7ee0: 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f  bject keeps a co
7ef0: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
7f00: 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f  r of unixFile po
7f10: 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f  inting to it..*/
7f20: 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64  .struct unixInod
7f30: 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74  eInfo {.  struct
7f40: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
7f50: 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
7f60: 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20   lookup key */. 
7f70: 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20   int nShared;   
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48   /* Number of SH
7fa0: 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ARED locks held 
7fb0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
7fc0: 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20  ar eFileLock;   
7fd0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
7fe0: 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45  HARED_LOCK, RESE
7ff0: 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a  RVED_LOCK etc. *
8000: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
8010: 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20  r bProcessLock; 
8020: 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73      /* An exclus
8030: 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b  ive process lock
8040: 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e   is held */.  in
8050: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8070: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
8080: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ers to this stru
8090: 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53  cture */.  unixS
80a0: 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
80b0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68  ;          /* Sh
80c0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
80d0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
80e0: 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   inode */.  int 
80f0: 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  nLock;          
8100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8110: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
8120: 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ding file locks 
8130: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
8140: 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20  d *pUnused;     
8150: 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66       /* Unused f
8160: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
8170: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e  to close */.  un
8180: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65  ixInodeInfo *pNe
8190: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  xt;           /*
81a0: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69   List of all uni
81b0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
81c0: 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  ts */.  unixInod
81d0: 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20  eInfo *pPrev;   
81e0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e          /*    ..
81f0: 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64  .. doubly linked
8200: 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   */.#if SQLITE_E
8210: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
8220: 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  YLE.  unsigned l
8230: 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42  ong long sharedB
8240: 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50  yte;  /* for AFP
8250: 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65   simulated share
8260: 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66  d lock */.#endif
8270: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
8280: 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20    sem_t *pSem;  
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82a0: 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58    /* Named POSIX
82b0: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20   semaphore */.  
82c0: 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41  char aSemName[MA
82d0: 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20  X_PATHNAME+2];  
82e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20  /* Name of that 
82f0: 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e  semaphore */.#en
8300: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20  dif.};../*.** A 
8310: 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69  lists of all uni
8320: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
8330: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e  ts..*/.static un
8340: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f  ixInodeInfo *ino
8350: 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  deList = 0;../*.
8360: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
8370: 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72  ion - unixLogErr
8380: 6f 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20  or_x(), is only 
8390: 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20  ever called via 
83a0: 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69  the macro.** uni
83b0: 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a  xLogError()..**.
83c0: 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64  ** It is invoked
83d0: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
83e0: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
83f0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72  function and err
8400: 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73  no has been.** s
8410: 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65  et. It logs a me
8420: 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69  ssage using sqli
8430: 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69  te3_log() contai
8440: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
8450: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72   value of.** err
8460: 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69  no and, if possi
8470: 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72  ble, the human-r
8480: 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65  eadable equivale
8490: 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72  nt from strerror
84a0: 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f  () or.** strerro
84b0: 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  r_r()..**.** The
84c0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
84d0: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61  passed to the ma
84e0: 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68  cro should be th
84f0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61  e error code tha
8500: 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74  t.** will be ret
8510: 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20  urned to SQLite 
8520: 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (e.g. SQLITE_IOE
8530: 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54  RR_DELETE, SQLIT
8540: 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a  E_CANTOPEN). .**
8550: 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75   The two subsequ
8560: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68  ent arguments sh
8570: 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65  ould be the name
8580: 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74   of the OS funct
8590: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c  ion that.** fail
85a0: 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b  ed (e.g. "unlink
85b0: 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74  ", "open") and t
85c0: 68 65 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  he the associate
85d0: 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61  d file-system pa
85e0: 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a  th,.** if any..*
85f0: 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f  /.#define unixLo
8600: 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20 20  gError(a,b,c)   
8610: 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74    unixLogErrorAt
8620: 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e  Line(a,b,c,__LIN
8630: 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20  E__).static int 
8640: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
8650: 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64  ne(.  int errcod
8660: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
8670: 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20        /* SQLite 
8680: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
8690: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
86a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
86b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75  /* Name of OS fu
86c0: 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c  nction that fail
86d0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
86e0: 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
86f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
8700: 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20  path associated 
8710: 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20  with error */.  
8720: 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20  int iLine       
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e  /* Source line n
8750: 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f  umber where erro
8760: 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b  r occurred */.){
8770: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20  .  char *zErr;  
8780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8790: 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72     /* Message fr
87a0: 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72  om strerror() or
87b0: 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20   equivalent */. 
87c0: 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72   int iErrno = er
87d0: 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
87e0: 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c   /* Saved syscal
87f0: 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a  l error number *
8800: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
8810: 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73  is not a threads
8820: 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54  afe build (SQLIT
8830: 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29  E_THREADSAFE==0)
8840: 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20  , then use.  ** 
8850: 74 68 65 20 73 74 72 65 72 72 6f 72 28 29 20 66  the strerror() f
8860: 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  unction to obtai
8870: 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64  n the human-read
8880: 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61  able error messa
8890: 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65  ge.  ** equivale
88a0: 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68  nt to errno. Oth
88b0: 65 72 77 69 73 65 2c 20 75 73 65 20 73 74 72 65  erwise, use stre
88c0: 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a  rror_r()..  */ .
88d0: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
88e0: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
88f0: 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52  (HAVE_STRERROR_R
8900: 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38 30  ).  char aErr[80
8910: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72  ];.  memset(aErr
8920: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72  , 0, sizeof(aErr
8930: 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72  ));.  zErr = aEr
8940: 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45  r;..  /* If STRE
8950: 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73  RROR_R_CHAR_P (s
8960: 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73  et by autoconf s
8970: 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45  cripts) or __USE
8980: 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c  _GNU is defined,
8990: 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61  .  ** assume tha
89a0: 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f  t the system pro
89b0: 76 69 64 65 73 20 74 68 65 20 74 68 65 20 47 4e  vides the the GN
89c0: 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72  U version of str
89d0: 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74 20 0a  error_r() that .
89e0: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70    ** returns a p
89f0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
8a00: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
8a10: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
8a20: 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20   That pointer . 
8a30: 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   ** may point to
8a40: 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d   aErr[], or it m
8a50: 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ay point to some
8a60: 20 73 74 61 74 69 63 20 73 74 6f 72 61 67 65 20   static storage 
8a70: 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a  somewhere. .  **
8a80: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75   Otherwise, assu
8a90: 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74  me that the syst
8aa0: 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  em provides the 
8ab0: 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66  POSIX version of
8ac0: 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f   .  ** strerror_
8ad0: 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79  r(), which alway
8ae0: 73 20 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f  s writes an erro
8af0: 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61  r message into a
8b00: 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Err[]..  **.  **
8b10: 20 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63   If the code inc
8b20: 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73  orrectly assumes
8b30: 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
8b40: 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68  POSIX version th
8b50: 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c  at is.  ** avail
8b60: 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20  able, the error 
8b70: 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74  message will oft
8b80: 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73  en be an empty s
8b90: 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a  tring. Not a.  *
8ba0: 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20  * huge problem. 
8bb0: 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63  Incorrectly conc
8bc0: 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68 65 20  luding that the 
8bd0: 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61  GNU version is a
8be0: 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63  vailable .  ** c
8bf0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73  ould lead to a s
8c00: 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a  egfault though..
8c10: 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
8c20: 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52  (STRERROR_R_CHAR
8c30: 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  _P) || defined(_
8c40: 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72  _USE_GNU).  zErr
8c50: 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74   = .# endif.  st
8c60: 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c  rerror_r(iErrno,
8c70: 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45   aErr, sizeof(aE
8c80: 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53  rr)-1);..#elif S
8c90: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
8ca0: 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20  .  /* This is a 
8cb0: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
8cc0: 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72  , but strerror_r
8cd0: 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  () is not availa
8ce0: 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d  ble. */.  zErr =
8cf0: 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20   "";.#else.  /* 
8d00: 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62  Non-threadsafe b
8d10: 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72  uild, use strerr
8d20: 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20  or(). */.  zErr 
8d30: 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e  = strerror(iErrn
8d40: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  o);.#endif..  as
8d50: 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53  sert( errcode!=S
8d60: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
8d70: 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61  ( zPath==0 ) zPa
8d80: 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74  th = "";.  sqlit
8d90: 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a  e3_log(errcode,.
8da0: 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63        "os_unix.c
8db0: 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29  :%d: (%d) %s(%s)
8dc0: 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c   - %s",.      iL
8dd0: 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75  ine, iErrno, zFu
8de0: 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a  nc, zPath, zErr.
8df0: 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65    );..  return e
8e00: 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrcode;.}../*.**
8e10: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65   Close a file de
8e20: 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  scriptor..**.** 
8e30: 57 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 63  We assume that c
8e40: 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c  lose() almost al
8e50: 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63  ways works, sinc
8e60: 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20  e it is only in 
8e70: 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61  a.** very sick a
8e80: 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e  pplication or on
8e90: 20 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61   a very sick pla
8ea0: 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69  tform that it mi
8eb0: 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20  ght fail..** If 
8ec0: 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69  it does fail, si
8ed0: 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69  mply leak the fi
8ee0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62  le descriptor, b
8ef0: 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a  ut do log the.**
8f00: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   error..**.** No
8f10: 74 65 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  te that it is no
8f20: 74 20 73 61 66 65 20 74 6f 20 72 65 74 72 79 20  t safe to retry 
8f30: 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45 49  close() after EI
8f40: 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a  NTR since the.**
8f50: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8f60: 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72 65   might have alre
8f70: 61 64 79 20 62 65 65 6e 20 72 65 75 73 65 64 20  ady been reused 
8f80: 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  by another threa
8f90: 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27  d..** So we don'
8fa0: 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65  t even try to re
8fb0: 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49  cover from an EI
8fc0: 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74  NTR.  Just log t
8fd0: 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20  he error.** and 
8fe0: 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  move on..*/.stat
8ff0: 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63  ic void robust_c
9000: 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  lose(unixFile *p
9010: 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74  File, int h, int
9020: 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20   lineno){.  if( 
9030: 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20  osClose(h) ){.  
9040: 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74    unixLogErrorAt
9050: 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52  Line(SQLITE_IOER
9060: 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22  R_CLOSE, "close"
9070: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9080: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f           pFile ?
9090: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20   pFile->zPath : 
90a0: 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a  0, lineno);.  }.
90b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
90c0: 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ll file descript
90d0: 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64 20 69  ors accumuated i
90e0: 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  n the unixInodeI
90f0: 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73  nfo->pUnused lis
9100: 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  t..*/ .static vo
9110: 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46  id closePendingF
9120: 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ds(unixFile *pFi
9130: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
9140: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
9150: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
9160: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b  UnixUnusedFd *p;
9170: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
9180: 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d  *pNext;.  for(p=
9190: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b  pInode->pUnused;
91a0: 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
91b0: 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65    pNext = p->pNe
91c0: 78 74 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63  xt;.    robust_c
91d0: 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66  lose(pFile, p->f
91e0: 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
91f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
9200: 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d  );.  }.  pInode-
9210: 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
9220: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
9230: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73   unixInodeInfo s
9240: 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75  tructure previou
9250: 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
9260: 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
9270: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65  ..**.** The mute
9280: 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20  x entered using 
9290: 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  the unixEnterMut
92a0: 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ex() function mu
92b0: 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
92c0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
92d0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
92e0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
92f0: 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78  seInodeInfo(unix
9300: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
9310: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
9320: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
9330: 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
9340: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
9350: 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
9360: 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20  (pInode) ){.    
9370: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  pInode->nRef--;.
9380: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
9390: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
93a0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
93b0: 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a  >pShmNode==0 );.
93c0: 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
93d0: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
93e0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
93f0: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  pPrev ){.       
9400: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
9410: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70  >pPrev->pNext==p
9420: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
9430: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e   pInode->pPrev->
9440: 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  pNext = pInode->
9450: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pNext;.      }el
9460: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
9470: 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70  rt( inodeList==p
9480: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
9490: 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e   inodeList = pIn
94a0: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
94b0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
94c0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  node->pNext ){. 
94d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
94e0: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50  Inode->pNext->pP
94f0: 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  rev==pInode );. 
9500: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70         pInode->p
9510: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49  Next->pPrev = pI
9520: 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20  node->pPrev;.   
9530: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
9540: 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b  e3_free(pInode);
9550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9560: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65  .** Given a file
9570: 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63   descriptor, loc
9580: 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  ate the unixInod
9590: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  eInfo object tha
95a0: 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74  t.** describes t
95b0: 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70  hat file descrip
95c0: 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e  tor.  Create a n
95d0: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
95e0: 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74  ary.  The.** ret
95f0: 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20  urn value might 
9600: 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  be uninitialized
9610: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
9620: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  urs..**.** The m
9630: 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69  utex entered usi
9640: 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  ng the unixEnter
9650: 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  Mutex() function
9660: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
9670: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
9680: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
9690: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61  *.** Return an a
96a0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
96b0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
96c0: 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e   int findInodeIn
96d0: 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  fo(.  unixFile *
96e0: 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  pFile,          
96f0: 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c       /* Unix fil
9700: 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63  e with file desc
9710: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79   used in the key
9720: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
9730: 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20  nfo **ppInode   
9740: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
9750: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
9760: 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a   object here */.
9770: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
9780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9790: 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61      /* System ca
97a0: 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  ll return code *
97b0: 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  /.  int fd;     
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97d0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
97e0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46  escriptor for pF
97f0: 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ile */.  struct 
9800: 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49  unixFileId fileI
9810: 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75  d;      /* Looku
9820: 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e  p key for the un
9830: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20  ixInodeInfo */. 
9840: 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
9850: 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  tbuf;           
9860: 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c  /* Low-level fil
9870: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
9880: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
9890: 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20   *pInode = 0;   
98a0: 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75    /* Candidate u
98b0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
98c0: 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ect */..  assert
98d0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
98e0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c  ) );..  /* Get l
98f0: 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61  ow-level informa
9900: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66  tion about the f
9910: 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e 20  ile that we can 
9920: 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65  used to.  ** cre
9930: 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d  ate a unique nam
9940: 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a  e for the file..
9950: 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c    */.  fd = pFil
9960: 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46  e->h;.  rc = osF
9970: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
9980: 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  f);.  if( rc!=0 
9990: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
99a0: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
99b0: 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f  .#ifdef EOVERFLO
99c0: 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  W.    if( pFile-
99d0: 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45  >lastErrno==EOVE
99e0: 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53  RFLOW ) return S
99f0: 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e  QLITE_NOLFS;.#en
9a00: 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
9a10: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
9a20: 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45  ..#ifdef __APPLE
9a30: 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20  __.  /* On OS X 
9a40: 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65  on an msdos file
9a50: 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64  system, the inod
9a60: 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f  e number is repo
9a70: 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72  rted.  ** incorr
9a80: 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73  ectly for zero-s
9a90: 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20  ize files.  See 
9aa0: 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54  ticket #3260.  T
9ab0: 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75  o work.  ** arou
9ac0: 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  nd this problem 
9ad0: 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20  (we consider it 
9ae0: 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e  a bug in OS X, n
9af0: 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20  ot SQLite).  ** 
9b00: 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61  we always increa
9b10: 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  se the file size
9b20: 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67   to 1 by writing
9b30: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20   a single byte. 
9b40: 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63   ** prior to acc
9b50: 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65  essing the inode
9b60: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e   number.  The on
9b70: 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69  e byte written i
9b80: 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20  s.  ** an ASCII 
9b90: 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68  'S' character wh
9ba0: 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73  ich also happens
9bb0: 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74   to be the first
9bc0: 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68   byte.  ** in th
9bd0: 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72  e header of ever
9be0: 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  y SQLite databas
9bf0: 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  e.  In this way,
9c00: 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69   if there.  ** i
9c10: 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
9c20: 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f  on such that ano
9c30: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
9c40: 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65  already populate
9c50: 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  d.  ** the first
9c60: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
9c70: 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65  abase, no damage
9c80: 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   is done..  */. 
9c90: 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f   if( statbuf.st_
9ca0: 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c  size==0 && (pFil
9cb0: 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c  e->fsFlags & SQL
9cc0: 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
9cd0: 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20  SDOS)!=0 ){.    
9ce0: 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65  do{ rc = osWrite
9cf0: 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77  (fd, "S", 1); }w
9d00: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
9d10: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
9d20: 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20    if( rc!=1 ){. 
9d30: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
9d40: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
9d50: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9d60: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
9d70: 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74      rc = osFstat
9d80: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
9d90: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
9da0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
9db0: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
9dc0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9dd0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
9de0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
9df0: 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20  memset(&fileId, 
9e00: 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  0, sizeof(fileId
9e10: 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76  ));.  fileId.dev
9e20: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65   = statbuf.st_de
9e30: 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  v;.#if OS_VXWORK
9e40: 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d  S.  fileId.pId =
9e50: 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c   pFile->pId;.#el
9e60: 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20  se.  fileId.ino 
9e70: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f  = statbuf.st_ino
9e80: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64  ;.#endif.  pInod
9e90: 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  e = inodeList;. 
9ea0: 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26   while( pInode &
9eb0: 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64  & memcmp(&fileId
9ec0: 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  , &pInode->fileI
9ed0: 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  d, sizeof(fileId
9ee0: 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  )) ){.    pInode
9ef0: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
9f00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f  ;.  }.  if( pIno
9f10: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e  de==0 ){.    pIn
9f20: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ode = sqlite3_ma
9f30: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49  lloc( sizeof(*pI
9f40: 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28  node) );.    if(
9f50: 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20   pInode==0 ){.  
9f60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9f70: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
9f80: 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65     memset(pInode
9f90: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e  , 0, sizeof(*pIn
9fa0: 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ode));.    memcp
9fb0: 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  y(&pInode->fileI
9fc0: 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65  d, &fileId, size
9fd0: 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20  of(fileId));.   
9fe0: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20   pInode->nRef = 
9ff0: 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70  1;.    pInode->p
a000: 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74  Next = inodeList
a010: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50  ;.    pInode->pP
a020: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rev = 0;.    if(
a030: 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f   inodeList ) ino
a040: 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20  deList->pPrev = 
a050: 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64  pInode;.    inod
a060: 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a  eList = pInode;.
a070: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
a080: 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ode->nRef++;.  }
a090: 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49  .  *ppInode = pI
a0a0: 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  node;.  return S
a0b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
a0c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a0d0: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
a0e0: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
a0f0: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
a100: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
a110: 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
a120: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
a130: 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
a140: 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
a150: 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
a160: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
a170: 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
a180: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
a190: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
a1a0: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
a1b0: 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
a1c0: 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
a1d0: 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
a1e0: 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
a1f0: 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b  ic int unixCheck
a200: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
a210: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
a220: 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
a230: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
a240: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
a250: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
a260: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
a270: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
a280: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
a290: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
a2a0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
a2b0: 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65  LOCK; );..  asse
a2c0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75  rt( pFile );.  u
a2d0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
a2e0: 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
a2f0: 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
a300: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
a310: 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  ds */..  /* Chec
a320: 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
a330: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
a340: 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
a350: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
a360: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
a370: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
a380: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
a390: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68  1;.  }..  /* Oth
a3a0: 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
a3b0: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
a3c0: 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a   holds it..  */.
a3d0: 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f  #ifndef __DJGPP_
a3e0: 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  _.  if( !reserve
a3f0: 64 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e  d && !pFile->pIn
a400: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
a410: 6b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  k ){.    struct 
a420: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20  flock lock;.    
a430: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
a440: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f  SEEK_SET;.    lo
a450: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
a460: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
a470: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  lock.l_len = 1;.
a480: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
a490: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69  = F_WRLCK;.    i
a4a0: 66 28 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65  f( osFcntl(pFile
a4b0: 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
a4c0: 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ock) ){.      rc
a4d0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
a4e0: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
a4f0: 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  K;.      pFile->
a500: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
a510: 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  o;.    } else if
a520: 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46  ( lock.l_type!=F
a530: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
a540: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
a550: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
a560: 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
a570: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
a580: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
a590: 64 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e  d %d %d (unix)\n
a5a0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
a5b0: 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20   reserved));..  
a5c0: 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
a5d0: 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
a5e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
a5f0: 70 74 20 74 6f 20 73 65 74 20 61 20 73 79 73 74  pt to set a syst
a600: 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  em-lock on the f
a610: 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20  ile pFile.  The 
a620: 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63  lock is .** desc
a630: 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a  ribed by pLock..
a640: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69  **.** If the pFi
a650: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65  le was opened re
a660: 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e  ad/write from un
a670: 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68  ix-excl, then th
a680: 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65  e only lock.** e
a690: 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20  ver obtained is 
a6a0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
a6b0: 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74  k, and it is obt
a6c0: 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e  ained exactly on
a6d0: 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  ce.** the first 
a6e0: 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73  time any lock is
a6f0: 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c   attempted.  All
a700: 20 73 75 62 73 65 71 75 65 6e 74 20 73 79 73 74   subsequent syst
a710: 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70  em locking.** op
a720: 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20  erations become 
a730: 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67  no-ops.  Locking
a740: 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c   operations stil
a750: 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61  l happen interna
a760: 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  lly,.** in order
a770: 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61   to coordinate a
a780: 63 63 65 73 73 20 62 65 74 77 65 65 6e 20 73 65  ccess between se
a790: 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65 20  parate database 
a7a0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77  connections.** w
a7b0: 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ithin this proce
a7c0: 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74  ss, but all of t
a7d0: 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69  hat is handled i
a7e0: 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65  n memory and the
a7f0: 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
a800: 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61  stem does not pa
a810: 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a  rticipate..**.**
a820: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
a830: 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68  s a pass-through
a840: 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c   to fcntl(F_SETL
a850: 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73 20 75  K) if pFile is u
a860: 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20  sing.** any VFS 
a870: 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78  other than "unix
a880: 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69  -excl" or if pFi
a890: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  le is opened on 
a8a0: 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61  "unix-excl".** a
a8b0: 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e  nd is read-only.
a8c0: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
a8d0: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63  eturned if the c
a8e0: 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75  all completes su
a8f0: 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d  ccessfully, or -
a900: 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74  1 if a call.** t
a910: 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e  o fcntl() fails.
a920: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65   In this case, e
a930: 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72  rrno is set appr
a940: 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20 66 63  opriately (by fc
a950: 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69  ntl())..*/.stati
a960: 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f  c int unixFileLo
a970: 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ck(unixFile *pFi
a980: 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  le, struct flock
a990: 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20   *pLock){.  int 
a9a0: 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  rc;.  unixInodeI
a9b0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
a9c0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
a9d0: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
a9e0: 48 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65  Held() );.  asse
a9f0: 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b  rt( pInode!=0 );
aa00: 0a 20 20 69 66 28 20 28 28 70 46 69 6c 65 2d 3e  .  if( ((pFile->
aa10: 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
aa20: 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30 20 7c 7c  FILE_EXCL)!=0 ||
aa30: 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
aa40: 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20 28 28 70  sLock).   && ((p
aa50: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
aa60: 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  & UNIXFILE_RDONL
aa70: 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  Y)==0).  ){.    
aa80: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  if( pInode->bPro
aa90: 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  cessLock==0 ){. 
aaa0: 20 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63       struct floc
aab0: 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73  k lock;.      as
aac0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
aad0: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock==0 );.      
aae0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
aaf0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
ab00: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
ab10: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
ab20: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
ab30: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
ab40: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
ab50: 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20   F_WRLCK;.      
ab60: 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69  rc = osFcntl(pFi
ab70: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
ab80: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66  &lock);.      if
ab90: 28 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20  ( rc<0 ) return 
aba0: 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  rc;.      pInode
abb0: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d  ->bProcessLock =
abc0: 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   1;.      pInode
abd0: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d  ->nLock++;.    }
abe0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
abf0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
ac00: 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  e{.    rc = osFc
ac10: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
ac20: 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20  SETLK, pLock);. 
ac30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
ac40: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
ac50: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
ac60: 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
ac70: 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
ac80: 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
ac90: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
aca0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
acb0: 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
acc0: 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
acd0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
ace0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
acf0: 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
ad00: 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
ad10: 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
ad20: 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
ad30: 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
ad40: 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
ad50: 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
ad60: 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
ad70: 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
ad80: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
ad90: 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
ada0: 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
adb0: 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
adc0: 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
add0: 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
ade0: 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
adf0: 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
ae00: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
ae10: 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
ae20: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
ae30: 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
ae40: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
ae50: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
ae60: 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
ae70: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
ae80: 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
ae90: 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
aea0: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
aeb0: 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
aec0: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
aed0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
aee0: 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
aef0: 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
af00: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
af10: 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
af20: 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
af30: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
af40: 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
af50: 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
af60: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
af70: 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74  t unixLock(sqlit
af80: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
af90: 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f   eFileLock){.  /
afa0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
afb0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d  describes the im
afc0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
afd0: 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b  the various lock
afe0: 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20  s and.  ** lock 
aff0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74  transitions in t
b000: 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49  erms of the POSI
b010: 58 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65  X advisory share
b020: 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  d and exclusive.
b030: 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74    ** lock primit
b040: 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61  ives (called rea
b050: 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74  d-locks and writ
b060: 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74  e-locks below, t
b070: 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e  o avoid.  ** con
b080: 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69  fusion with SQLi
b090: 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20  te lock names). 
b0a0: 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61  The algorithms a
b0b0: 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20  re complicated. 
b0c0: 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20   ** slightly in 
b0d0: 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70  order to be comp
b0e0: 61 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64  atible with wind
b0f0: 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75  ows systems simu
b100: 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20  ltaneously.  ** 
b110: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
b120: 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
b130: 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69  , in case that i
b140: 73 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e  s ever required.
b150: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f  .  **.  ** Symbo
b160: 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73  ls defined in os
b170: 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65  .h indentify the
b180: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20   'pending byte' 
b190: 61 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65  and the 'reserve
b1a0: 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61  d.  ** byte', ea
b1b0: 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20  ch single bytes 
b1c0: 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66  at well known of
b1d0: 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27  fsets, and the '
b1e0: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
b1f0: 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65   range', a range
b200: 20 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74   of 510 bytes at
b210: 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66   a well known of
b220: 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fset..  **.  ** 
b230: 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52  To obtain a SHAR
b240: 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d  ED lock, a read-
b250: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
b260: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
b270: 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66  .  ** byte'.  If
b280: 20 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73   this is success
b290: 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79  ful, a random by
b2a0: 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61  te from the 'sha
b2b0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
b2c0: 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63  nge' is read-loc
b2d0: 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ked and the lock
b2e0: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
b2f0: 20 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e   byte' released.
b300: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f  .  **.  ** A pro
b310: 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62  cess may only ob
b320: 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
b330: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
b340: 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e  s a SHARED lock.
b350: 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44  .  ** A RESERVED
b360: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
b370: 6e 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67  nted by grabbing
b380: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
b390: 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72   the.  ** 'reser
b3a0: 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a  ved byte'. .  **
b3b0: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
b3c0: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
b3d0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61  a PENDING lock a
b3e0: 66 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61  fter it has obta
b3f0: 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52  ined a.  ** SHAR
b400: 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49  ED lock. A PENDI
b410: 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  NG lock is imple
b420: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
b430: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
b440: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65  .  ** on the 'pe
b450: 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69  nding byte'. Thi
b460: 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e  s ensures that n
b470: 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63  o new SHARED loc
b480: 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f  ks can be.  ** o
b490: 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69  btained, but exi
b4a0: 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63  sting SHARED loc
b4b0: 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  ks are allowed t
b4c0: 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f  o persist. A pro
b4d0: 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e  cess.  ** does n
b4e0: 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69  ot have to obtai
b4f0: 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
b500: 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  k on the way to 
b510: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a  a PENDING lock..
b520: 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72    ** This proper
b530: 74 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68  ty is used by th
b540: 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20  e algorithm for 
b550: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
b560: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
b570: 20 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a   after a crash..
b580: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43    **.  ** An EXC
b590: 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74  LUSIVE lock, obt
b5a0: 61 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45  ained after a PE
b5b0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65  NDING lock is he
b5c0: 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c  ld, is.  ** impl
b5d0: 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69  emented by obtai
b5e0: 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ning a write-loc
b5f0: 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20  k on the entire 
b600: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
b610: 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20  * range'. Since 
b620: 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20  all other locks 
b630: 72 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c  require a read-l
b640: 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ock on one of th
b650: 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74  e bytes.  ** wit
b660: 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20  hin this range, 
b670: 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  this ensures tha
b680: 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73  t no other locks
b690: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65   are held on the
b6a0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
b6b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72  .  **.  ** The r
b6c0: 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62  eason a single b
b6d0: 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  yte cannot be us
b6e0: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ed instead of th
b6f0: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
b700: 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68   ** range' is th
b710: 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  at some versions
b720: 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e   of windows do n
b730: 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d  ot support read-
b740: 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c  locks. By.  ** l
b750: 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20  ocking a random 
b760: 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67  byte from a rang
b770: 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48  e, concurrent SH
b780: 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65  ARED locks may e
b790: 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69  xist.  ** even i
b7a0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72  f the locking pr
b7b0: 69 6d 69 74 69 76 65 20 75 73 65 64 20 69 73 20  imitive used is 
b7c0: 61 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c  always a write-l
b7d0: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ock..  */.  int 
b7e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b7f0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
b800: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
b810: 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
b820: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
b830: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 74  le->pInode;.  st
b840: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
b850: 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20  .  int tErrno = 
b860: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  0;..  assert( pF
b870: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
b880: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
b890: 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
b8a0: 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  id=%d (unix)\n",
b8b0: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
b8c0: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
b8d0: 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f  eLock), azFileLo
b8e0: 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ck(pFile->eFileL
b8f0: 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46 69  ock),.      azFi
b900: 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65  leLock(pInode->e
b910: 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64  FileLock), pInod
b920: 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74  e->nShared , get
b930: 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49  pid()));..  /* I
b940: 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
b950: 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
b960: 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
b970: 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
b980: 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
b990: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
b9a0: 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
b9b0: 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
b9c0: 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65  as.  ** unixEnte
b9d0: 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
b9e0: 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
b9f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
ba00: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46  e->eFileLock>=eF
ba10: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f  ileLock ){.    O
ba20: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
ba30: 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
ba40: 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c  dy held) (unix)\
ba50: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
ba60: 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
ba70: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29  Lock(eFileLock))
ba80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
ba90: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
baa0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
bab0: 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
bac0: 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20  e is correct..  
bad0: 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72  **  (1) We never
bae0: 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63   move from unloc
baf0: 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ked to anything 
bb00: 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72  higher than shar
bb10: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ed lock..  **  (
bb20: 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  2) SQLite never 
bb30: 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65  explicitly reque
bb40: 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63  sts a pendig loc
bb50: 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73  k..  **  (3) A s
bb60: 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c  hared lock is al
bb70: 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61  ways held when a
bb80: 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73   reserve lock is
bb90: 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
bba0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
bbb0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f  ->eFileLock!=NO_
bbc0: 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
bbd0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
bbe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
bbf0: 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
bc00: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
bc10: 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45   eFileLock!=RESE
bc20: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
bc30: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  le->eFileLock==S
bc40: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
bc50: 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
bc60: 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
bc70: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
bc80: 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
bc90: 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75  threads.  */.  u
bca0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
bcb0: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
bcc0: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a  e->pInode;..  /*
bcd0: 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
bce0: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
bcf0: 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
bd00: 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69  different unixFi
bd10: 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
bd20: 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
bd30: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
bd40: 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
bd50: 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
bd60: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49  e->eFileLock!=pI
bd70: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
bd80: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  && .          (p
bd90: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
bda0: 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
bdb0: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  | eFileLock>SHAR
bdc0: 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20  ED_LOCK)).  ){. 
bdd0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
bde0: 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  USY;.    goto en
bdf0: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
be00: 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
be10: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
be20: 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
be30: 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
be40: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
be50: 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
be60: 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
be70: 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
be80: 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
be90: 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
bea0: 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
beb0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
bec0: 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
bed0: 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
bee0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
bef0: 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46  CK || pInode->eF
bf00: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
bf10: 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61  D_LOCK) ){.    a
bf20: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
bf30: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
bf40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
bf50: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  le->eFileLock==0
bf60: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
bf70: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
bf80: 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 );.    pFile->
bf90: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
bfa0: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  ED_LOCK;.    pIn
bfb0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a  ode->nShared++;.
bfc0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
bfd0: 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  k++;.    goto en
bfe0: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20  d_lock;.  }...  
bff0: 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
c000: 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
c010: 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
c020: 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
c030: 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
c040: 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
c050: 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
c060: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
c070: 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
c080: 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
c090: 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c  .  */.  lock.l_l
c0a0: 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e  en = 1L;.  lock.
c0b0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
c0c0: 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65  SET;.  if( eFile
c0d0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
c0e0: 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69  K .      || (eFi
c0f0: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
c100: 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
c110: 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49  >eFileLock<PENDI
c120: 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
c130: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
c140: 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
c150: 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a  ED_LOCK?F_RDLCK:
c160: 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f  F_WRLCK);.    lo
c170: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
c180: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69  DING_BYTE;.    i
c190: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
c1a0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
c1b0: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
c1c0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
c1d0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
c1e0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
c1f0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
c200: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
c210: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
c220: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  Y ){.        pFi
c230: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
c240: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
c250: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
c260: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ock;.    }.  }..
c270: 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
c280: 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
c290: 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
c2a0: 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
c2b0: 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
c2c0: 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
c2d0: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
c2e0: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
c2f0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
c300: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
c310: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
c320: 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a  ->nShared==0 );.
c330: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
c340: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  de->eFileLock==0
c350: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c360: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
c370: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74  ..    /* Now get
c380: 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a   the read-lock *
c390: 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  /.    lock.l_sta
c3a0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
c3b0: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  T;.    lock.l_le
c3c0: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
c3d0: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
c3e0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
c3f0: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
c400: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
c410: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
c420: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
c430: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
c440: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
c450: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70    }..    /* Drop
c460: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50   the temporary P
c470: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20  ENDING lock */. 
c480: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
c490: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
c4a0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
c4b0: 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f   1L;.    lock.l_
c4c0: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
c4d0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
c4e0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
c4f0: 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  k) && rc==SQLITE
c500: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
c510: 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65  This could happe
c520: 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b  n with a network
c530: 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20   mount */.      
c540: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
c550: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
c560: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20  E_IOERR_UNLOCK; 
c570: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
c580: 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rc ){.      if( 
c590: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
c5a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
c5b0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
c5c0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
c5d0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
c5e0: 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
c5f0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
c600: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
c610: 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
c620: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
c630: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
c640: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
c650: 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
c660: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
c670: 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
c680: 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
c690: 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
c6a0: 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
c6b0: 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
c6c0: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
c6d0: 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
c6e0: 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
c6f0: 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
c700: 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
c710: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
c720: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
c730: 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
c740: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
c750: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
c760: 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
c770: 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
c780: 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
c790: 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
c7a0: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
c7b0: 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
c7c0: 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
c7d0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
c7e0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
c7f0: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20  e = F_WRLCK;..  
c800: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
c810: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
c820: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
c830: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
c840: 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65  );.    if( eFile
c850: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
c860: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63  OCK ){.      loc
c870: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
c880: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20  RVED_BYTE;.     
c890: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
c8a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c8b0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
c8c0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
c8d0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
c8e0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
c8f0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75      }..    if( u
c900: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
c910: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
c920: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
c930: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
c940: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
c950: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
c960: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
c970: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
c980: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
c990: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
c9a0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
c9b0: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
c9c0: 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 6e 64 65  }.  }.  ..#ifnde
c9d0: 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 53 65  f NDEBUG.  /* Se
c9e0: 74 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63  t up the transac
c9f0: 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61  tion-counter cha
ca00: 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61  nge checking fla
ca10: 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61  gs when.  ** tra
ca20: 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20  nsitioning from 
ca30: 61 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45  a SHARED to a RE
ca40: 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68  SERVED lock.  Th
ca50: 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72  e change.  ** fr
ca60: 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  om SHARED to RES
ca70: 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20  ERVED marks the 
ca80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e  beginning of a n
ca90: 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65  ormal.  ** write
caa0: 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20   operation (not 
cab0: 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f  a hot journal ro
cac0: 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20  llback)..  */.  
cad0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
cae0: 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65  K.   && pFile->e
caf0: 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
cb00: 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c  _LOCK.   && eFil
cb10: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
cb20: 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46  LOCK.  ){.    pF
cb30: 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
cb40: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  ng = 0;.    pFil
cb50: 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b  e->dbUpdate = 0;
cb60: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  .    pFile->inNo
cb70: 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20  rmalWrite = 1;. 
cb80: 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66   }.#endif...  if
cb90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
cba0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
cbb0: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
cbc0: 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  ock;.    pInode-
cbd0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
cbe0: 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20  leLock;.  }else 
cbf0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
cc00: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
cc10: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
cc20: 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
cc30: 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
cc40: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
cc50: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  NDING_LOCK;.  }.
cc60: 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  .end_lock:.  uni
cc70: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
cc80: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
cc90: 20 20 20 25 64 20 25 73 20 25 73 20 28 75 6e 69     %d %s %s (uni
cca0: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
ccb0: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
ccc0: 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72  eLock), .      r
ccd0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
cce0: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
ccf0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
cd00: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20  ../*.** Add the 
cd10: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
cd20: 75 73 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e  used by file han
cd30: 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65  dle pFile to the
cd40: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
cd50: 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a  * pUnused list..
cd60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
cd70: 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78  etPendingFd(unix
cd80: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
cd90: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
cda0: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
cdb0: 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75  Inode;.  UnixUnu
cdc0: 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65  sedFd *p = pFile
cdd0: 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e  ->pUnused;.  p->
cde0: 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  pNext = pInode->
cdf0: 70 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64  pUnused;.  pInod
ce00: 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a  e->pUnused = p;.
ce10: 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
ce20: 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  .  pFile->pUnuse
ce30: 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d = 0;.}../*.** 
ce40: 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
ce50: 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
ce60: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
ce70: 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
ce80: 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
ce90: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
cea0: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
ceb0: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
cec0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
ced0: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
cee0: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
cef0: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
cf00: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
cf10: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
cf20: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
cf30: 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  o-op..** .** If 
cf40: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20  handleNFSUnlock 
cf50: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e  is true, then on
cf60: 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20   downgrading an 
cf70: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74  EXCLUSIVE_LOCK t
cf80: 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20  o SHARED.** the 
cf90: 62 79 74 65 20 72 61 6e 67 65 20 69 73 20 64 69  byte range is di
cfa0: 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72  vided into 2 par
cfb0: 74 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  ts and the first
cfc0: 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65   part is unlocke
cfd0: 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f  d then.** set to
cfe0: 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68   a read lock, th
cff0: 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61 72  en the other par
d000: 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f  t is simply unlo
d010: 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b  cked.  This work
d020: 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62  s .** around a b
d030: 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f  ug in BSD NFS lo
d040: 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f  ckd (also seen o
d050: 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20  n MacOSX 10.3+) 
d060: 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a  that fails to .*
d070: 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69  * remove the wri
d080: 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67  te lock on a reg
d090: 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20  ion when a read 
d0a0: 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  lock is set..*/.
d0b0: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
d0c0: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
d0d0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
d0e0: 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64  leLock, int hand
d0f0: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20  leNFSUnlock){.  
d100: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
d110: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
d120: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
d130: 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75   *pInode;.  stru
d140: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
d150: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d160: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20  _OK;.  int h;.. 
d170: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
d180: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
d190: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
d1a0: 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64  %d(%d,%d) pid=%d
d1b0: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
d1c0: 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
d1d0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
d1e0: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
d1f0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d200: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
d210: 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20  ->nShared,.     
d220: 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
d230: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
d240: 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
d250: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
d260: 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
d270: 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
d280: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
d290: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
d2a0: 78 28 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65  x();.  h = pFile
d2b0: 2d 3e 68 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  ->h;.  pInode = 
d2c0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
d2d0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
d2e0: 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20  >nShared!=0 );. 
d2f0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
d300: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
d310: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
d320: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
d330: 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ck==pFile->eFile
d340: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75  Lock );.    Simu
d350: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
d360: 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  n(1);.    Simula
d370: 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
d380: 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  ) ).    Simulate
d390: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
d3a0: 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
d3b0: 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
d3c0: 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
d3d0: 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
d3e0: 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
d3f0: 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
d400: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
d410: 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
d420: 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
d430: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
d440: 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
d450: 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
d460: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
d470: 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
d480: 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
d490: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
d4a0: 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
d4b0: 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
d4c0: 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
d4d0: 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
d4e0: 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
d4f0: 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
d500: 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
d510: 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
d520: 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
d530: 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
d540: 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
d550: 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
d560: 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
d570: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
d580: 20 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 20 20     */.#if 0.    
d590: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69  assert( pFile->i
d5a0: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a  nNormalWrite==0.
d5b0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
d5c0: 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20  e->dbUpdate==0. 
d5d0: 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
d5e0: 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d  ->transCntrChng=
d5f0: 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =1 );.#endif.   
d600: 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
d610: 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
d620: 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72  f..    /* downgr
d630: 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65  ading to a share
d640: 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e  d lock on NFS in
d650: 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20  volves clearing 
d660: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20  the write lock. 
d670: 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74     ** before est
d680: 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65  ablishing the re
d690: 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69  adlock - to avoi
d6a0: 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  d a race conditi
d6b0: 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a  on we downgrade.
d6c0: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20      ** the lock 
d6d0: 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20  in 2 blocks, so 
d6e0: 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65  that part of the
d6f0: 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63   range will be c
d700: 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20  overed by a .   
d710: 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75   ** write lock u
d720: 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73  ntil the rest is
d730: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65   covered by a re
d740: 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20  ad lock:.    ** 
d750: 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20   1:   [WWWWW].  
d760: 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e    **  2:   [....
d770: 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20  W].    **  3:   
d780: 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20  [RRRRW].    **  
d790: 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20  4:   [RRRR.].   
d7a0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c   */.    if( eFil
d7b0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
d7c0: 43 4b 20 29 7b 0a 0a 23 69 66 20 21 64 65 66 69  CK ){..#if !defi
d7d0: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
d7e0: 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | !SQLITE_ENABLE
d7f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
d800: 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c       (void)handl
d810: 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20  eNFSUnlock;.    
d820: 20 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65    assert( handle
d830: 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a  NFSUnlock==0 );.
d840: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
d850: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
d860: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
d870: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
d880: 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53     if( handleNFS
d890: 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  Unlock ){.      
d8a0: 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20    int tErrno;   
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
d8c0: 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73  rror code from s
d8d0: 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72  ystem call error
d8e0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66  s */.        off
d8f0: 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41  _t divSize = SHA
d900: 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20  RED_SIZE - 1;.  
d910: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c        .        l
d920: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
d930: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
d940: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
d950: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
d960: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
d970: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
d980: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
d990: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
d9a0: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
d9b0: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
d9c0: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
d9d0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
d9e0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
d9f0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
da00: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
da10: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
da20: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
da30: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
da40: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
da50: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
da60: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
da70: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
da80: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
da90: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
daa0: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
dab0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
dac0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
dad0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
dae0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
daf0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
db00: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
db10: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
db20: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
db30: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
db40: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
db50: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
db60: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
db70: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
db80: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
db90: 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  RDLOCK);.       
dba0: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
dbb0: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
dbc0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
dbd0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
dbe0: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
dbf0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
dc00: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
dc10: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
dc20: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
dc30: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
dc40: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
dc50: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
dc60: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
dc70: 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65  ED_FIRST+divSize
dc80: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
dc90: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
dca0: 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ZE-divSize;.    
dcb0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
dcc0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
dcd0: 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)==(-1) ){.    
dce0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
dcf0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
dd00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
dd10: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
dd20: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
dd30: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
dd40: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
dd50: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
dd60: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
dd70: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
dd80: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
dd90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
dda0: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
ddb0: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
ddc0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
ddd0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
dde0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
ddf0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
de00: 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  RDLCK;.        l
de10: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
de20: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
de30: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
de40: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
de50: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
de60: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
de70: 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
de80: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
de90: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
dea0: 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79      /* In theory
deb0: 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e  , the call to un
dec0: 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e  ixFileLock() can
ded0: 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73 65  not fail because
dee0: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20 20   another.       
def0: 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69 73     ** process is
df00: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f   holding an inco
df10: 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49  mpatible lock. I
df20: 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73 20  f it does, this 
df30: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
df40: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
df50: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
df60: 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20  s not following 
df70: 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20  the locking.    
df80: 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f        ** protoco
df90: 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  l. If this happe
dfa0: 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ns, return SQLIT
dfb0: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20  E_IOERR_RDLOCK. 
dfc0: 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20  Returning.      
dfd0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55      ** SQLITE_BU
dfe0: 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65  SY would confuse
dff0: 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
e000: 20 28 69 6e 20 70 72 61 63 74 69 63 65 20 69 74   (in practice it
e010: 20 63 61 75 73 65 73 20 0a 20 20 20 20 20 20 20   causes .       
e020: 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74 20     ** an assert 
e030: 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20  to fail). */ .  
e040: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
e050: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
e060: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  ;.          pFil
e070: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
e080: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
e090: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
e0a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e0b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63   }.    }.    loc
e0c0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
e0d0: 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  CK;.    lock.l_w
e0e0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
e0f0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
e100: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
e110: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
e120: 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28  n = 2L;  assert(
e130: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d   PENDING_BYTE+1=
e140: 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29  =RESERVED_BYTE )
e150: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
e160: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
e170: 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
e180: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
e190: 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
e1a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e1b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
e1c0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
e1d0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
e1e0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e1f0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
e200: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
e210: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  if( eFileLock==N
e220: 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  O_LOCK ){.    /*
e230: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
e240: 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
e250: 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
e260: 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
e270: 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
e280: 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
e290: 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
e2a0: 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
e2b0: 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
e2c0: 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
e2d0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
e2e0: 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ed--;.    if( pI
e2f0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
e300: 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   ){.      lock.l
e310: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
e320: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
e330: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
e340: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
e350: 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  art = lock.l_len
e360: 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d   = 0L;.      Sim
e370: 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
e380: 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d  gn(1);.      Sim
e390: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
e3a0: 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d  (-1) ).      Sim
e3b0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
e3c0: 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
e3d0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
e3e0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29  ile, &lock)==0 )
e3f0: 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
e400: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
e410: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  _LOCK;.      }el
e420: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
e430: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
e440: 4c 4f 43 4b 3b 0a 09 70 46 69 6c 65 2d 3e 6c 61  LOCK;..pFile->la
e450: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
e460: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
e470: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
e480: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
e490: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
e4a0: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
e4b0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
e4c0: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f  Decrement the co
e4d0: 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61  unt of locks aga
e4e0: 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66  inst this same f
e4f0: 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20  ile.  When the. 
e500: 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63     ** count reac
e510: 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20  hes zero, close 
e520: 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64  any other file d
e530: 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65  escriptors whose
e540: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61   close.    ** wa
e550: 73 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75  s deferred becau
e560: 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  se of outstandin
e570: 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a  g locks..    */.
e580: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
e590: 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  k--;.    assert(
e5a0: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d   pInode->nLock>=
e5b0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
e5c0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  ode->nLock==0 ){
e5d0: 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64  .      closePend
e5e0: 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
e5f0: 20 20 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75     }.  }...end_u
e600: 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  nlock:.  unixLea
e610: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
e620: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e630: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e640: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
e650: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e660: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
e670: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
e680: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
e690: 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
e6a0: 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
e6b0: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
e6c0: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
e6d0: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
e6e0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
e6f0: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
e700: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
e710: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
e720: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
e730: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
e740: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
e750: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
e760: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c  atic int unixUnl
e770: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
e780: 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
e790: 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ock){.  return p
e7a0: 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
e7b0: 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a  FileLock, 0);.}.
e7c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
e7d0: 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68  tion performs th
e7e0: 65 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22  e parts of the "
e7f0: 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72  close file" oper
e800: 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e  ation .** common
e810: 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
e820: 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73  schemes. It clos
e830: 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  es the directory
e840: 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e   and file.** han
e850: 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72  dles, if they ar
e860: 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74  e valid, and set
e870: 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20  s all fields of 
e880: 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  the unixFile.** 
e890: 73 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a  structure to 0..
e8a0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74  **.** It is *not
e8b0: 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68  * necessary to h
e8c0: 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68  old the mutex wh
e8d0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
e8e0: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76  is called,.** ev
e8f0: 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20  en on VxWorks.  
e900: 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20  A mutex will be 
e910: 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f  acquired on VxWo
e920: 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78  rks by the.** vx
e930: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
e940: 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  Id() routine..*/
e950: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73  .static int clos
e960: 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65  eUnixFile(sqlite
e970: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
e980: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
e990: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
e9a0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
e9b0: 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62  fd>=0 ){.    rob
e9c0: 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
e9d0: 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 20 5f   pFile->dirfd, _
e9e0: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46  _LINE__);.    pF
e9f0: 69 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20  ile->dirfd=-1;. 
ea00: 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
ea10: 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75  h>=0 ){.    robu
ea20: 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
ea30: 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  pFile->h, __LINE
ea40: 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  __);.    pFile->
ea50: 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20  h = -1;.  }.#if 
ea60: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
ea70: 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20   pFile->pId ){. 
ea80: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73     if( pFile->is
ea90: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
eaa0: 75 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49  unlink(pFile->pI
eab0: 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
eac0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78  e);.    }.    vx
ead0: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
eae0: 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a  Id(pFile->pId);.
eaf0: 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d      pFile->pId =
eb00: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
eb10: 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
eb20: 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c     %-3d\n", pFil
eb30: 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f  e->h));.  OpenCo
eb40: 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c  unter(-1);.  sql
eb50: 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
eb60: 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d  >pUnused);.  mem
eb70: 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
eb80: 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
eb90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
eba0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
ebb0: 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
ebc0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c  tatic int unixCl
ebd0: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
ebe0: 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20   *id){.  int rc 
ebf0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
ec00: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
ec10: 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
ec20: 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64  .  unixUnlock(id
ec30: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e  , NO_LOCK);.  un
ec40: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
ec50: 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70  .  /* unixFile.p
ec60: 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20  Inode is always 
ec70: 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65  valid here. Othe
ec80: 72 77 69 73 65 2c 20 61 20 64 69 66 66 65 72 65  rwise, a differe
ec90: 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f  nt close.  ** ro
eca0: 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f  utine (e.g. nolo
ecb0: 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64  ckClose()) would
ecc0: 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65   be called inste
ecd0: 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ad..  */.  asser
ece0: 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  t( pFile->pInode
ecf0: 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69  ->nLock>0 || pFi
ed00: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  le->pInode->bPro
ed10: 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  cessLock==0 );. 
ed20: 20 69 66 28 20 41 4c 57 41 59 53 28 70 46 69 6c   if( ALWAYS(pFil
ed30: 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70 46  e->pInode) && pF
ed40: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
ed50: 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ck ){.    /* If 
ed60: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
ed70: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
ed80: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
ed90: 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
eda0: 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61  .    ** yet beca
edb0: 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
edc0: 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
edd0: 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
ede0: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
edf0: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49  descriptor to pI
ee00: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69  node->pUnused li
ee10: 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  st.  It will be 
ee20: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c  automatically cl
ee30: 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68 65  osed .    ** whe
ee40: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20  n the last lock 
ee50: 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  is cleared..    
ee60: 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e  */.    setPendin
ee70: 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a  gFd(pFile);.  }.
ee80: 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
ee90: 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63 20  fo(pFile);.  rc 
eea0: 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
eeb0: 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  id);.  unixLeave
eec0: 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
eed0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  n rc;.}../******
eee0: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
eef0: 74 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f  the posix adviso
ef00: 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  ry lock implemen
ef10: 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
ef20: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 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 2f 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
efd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efe0: 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c  ******** No-op L
eff0: 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
f000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
f020: 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  Of the various l
f030: 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
f040: 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65  ations available
f050: 2c 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72  , this is by far
f060: 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74   the.** simplest
f070: 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67  :  locking is ig
f080: 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d  nored.  No attem
f090: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f  pt is made to lo
f0a0: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ck the database.
f0b0: 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  ** file for read
f0c0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a  ing or writing..
f0d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69  **.** This locki
f0e0: 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f  ng mode is appro
f0f0: 70 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f  priate for use o
f100: 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  n read-only data
f110: 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61  bases.** (ex: da
f120: 74 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65  tabases that are
f130: 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d   burned into CD-
f140: 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ROM, for example
f150: 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c  .)  It can.** al
f160: 73 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68  so be used if th
f170: 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d  e application em
f180: 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72  ploys some exter
f190: 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f  nal mechanism to
f1a0: 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75  .** prevent simu
f1b0: 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20  ltaneous access 
f1c0: 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  of the same data
f1d0: 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d  base by two or m
f1e0: 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ore.** database 
f1f0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75  connections.  Bu
f200: 74 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72  t there is a ser
f210: 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74  ious risk of dat
f220: 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74  abase.** corrupt
f230: 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b  ion if this lock
f240: 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64  ing mode is used
f250: 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77   in situations w
f260: 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  here multiple.**
f270: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
f280: 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73  tions are access
f290: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
f2a0: 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
f2b0: 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61  e same.** time a
f2c0: 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  nd one or more o
f2d0: 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69  f those connecti
f2e0: 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e  ons are writing.
f2f0: 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
f300: 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  nolockCheckReser
f310: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
f320: 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
f330: 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
f340: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
f350: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52  (NotUsed);.  *pR
f360: 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74  esOut = 0;.  ret
f370: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f380: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
f390: 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
f3a0: 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
f3b0: 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55  t NotUsed2){.  U
f3c0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
f3d0: 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
f3e0: 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d2);.  return SQ
f3f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69  LITE_OK;.}.stati
f400: 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f  c int nolockUnlo
f410: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
f420: 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
f430: 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
f440: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
f450: 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
f460: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f470: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
f480: 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ose the file..*/
f490: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
f4a0: 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
f4b0: 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65  file *id) {.  re
f4c0: 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69  turn closeUnixFi
f4d0: 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  le(id);.}../****
f4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
f4f0: 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70  End of the no-op
f500: 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
f510: 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
f520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 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 2f 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 0a 2a 2a 2a 2a  ***********.****
f5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5e0: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d  ***** Begin dot-
f5f0: 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  file Locking ***
f600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
f620: 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f  * The dotfile lo
f630: 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
f640: 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78  tion uses the ex
f650: 69 73 74 61 6e 63 65 20 6f 66 20 73 65 70 61 72  istance of separ
f660: 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65  ate lock.** file
f670: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  s in order to co
f680: 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20  ntrol access to 
f690: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
f6a0: 68 69 73 20 77 6f 72 6b 73 20 6f 6e 20 6a 75 73  his works on jus
f6b0: 74 0a 2a 2a 20 61 62 6f 75 74 20 65 76 65 72 79  t.** about every
f6c0: 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67   filesystem imag
f6d0: 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65  inable.  But the
f6e0: 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64  re are serious d
f6f0: 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20  ownsides:.**.** 
f700: 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73     (1)  There is
f710: 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63   zero concurrenc
f720: 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61  y.  A single rea
f730: 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f  der blocks all o
f740: 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  ther.**         
f750: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  connections from
f760: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
f770: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
f780: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
f790: 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  An application c
f7a0: 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f  rash or power lo
f7b0: 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61  ss can leave sta
f7c0: 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a  le lock files.**
f7d0: 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67           sitting
f7e0: 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65   around that nee
f7f0: 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20  d to be cleared 
f800: 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  manually..**.** 
f810: 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20  Nevertheless, a 
f820: 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70  dotlock is an ap
f830: 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e  propriate lockin
f840: 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69  g mode for use i
f850: 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f  f no.** other lo
f860: 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69  cking strategy i
f870: 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  s available..**.
f880: 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  ** Dotfile locki
f890: 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61  ng works by crea
f8a0: 74 69 6e 67 20 61 20 66 69 6c 65 20 69 6e 20 74  ting a file in t
f8b0: 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
f8c0: 79 20 61 73 20 74 68 65 0a 2a 2a 20 64 61 74 61  y as the.** data
f8d0: 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68  base and with th
f8e0: 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20  e same name but 
f8f0: 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65  with a ".lock" e
f900: 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a  xtension added..
f910: 2a 2a 20 54 68 65 20 65 78 69 73 74 61 6e 63 65  ** The existance
f920: 20 6f 66 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20   of a lock file 
f930: 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55  implies an EXCLU
f940: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20  SIVE lock.  All 
f950: 6f 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79  other lock.** ty
f960: 70 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53  pes (SHARED, RES
f970: 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20  ERVED, PENDING) 
f980: 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  are mapped into 
f990: 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f  EXCLUSIVE..*/../
f9a0: 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75  *.** The file su
f9b0: 66 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68  ffix added to th
f9c0: 65 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65  e data base file
f9d0: 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  name in order to
f9e0: 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c   create the.** l
f9f0: 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65  ock file..*/.#de
fa00: 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46  fine DOTLOCK_SUF
fa10: 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a  FIX ".lock"../*.
fa20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
fa30: 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
fa40: 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
fa50: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
fa60: 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
fa70: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
fa80: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
fa90: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
faa0: 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
fab0: 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
fac0: 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
fad0: 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
fae0: 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
faf0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
fb00: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
fb10: 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
fb20: 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
fb30: 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
fb40: 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e  ecking..**.** In
fb50: 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
fb60: 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20  , either a lock 
fb70: 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65  exists or it doe
fb80: 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68  s not.  So in th
fb90: 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20  is.** variation 
fba0: 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64  of CheckReserved
fbb0: 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74  Lock(), *pResOut
fbc0: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
fbd0: 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69  if any lock.** i
fbe0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  s held on the fi
fbf0: 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  le and false if 
fc00: 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
fc10: 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cked..*/.static 
fc20: 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  int dotlockCheck
fc30: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
fc40: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
fc50: 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
fc60: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
fc70: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
fc80: 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
fc90: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
fca0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
fcb0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
fcc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
fcd0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
fce0: 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
fcf0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
fd00: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
fd10: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
fd20: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
fd30: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
fd40: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
fd50: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
fd60: 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
fd70: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
fd80: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   or some other c
fd90: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65  onnection in the
fda0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20   same process.  
fdb0: 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63    ** holds a loc
fdc0: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  k on the file.  
fdd0: 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  No need to check
fde0: 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20   further. */.   
fdf0: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
fe00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
fe10: 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  he lock is held 
fe20: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74  if and only if t
fe30: 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73  he lockfile exis
fe40: 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  ts */.    const 
fe50: 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
fe60: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  = (const char*)p
fe70: 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
fe80: 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76  text;.    reserv
fe90: 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c  ed = osAccess(zL
fea0: 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a  ockFile, 0)==0;.
feb0: 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
fec0: 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
fed0: 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  %d %d (dotlock)\
fee0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
fef0: 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
ff00: 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
ff10: 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
ff20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
ff30: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
ff40: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
ff50: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
ff60: 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
ff70: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
ff80: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
ff90: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
ffa0: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
ffb0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
ffc0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
ffd0: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
ffe0: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
fff0: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
10000 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
10010 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
10020 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
10030 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
10040 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
10050 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
10060 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
10070 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
10080 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
10090 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
100a0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
100b0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
100c0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
100d0 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
100e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
100f0 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
10100 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
10110 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
10120 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
10130 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
10140 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
10150 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
10160 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
10170 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
10180 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
10190 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
101a0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
101b0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
101c0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
101d0 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
101e0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
101f0 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
10200 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
10210 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
10220 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
10230 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
10240 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  evel..**.** With
10250 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
10260 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  , we really only
10270 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28   support state (
10280 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  4): EXCLUSIVE..*
10290 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74  * But we track t
102a0 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  he other locking
102b0 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c   levels internal
102c0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
102d0 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
102e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
102f0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
10300 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
10310 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
10320 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20  id;.  int fd;.  
10330 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
10340 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
10350 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
10360 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10370 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66  TE_OK;...  /* If
10380 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63   we have any loc
10390 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  k, then the lock
103a0 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78   file already ex
103b0 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61  ists.  All we ha
103c0 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
103d0 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65   adjust our inte
103e0 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
103f0 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20  he lock level.. 
10400 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
10410 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
10420 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
10430 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
10440 46 69 6c 65 4c 6f 63 6b 3b 0a 23 69 66 20 21 4f  FileLock;.#if !O
10450 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 2f 2a  S_VXWORKS.    /*
10460 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74   Always update t
10470 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20  he timestamp on 
10480 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a  the old file */.
10490 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b      utimes(zLock
104a0 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e  File, NULL);.#en
104b0 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
104c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
104d0 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
104e0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
104f0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
10500 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52  en(zLockFile,O_R
10510 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f  DONLY|O_CREAT|O_
10520 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66  EXCL,0600);.  if
10530 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  ( fd<0 ){.    /*
10540 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f   failed to open/
10550 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c  create the file,
10560 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61   someone else ma
10570 79 20 68 61 76 65 20 73 74 6f 6c 65 6e 20 74 68  y have stolen th
10580 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e  e lock */.    in
10590 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
105a0 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54  ;.    if( EEXIST
105b0 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20   == tErrno ){.  
105c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
105d0 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65  BUSY;.    } else
105e0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
105f0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
10600 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
10610 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
10620 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53  K);.      if( IS
10630 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
10640 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
10650 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
10660 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
10670 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
10680 63 3b 0a 20 20 7d 20 0a 20 20 72 6f 62 75 73 74  c;.  } .  robust
10690 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64  _close(pFile, fd
106a0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 0a  , __LINE__);.  .
106b0 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
106c0 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
106d0 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
106e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
106f0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
10700 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10710 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
10720 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
10730 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
10740 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
10750 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
10760 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
10770 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
10780 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
10790 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
107a0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
107b0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
107c0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
107d0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
107e0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
107f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
10800 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  no-op..**.** Whe
10810 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  n the locking le
10820 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c  vel reaches NO_L
10830 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20  OCK, delete the 
10840 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  lock file..*/.st
10850 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
10860 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
10870 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
10880 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
10890 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
108a0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
108b0 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
108c0 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
108d0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
108e0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
108f0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
10900 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
10910 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74  s %d pid=%d (dot
10920 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
10930 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09  >h, eFileLock,..
10940 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
10950 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ock, getpid()));
10960 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
10970 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
10980 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
10990 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
109a0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
109b0 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
109c0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
109d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
109e0 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72  ..  /* To downgr
109f0 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73  ade to shared, s
10a00 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72  imply update our
10a10 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e   internal notion
10a20 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63   of the.  ** loc
10a30 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65  k state.  No nee
10a40 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74  d to mess with t
10a50 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
10a60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
10a70 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
10a80 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
10a90 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
10aa0 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65  RED_LOCK;.    re
10ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10ac0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66    }.  .  /* To f
10ad0 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20  ully unlock the 
10ae0 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65  database, delete
10af0 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a   the lock file *
10b00 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  /.  assert( eFil
10b10 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock==NO_LOCK )
10b20 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b 28 7a  ;.  if( unlink(z
10b30 4c 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20 20 20  LockFile) ){.   
10b40 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 20   int rc = 0;.   
10b50 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
10b60 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f  rno;.    if( ENO
10b70 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  ENT != tErrno ){
10b80 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
10b90 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
10ba0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
10bb0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
10bc0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
10bd0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
10be0 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rno;.    }.    r
10bf0 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20  eturn rc; .  }. 
10c00 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
10c10 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  k = NO_LOCK;.  r
10c20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
10c40 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75  a file.  Make su
10c50 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  re the lock has 
10c60 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65  been released be
10c70 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f  fore closing..*/
10c80 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
10c90 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
10ca0 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
10cb0 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20  nt rc;.  if( id 
10cc0 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
10cd0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
10ce0 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c  le*)id;.    dotl
10cf0 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
10d00 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69  _LOCK);.    sqli
10d10 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
10d20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
10d30 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73  .  }.  rc = clos
10d40 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
10d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a   return rc;.}./*
10d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d70 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74  * End of the dot
10d80 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  -file lock imple
10d90 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
10da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 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 2f 0a 0a 2f  ************/../
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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 0a 2a  **************.*
10e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
10e70 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a  flock Locking **
10e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10ea0 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f  *.** Use the flo
10eb0 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  ck() system call
10ec0 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b   to do file lock
10ed0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  ing..**.** flock
10ee0 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  () locking is li
10ef0 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  ke dot-file lock
10f00 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20  ing in that the 
10f10 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d  various.** fine-
10f20 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65  grain locking le
10f30 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62  vels supported b
10f40 79 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c  y SQLite are col
10f50 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61  lapsed into.** a
10f60 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76   single exclusiv
10f70 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65  e lock.  In othe
10f80 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c  r words, SHARED,
10f90 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a   RESERVED, and.*
10fa0 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20  * PENDING locks 
10fb0 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69  are the same thi
10fc0 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49  ng as an EXCLUSI
10fd0 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65  VE lock.  SQLite
10fe0 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20  .** still works 
10ff0 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73  when you do this
11000 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63  , but concurrenc
11010 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e  y is reduced sin
11020 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  ce.** only a sin
11030 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
11040 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  be reading the d
11050 61 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d  atabase at a tim
11060 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68  e..**.** Omit th
11070 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51  is section 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 69 73 20 74 75 72  ING_STYLE is tur
110a0 6e 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a  ned off or if.**
110b0 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56   compiling for V
110c0 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53  XWORKS..*/.#if S
110d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
110e0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
110f0 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
11100 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63   Retry flock() c
11110 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77  alls that fail w
11120 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66  ith EINTR.*/.#if
11130 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63  def EINTR.static
11140 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63   int robust_floc
11150 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70  k(int fd, int op
11160 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  ){.  int rc;.  d
11170 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64  o{ rc = flock(fd
11180 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  ,op); }while( rc
11190 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
111a0 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  TR );.  return r
111b0 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  c;.}.#else.# def
111c0 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  ine robust_flock
111d0 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29  (a,b) flock(a,b)
111e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f  .#endif.     ../
111f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11200 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
11210 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
11220 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
11230 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
11240 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
11250 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
11260 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
11270 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
11280 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
11290 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
112a0 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
112b0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
112c0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
112d0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
112e0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
112f0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
11300 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
11310 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
11320 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65  tic int flockChe
11330 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
11340 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
11350 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
11360 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11370 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
11380 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
11390 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
113a0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
113b0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
113c0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
113d0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
113e0 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
113f0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
11400 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  );.  .  /* Check
11410 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
11420 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
11430 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
11440 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
11450 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
11460 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
11470 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
11480 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
11490 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
114a0 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
114b0 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
114c0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
114d0 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20   attempt to get 
114e0 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  the lock */.    
114f0 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74  int lrc = robust
11500 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
11510 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
11520 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72  NB);.    if( !lr
11530 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f  c ){.      /* go
11540 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  t the lock, unlo
11550 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c  ck it */.      l
11560 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63  rc = robust_floc
11570 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
11580 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28  _UN);.      if (
11590 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20   lrc ) {.       
115a0 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
115b0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  rno;.        /* 
115c0 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69  unlock failed wi
115d0 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  th an error */. 
115e0 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c         lrc = SQL
115f0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
11600 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  ; .        if( I
11610 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
11620 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
11630 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
11640 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
11650 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
11660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11670 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
11680 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
11690 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73  errno;.      res
116a0 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
116b0 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
116c0 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72   might have it r
116d0 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20  eserved */.     
116e0 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72   lrc = sqliteErr
116f0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
11700 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
11710 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20  IOERR_LOCK); .  
11720 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
11730 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
11740 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
11750 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
11760 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72  .        rc = lr
11770 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
11780 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
11790 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
117a0 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e   %d %d (flock)\n
117b0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
117c0 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69   reserved));..#i
117d0 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
117e0 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
117f0 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
11800 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
11810 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
11820 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
11830 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76  E_OK;.    reserv
11840 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ed=1;.  }.#endif
11850 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
11860 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
11870 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75  ORS */.  *pResOu
11880 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
11890 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
118a0 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
118b0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
118c0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
118d0 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
118e0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
118f0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
11900 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
11910 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
11920 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
11930 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
11940 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
11950 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
11960 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
11970 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
11980 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
11990 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
119a0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
119b0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
119c0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
119d0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
119e0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
119f0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
11a00 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
11a10 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
11a20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
11a30 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
11a40 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
11a50 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
11a60 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
11a70 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
11a80 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
11a90 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
11aa0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
11ab0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
11ac0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
11ad0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
11ae0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
11af0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
11b00 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
11b10 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
11b20 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
11b30 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
11b40 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
11b50 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f  .**.** flock() o
11b60 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
11b70 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
11b80 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
11b90 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
11ba0 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
11bb0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
11bc0 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
11bd0 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
11be0 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
11bf0 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
11c00 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
11c10 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
11c20 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
11c30 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
11c40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11c50 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
11c60 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
11c70 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
11c80 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
11c90 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
11ca0 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
11cb0 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c  tatic int flockL
11cc0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
11cd0 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
11ce0 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  ock) {.  int rc 
11cf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
11d00 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11d10 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
11d20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
11d30 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20   );..  /* if we 
11d40 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
11d50 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
11d60 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
11d70 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
11d80 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
11d90 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
11da0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11db0 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20   > NO_LOCK) {.  
11dc0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
11dd0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
11de0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11df0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
11e00 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
11e10 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20  ive lock */.  . 
11e20 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63   if (robust_floc
11e30 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
11e40 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20  _EX | LOCK_NB)) 
11e50 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  {.    int tErrno
11e60 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a   = errno;.    /*
11e70 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73   didn't get, mus
11e80 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20  t be busy */.   
11e90 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
11ea0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
11eb0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
11ec0 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
11ed0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
11ee0 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
11ef0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
11f00 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
11f10 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f    } else {.    /
11f20 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
11f30 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
11f40 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c  n ok */.    pFil
11f50 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
11f60 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  FileLock;.  }.  
11f70 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
11f80 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63    %d %s %s (floc
11f90 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
11fa0 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
11fb0 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20  eLock), .       
11fc0 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
11fd0 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
11fe0 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51  ed"));.#ifdef SQ
11ff0 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
12000 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
12010 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45  if( (rc & SQLITE
12020 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
12030 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
12040 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
12050 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
12060 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
12070 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
12080 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
12090 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  .../*.** Lower t
120a0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
120b0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
120c0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
120d0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
120e0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
120f0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
12100 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
12110 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
12120 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
12130 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
12140 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
12150 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
12160 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
12170 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
12180 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
12190 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
121a0 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
121b0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
121c0 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
121d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
121e0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
121f0 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
12200 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
12210 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
12220 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c  as %d pid=%d (fl
12230 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
12240 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
12250 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
12260 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69  eFileLock, getpi
12270 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  d()));.  assert(
12280 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
12290 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
122a0 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
122b0 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
122c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
122d0 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
122e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
122f0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
12300 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
12310 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
12320 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
12330 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
12340 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f (eFileLock==SH
12350 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
12360 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12370 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
12380 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12390 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
123a0 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c   no, really, unl
123b0 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f  ock. */.  if( ro
123c0 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
123d0 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b  ->h, LOCK_UN) ){
123e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
123f0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
12400 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75  _ERRORS.    retu
12410 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
12420 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
12430 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
12440 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72  _ERRORS */.    r
12450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
12460 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c  RR_UNLOCK;.  }el
12470 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  se{.    pFile->e
12480 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
12490 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
124a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
124b0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
124c0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
124d0 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  nt flockClose(sq
124e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
124f0 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
12500 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64    flockUnlock(id
12510 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a  , NO_LOCK);.  }.
12520 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e    return closeUn
12530 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23  ixFile(id);.}..#
12540 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12550 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
12560 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
12570 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  RK */../********
12580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
12590 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63  of the flock loc
125a0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
125b0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
125c0 2a 2a 2a 2a 2a 2a 0a 2a 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 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
12620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12660 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
12670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12680 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d   Begin Named Sem
12690 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a  aphore Locking *
126a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126b0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61  *******.**.** Na
126c0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
126d0 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75  cking is only su
126e0 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72  pported on VxWor
126f0 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68  ks..**.** Semaph
12700 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  ore locking is l
12710 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64  ike dot-lock and
12720 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69   flock in that i
12730 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a  t really only.**
12740 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53   supports EXCLUS
12750 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e  IVE locking.  On
12760 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  ly a single proc
12770 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20  ess can read or 
12780 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74  write.** the dat
12790 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20  abase file at a 
127a0 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75  time.  This redu
127b0 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f  ces potential co
127c0 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a  ncurrency, but.*
127d0 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b  * makes the lock
127e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
127f0 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a  much easier..*/.
12800 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a  #if OS_VXWORKS..
12810 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
12820 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
12830 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
12840 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
12850 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
12860 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
12870 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
12880 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
12890 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
128a0 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
128b0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
128c0 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
128d0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
128e0 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
128f0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
12900 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
12910 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
12920 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
12930 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
12940 61 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65 63  atic int semChec
12950 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
12960 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12970 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
12980 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12990 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
129a0 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
129b0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
129c0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
129d0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
129e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
129f0 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
12a00 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
12a10 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
12a20 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
12a30 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
12a40 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
12a50 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
12a60 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
12a70 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
12a80 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
12a90 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
12aa0 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
12ab0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
12ac0 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
12ad0 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
12ae0 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20  ed ){.    sem_t 
12af0 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
12b00 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 20  Inode->pSem;.   
12b10 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
12b20 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20 73  tBuf;..    if( s
12b30 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29  em_trywait(pSem)
12b40 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  ==-1 ){.      in
12b50 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
12b60 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41  ;.      if( EAGA
12b70 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  IN != tErrno ){.
12b80 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12b90 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
12ba0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
12bb0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
12bc0 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a  KRESERVEDLOCK);.
12bd0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
12be0 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
12bf0 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  o;.      } else 
12c00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d  {.        /* som
12c10 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68  eone else has th
12c20 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20 61  e lock when we a
12c30 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f  re in NO_LOCK */
12c40 0a 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65  .        reserve
12c50 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c  d = (pFile->eFil
12c60 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c  eLock < SHARED_L
12c70 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
12c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
12c90 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20  * we could have 
12ca0 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69 74  it if we want it
12cb0 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f   */.      sem_po
12cc0 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a  st(pSem);.    }.
12cd0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
12ce0 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
12cf0 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20  %d %d (sem)\n", 
12d00 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
12d10 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52  served));..  *pR
12d20 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
12d30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12d40 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
12d50 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
12d60 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
12d70 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
12d80 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
12d90 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
12da0 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
12db0 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
12dc0 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
12dd0 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
12de0 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
12df0 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
12e00 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
12e10 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
12e20 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
12e30 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
12e40 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
12e50 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
12e60 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
12e70 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
12e80 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
12e90 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
12ea0 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
12eb0 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
12ec0 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
12ed0 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
12ee0 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
12ef0 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
12f00 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
12f10 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
12f20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
12f30 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
12f40 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
12f50 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
12f60 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
12f70 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
12f80 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
12f90 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
12fa0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
12fb0 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
12fc0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
12fd0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
12fe0 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
12ff0 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70  SIVE.**.** Semap
13000 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20  hore locks only 
13010 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45  really support E
13020 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20  XCLUSIVE locks. 
13030 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d   We track interm
13040 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73  ediate.** lock s
13050 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c  tates in the sql
13060 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74  ite3_file struct
13070 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63  ure, but all loc
13080 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20  ks SHARED or.** 
13090 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79  above are really
130a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
130b0 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c   and exclude all
130c0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
130d0 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20   from.** access 
130e0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
130f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
13100 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
13110 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
13120 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
13130 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
13140 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
13150 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
13160 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71  c int semLock(sq
13170 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
13180 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
13190 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
131a0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
131b0 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20  id;.  int fd;.  
131c0 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
131d0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
131e0 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  m;.  int rc = SQ
131f0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69  LITE_OK;..  /* i
13200 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
13210 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
13220 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a  exclusive.  .  *
13230 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  * Just adjust le
13240 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
13250 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20  outta here. */. 
13260 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c   if (pFile->eFil
13270 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29  eLock > NO_LOCK)
13280 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
13290 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
132a0 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ock;.    rc = SQ
132b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74  LITE_OK;.    got
132c0 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
132d0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b    }.  .  /* lock
132e0 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62   semaphore now b
132f0 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e  ut bail out when
13300 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e   already locked.
13310 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72   */.  if( sem_tr
13320 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20  ywait(pSem)==-1 
13330 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
13340 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
13350 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
13360 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74    }..  /* got it
13370 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
13380 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
13390 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
133a0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
133b0 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a  . sem_end_lock:.
133c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
133d0 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
133e0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
133f0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
13400 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
13410 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
13420 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
13430 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
13440 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
13450 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
13460 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
13470 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
13480 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
13490 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
134a0 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
134b0 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
134c0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
134d0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c  tatic int semUnl
134e0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
134f0 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
13500 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
13510 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
13520 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f  File*)id;.  sem_
13530 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
13540 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a  >pInode->pSem;..
13550 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
13560 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  );.  assert( pSe
13570 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  m );.  OSTRACE((
13580 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
13590 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65  as %d pid=%d (se
135a0 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
135b0 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20   eFileLock,..   
135c0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
135d0 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
135e0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
135f0 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
13600 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
13610 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
13620 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
13630 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
13640 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
13650 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
13660 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e  .  /* shared can
13670 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
13680 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
13690 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
136a0 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c   */.  if (eFileL
136b0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
136c0 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
136d0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
136e0 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e  Lock;.    return
136f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13700 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
13710 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ly unlock. */.  
13720 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53  if ( sem_post(pS
13730 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  em)==-1 ) {.    
13740 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d  int rc, tErrno =
13750 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d   errno;.    rc =
13760 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
13770 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
13780 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
13790 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  UNLOCK);.    if(
137a0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
137b0 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
137c0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
137d0 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
137e0 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d   return rc; .  }
137f0 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
13800 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
13810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13820 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f  K;.}../*. ** Clo
13830 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73  se a file.. */.s
13840 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f  tatic int semClo
13850 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
13860 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
13870 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
13880 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13890 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55  le*)id;.    semU
138a0 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
138b0 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  K);.    assert( 
138c0 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69  pFile );.    uni
138d0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
138e0 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49     releaseInodeI
138f0 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nfo(pFile);.    
13900 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
13910 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46  ;.    closeUnixF
13920 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72  ile(id);.  }.  r
13930 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13940 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53  .}..#endif /* OS
13950 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a  _VXWORKS */./*.*
13960 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
13970 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  e locking is onl
13980 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56  y available on V
13990 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  xWorks..**.*****
139a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
139b0 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61  f the named sema
139c0 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  phore lock imple
139d0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
139e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 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 2f 0a 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 0a 2a 2a 2a  ************.***
13a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13aa0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41  ******** Begin A
13ab0 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  FP Locking *****
13ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
13ae0 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20 41 70  ** AFP is the Ap
13af0 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f  ple Filing Proto
13b00 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e  col.  AFP is a n
13b10 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65  etwork filesyste
13b20 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70  m found.** on Ap
13b30 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f  ple Macintosh co
13b40 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f  mputers - both O
13b50 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a  S9 and OSX..**.*
13b60 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d  * Third-party im
13b70 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66  plementations of
13b80 20 41 46 50 20 61 72 65 20 61 76 61 69 6c 61 62   AFP are availab
13b90 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f  le.  But this co
13ba0 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20  de here.** only 
13bb0 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f  works on OSX..*/
13bc0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
13bd0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
13be0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
13bf0 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68  G_STYLE./*.** Th
13c00 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
13c10 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f  ext structure co
13c20 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c  ntains all afp l
13c30 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73 74 61  ock specific sta
13c40 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  te.*/.typedef st
13c50 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ruct afpLockingC
13c60 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e  ontext afpLockin
13c70 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  gContext;.struct
13c80 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13c90 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72  xt {.  int reser
13ca0 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ved;.  const cha
13cb0 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20  r *dbPath;      
13cc0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
13cd0 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
13ce0 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79  */.};..struct By
13cf0 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b  teRangeLockPB2.{
13d00 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
13d10 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20   long offset;   
13d20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74       /* offset t
13d30 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20  o first byte to 
13d40 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
13d50 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e  ed long long len
13d60 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e  gth;        /* n
13d70 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  br of bytes to l
13d80 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
13d90 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52  d long long retR
13da0 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62  angeStart; /* nb
13db0 72 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f  r of 1st byte lo
13dc0 63 6b 65 64 20 69 66 20 73 75 63 63 65 73 73 66  cked if successf
13dd0 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ul */.  unsigned
13de0 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67   char unLockFlag
13df0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d  ;         /* 1 =
13e00 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63   unlock, 0 = loc
13e10 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
13e20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61  char startEndFla
13e30 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65  g;       /* 1=re
13e40 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b  l to end of fork
13e50 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74  , 0=rel to start
13e60 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20   */.  int fd;   
13e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e80 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20          /* file 
13e90 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68  desc to assoc th
13ea0 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a  is lock with */.
13eb0 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66  };..#define afpf
13ec0 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46  sByteRangeLock2F
13ed0 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57  SCTL        _IOW
13ee0 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63  R('z', 23, struc
13ef0 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
13f00 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  B2)../*.** This 
13f10 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72  is a utility for
13f20 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61   setting or clea
13f30 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65  ring a bit-range
13f40 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41   lock on an.** A
13f50 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a  FP filesystem..*
13f60 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  * .** Return SQL
13f70 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
13f80 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f  s, SQLITE_BUSY o
13f90 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
13fa0 61 74 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c  atic int afpSetL
13fb0 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ock(.  const cha
13fc0 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20  r *path,        
13fd0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
13fe0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
13ff0 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b  locked or unlock
14000 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ed */.  unixFile
14010 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
14020 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
14030 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
14040 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69  n path */.  unsi
14050 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f  gned long long o
14060 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69  ffset,     /* Fi
14070 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c  rst byte to be l
14080 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  ocked */.  unsig
14090 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65  ned long long le
140a0 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d  ngth,     /* Num
140b0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
140c0 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65  lock */.  int se
140d0 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20  tLockFlag       
140e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
140f0 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46   to set lock.  F
14100 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f  alse to clear lo
14110 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ck */.){.  struc
14120 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
14130 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72  B2 pb;.  int err
14140 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b  ;.  .  pb.unLock
14150 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c  Flag = setLockFl
14160 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62  ag ? 0 : 1;.  pb
14170 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20  .startEndFlag = 
14180 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d  0;.  pb.offset =
14190 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65   offset;.  pb.le
141a0 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a  ngth = length; .
141b0 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d    pb.fd = pFile-
141c0 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45  >h;.  .  OSTRACE
141d0 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25  (("AFPSETLOCK [%
141e0 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72  s] for %d%s in r
141f0 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e  ange %llx:%llx\n
14200 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b  ", .    (setLock
14210 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29  Flag?"ON":"OFF")
14220 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e  , pFile->h, (pb.
14230 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c  fd==-1?"[testval
14240 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66  -1]":""),.    of
14250 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a  fset, length));.
14260 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61    err = fsctl(pa
14270 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e  th, afpfsByteRan
14280 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70  geLock2FSCTL, &p
14290 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72  b, 0);.  if ( er
142a0 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e  r==-1 ) {.    in
142b0 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45  t rc;.    int tE
142c0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
142d0 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53    OSTRACE(("AFPS
142e0 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f  ETLOCK failed to
142f0 20 66 73 63 74 6c 28 29 20 27 25 73 27 20 25 64   fsctl() '%s' %d
14300 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
14310 20 20 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e       path, tErrn
14320 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72 72  o, strerror(tErr
14330 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51  no)));.#ifdef SQ
14340 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f  LITE_IGNORE_AFP_
14350 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20  LOCK_ERRORS.    
14360 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
14370 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d  ;.#else.    rc =
14380 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
14390 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
143a0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
143b0 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c         setLockFl
143c0 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52  ag ? SQLITE_IOER
143d0 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f  R_LOCK : SQLITE_
143e0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23  IOERR_UNLOCK);.#
143f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
14400 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
14410 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66  ERRORS */.    if
14420 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
14430 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
14440 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
14450 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
14460 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
14470 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
14480 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14490 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
144a0 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
144b0 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
144c0 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
144d0 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
144e0 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
144f0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
14500 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
14510 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
14520 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
14530 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
14540 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
14550 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
14560 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
14570 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
14580 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
14590 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
145a0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
145b0 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
145c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
145d0 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
145e0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
145f0 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
14600 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
14610 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
14620 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
14630 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
14640 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
14650 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
14660 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
14670 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
14680 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
14690 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
146a0 69 6c 65 20 29 3b 0a 20 20 61 66 70 4c 6f 63 6b  ile );.  afpLock
146b0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
146c0 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
146d0 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
146e0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
146f0 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65 78 74  t;.  if( context
14700 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20  ->reserved ){.  
14710 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a    *pResOut = 1;.
14720 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14730 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  E_OK;.  }.  unix
14740 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a  EnterMutex(); /*
14750 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   Because pFile->
14760 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
14770 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20   across threads 
14780 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  */.  .  /* Check
14790 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
147a0 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
147b0 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
147c0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
147d0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
147e0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
147f0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
14800 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
14810 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
14820 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
14830 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a  s holds it..   *
14840 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
14850 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b  d ){.    /* lock
14860 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79   the RESERVED by
14870 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  te */.    int lr
14880 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
14890 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
148a0 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
148b0 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20  BYTE, 1,1);  .  
148c0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
148d0 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  =lrc ){.      /*
148e0 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64   if we succeeded
148f0 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72   in taking the r
14900 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e  eserved lock, un
14910 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f  lock it to resto
14920 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  re.      ** the 
14930 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a  original state *
14940 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66  /.      lrc = af
14950 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
14960 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
14970 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
14980 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73  1, 0);.    } els
14990 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  e {.      /* if 
149a0 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  we failed to get
149b0 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73   the lock then s
149c0 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74  omeone else must
149d0 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20   have it */.    
149e0 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
149f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
14a00 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
14a10 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63   ){.      rc=lrc
14a20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
14a30 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
14a40 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
14a50 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
14a60 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d %d (afp)\n", p
14a70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
14a80 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70  erved));.  .  *p
14a90 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
14aa0 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
14ab0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
14ac0 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
14ad0 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
14ae0 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
14af0 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
14b00 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
14b10 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
14b20 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
14b30 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
14b40 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
14b50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
14b60 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
14b70 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
14b80 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
14b90 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
14ba0 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
14bb0 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
14bc0 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
14bd0 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
14be0 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
14bf0 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
14c00 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
14c10 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
14c20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
14c30 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
14c40 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
14c50 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
14c60 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
14c70 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
14c80 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
14c90 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
14ca0 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
14cb0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
14cc0 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
14cd0 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
14ce0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
14cf0 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
14d00 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
14d10 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
14d20 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
14d30 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
14d40 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
14d50 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
14d60 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
14d70 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
14d80 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
14d90 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
14da0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
14db0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
14dc0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
14dd0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
14de0 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65  t afpLock(sqlite
14df0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14e00 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  eFileLock){.  in
14e10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14e20 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
14e30 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
14e40 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
14e50 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
14e60 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
14e70 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
14e80 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
14e90 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
14ea0 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
14eb0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61  gContext;.  .  a
14ec0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
14ed0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
14ee0 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73      %d %s was %s
14ef0 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%s,%d) pid=%d (
14f00 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
14f10 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  h,.           az
14f20 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
14f30 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ck), azFileLock(
14f40 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14f50 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  ),.           az
14f60 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d  FileLock(pInode-
14f70 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e  >eFileLock), pIn
14f80 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67  ode->nShared , g
14f90 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a  etpid()));..  /*
14fa0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
14fb0 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
14fc0 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
14fd0 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
14fe0 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
14ff0 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
15000 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70  on't use the afp
15010 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20  _end_lock: exit 
15020 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
15030 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
15040 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
15050 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
15060 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
15070 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck>=eFileLock ){
15080 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
15090 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20  OCK    %d %s ok 
150a0 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28  (already held) (
150b0 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
150c0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  h,.           az
150d0 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
150e0 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ck)));.    retur
150f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15100 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
15110 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
15120 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
15130 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65  .  **  (1) We ne
15140 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e  ver move from un
15150 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69  locked to anythi
15160 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73  ng higher than s
15170 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  hared lock..  **
15180 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76    (2) SQLite nev
15190 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65  er explicitly re
151a0 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20  quests a pendig 
151b0 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20  lock..  **  (3) 
151c0 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  A shared lock is
151d0 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65   always held whe
151e0 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b  n a reserve lock
151f0 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
15200 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
15210 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
15220 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NO_LOCK || eFile
15230 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
15240 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
15250 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  FileLock!=PENDIN
15260 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
15270 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52  rt( eFileLock!=R
15280 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
15290 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
152a0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
152b0 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75  .  .  /* This mu
152c0 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65  tex is needed be
152d0 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
152e0 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
152f0 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
15300 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
15310 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
15320 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
15330 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68  .  /* If some th
15340 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
15350 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76  PID has a lock v
15360 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75  ia a different u
15370 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61  nixFile*.  ** ha
15380 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75  ndle that preclu
15390 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65  des the requeste
153a0 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42  d lock, return B
153b0 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  USY..  */.  if( 
153c0 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
153d0 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  k!=pInode->eFile
153e0 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20  Lock && .       
153f0 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
15400 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
15410 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
15420 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20  ARED_LOCK)).    
15430 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
15440 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
15450 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
15460 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
15470 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  a SHARED lock is
15480 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20   requested, and 
15490 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
154a0 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61  g this PID alrea
154b0 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48  dy.  ** has a SH
154c0 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44  ARED or RESERVED
154d0 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72   lock, then incr
154e0 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20  ement reference 
154f0 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20  counts and.  ** 
15500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15510 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
15520 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
15530 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49  OCK && .     (pI
15540 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
15550 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
15560 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
15570 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
15580 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
15590 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
155a0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
155b0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
155c0 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
155d0 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
155e0 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20  ->nShared>0 );. 
155f0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
15600 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
15610 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  K;.    pInode->n
15620 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49  Shared++;.    pI
15630 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
15640 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
15650 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20  lock;.  }.    . 
15660 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f   /* A PENDING lo
15670 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66  ck is needed bef
15680 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  ore acquiring a 
15690 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SHARED lock and 
156a0 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75  before.  ** acqu
156b0 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  iring an EXCLUSI
156c0 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68  VE lock.  For th
156d0 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
156e0 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a  he PENDING will.
156f0 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64    ** be released
15700 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
15710 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
15720 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
15730 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
15740 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
15750 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
15760 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
15770 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a      int failed;.
15780 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
15790 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
157a0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
157b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c  PENDING_BYTE, 1,
157c0 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69   1);.    if (fai
157d0 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20  led) {.      rc 
157e0 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  = failed;.      
157f0 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
15800 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  k;.    }.  }.  .
15810 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
15820 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69  gets to this poi
15830 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c  nt, then actuall
15840 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d  y go ahead and m
15850 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  ake.  ** operati
15860 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ng system calls 
15870 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
15880 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d lock..  */.  i
15890 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
158a0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
158b0 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c   int lrc1, lrc2,
158c0 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20   lrc1Errno;.    
158d0 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20  long lk, mask;. 
158e0 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20     .    assert( 
158f0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
15900 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
15910 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
15920 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock==0 );.      
15930 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73    .    mask = (s
15940 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20  izeof(long)==8) 
15950 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20  ? LARGEST_INT64 
15960 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  : 0x7fffffff;.  
15970 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
15980 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45   read-lock SHARE
15990 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a  D_LOCK */.    /*
159a0 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71   note that the q
159b0 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61  uality of the ra
159c0 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74  ndomness doesn't
159d0 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63   matter that muc
159e0 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61  h */.    lk = ra
159f0 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e  ndom(); .    pIn
15a00 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20  ode->sharedByte 
15a10 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53  = (lk & mask)%(S
15a20 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b  HARED_SIZE - 1);
15a30 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53  .    lrc1 = afpS
15a40 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15a50 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
15a60 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
15a70 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
15a80 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
15a90 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
15aa0 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b  K_ERROR(lrc1) ){
15ab0 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f  .      lrc1Errno
15ac0 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
15ad0 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rno;.    }.    /
15ae0 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
15af0 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
15b00 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20  k */.    lrc2 = 
15b10 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
15b20 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
15b30 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
15b40 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20   1, 0);.    .   
15b50 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
15b60 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20  OR(lrc1) ) {.   
15b70 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15b80 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b  rno = lrc1Errno;
15b90 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
15ba0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
15bb0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
15bc0 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
15bd0 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
15be0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
15bf0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
15c00 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
15c10 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
15c20 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
15c30 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
15c40 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
15c50 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
15c60 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
15c70 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
15c80 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
15c90 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
15ca0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
15cb0 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
15cc0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
15cd0 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
15ce0 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
15cf0 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
15d00 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
15d10 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
15d20 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
15d30 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
15d40 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
15d50 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
15d60 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
15d70 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
15d80 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
15d90 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
15da0 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
15db0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
15dc0 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
15dd0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
15de0 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
15df0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
15e00 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
15e10 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
15e20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
15e30 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
15e40 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
15e50 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65  ock );.    if (e
15e60 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45  FileLock >= RESE
15e70 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69  RVED_LOCK && pFi
15e80 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
15e90 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
15ea0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75  .        /* Acqu
15eb0 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
15ec0 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ock */.        f
15ed0 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
15ee0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
15ef0 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
15f00 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a  VED_BYTE, 1,1);.
15f10 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65        if( !faile
15f20 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  d ){.        con
15f30 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
15f40 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
15f50 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65  }.    if (!faile
15f60 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d  d && eFileLock =
15f70 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
15f80 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71  ) {.      /* Acq
15f90 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
15fa0 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  E lock */.      
15fb0 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f    .      /* Remo
15fc0 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ve the shared lo
15fd0 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  ck before trying
15fe0 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27   the range.  we'
15ff0 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20  ll need to .    
16000 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68    ** reestablish
16010 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
16020 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74   if we can't get
16030 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a   the  afpUnlock.
16040 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
16050 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66  f( !(failed = af
16060 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16070 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16080 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a   SHARED_FIRST +.
16090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160a0 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d           pInode-
160b0 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
160c0 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
160d0 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c  nt failed2 = SQL
160e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
160f0 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20  /* now attemmpt 
16100 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75  to get the exclu
16110 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20  sive lock range 
16120 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
16130 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
16140 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
16150 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
16160 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  RST, .          
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16180 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
16190 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
161a0 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69  ( failed && (fai
161b0 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  led2 = afpSetLoc
161c0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
161d0 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b    SHARED_FIRST +
16200 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
16210 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20  yte, 1, 1)) ){. 
16220 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27           /* Can'
16230 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  t reestablish th
16240 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20  e shared lock.  
16250 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61  Sqlite can't dea
16260 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20  l, this is.     
16270 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63       ** a critic
16280 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20  al I/O error.   
16290 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
162a0 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65      rc = ((faile
162b0 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  d & SQLITE_IOERR
162c0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
162d0 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a  R) ? failed2 : .
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
162f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
16300 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
16310 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
16320 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
16330 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
16340 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20  c = failed; .   
16350 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
16360 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  f( failed ){.   
16370 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
16380 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69      }.  }.  .  i
16390 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
163a0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
163b0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
163c0 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
163d0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
163e0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
163f0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
16400 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
16410 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
16420 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
16430 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
16440 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
16450 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
16460 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
16470 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
16480 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
16490 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
164a0 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %s (afp)\n", pFi
164b0 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
164c0 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
164d0 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
164e0 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
164f0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
16500 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16510 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
16520 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
16530 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
16540 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
16550 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
16560 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
16570 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
16580 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
16590 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
165a0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
165b0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
165c0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
165d0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
165e0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
165f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
16600 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
16610 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73   int afpUnlock(s
16620 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
16630 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
16640 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16650 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
16660 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
16670 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
16680 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
16690 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  de;.  afpLocking
166a0 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
166b0 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
166c0 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
166d0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
166e0 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64    int skipShared
166f0 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
16700 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68  ITE_TEST.  int h
16710 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e   = pFile->h;.#en
16720 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
16730 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
16740 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
16750 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
16760 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c  pid=%d (afp)\n",
16770 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
16780 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
16790 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
167a0 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
167b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
167c0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
167d0 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  red,.           
167e0 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61  getpid()));..  a
167f0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
16800 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
16810 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
16820 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
16830 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
16840 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
16850 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
16860 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
16870 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
16880 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
16890 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
168a0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
168b0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
168c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
168d0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
168e0 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
168f0 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c  ock );.    Simul
16900 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
16910 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  (1);.    Simulat
16920 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
16930 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49   ).    SimulateI
16940 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
16950 0a 20 20 20 20 0a 23 69 66 6e 64 65 66 20 4e 44  .    .#ifndef ND
16960 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
16970 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
16980 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
16990 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
169a0 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
169b0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
169c0 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
169d0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
169e0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
169f0 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
16a00 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
16a10 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
16a20 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
16a30 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
16a40 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
16a50 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
16a60 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
16a70 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
16a80 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
16a90 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
16aa0 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
16ab0 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
16ac0 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
16ad0 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
16ae0 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
16af0 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
16b00 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
16b10 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
16b20 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
16b30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
16b40 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  ert( pFile->inNo
16b50 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20  rmalWrite==0.   
16b60 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
16b70 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20  ->dbUpdate==0.  
16b80 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
16b90 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
16ba0 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  ==1 );.    pFile
16bb0 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
16bc0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
16bd0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
16be0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
16bf0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
16c00 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
16c10 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
16c20 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45  th, pFile, SHARE
16c30 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f  D_FIRST, SHARED_
16c40 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20  SIZE, 0);.      
16c50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16c60 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d  K && (eFileLock=
16c70 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
16c80 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
16c90 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  1) ){.        /*
16ca0 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69   only re-establi
16cb0 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
16cc0 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ck if necessary 
16cd0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  */.        int s
16ce0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
16cf0 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e  SHARED_FIRST+pIn
16d00 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b  ode->sharedByte;
16d10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
16d20 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16d30 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16d40 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
16d50 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20   1, 1);.      } 
16d60 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73  else {.        s
16d70 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  kipShared = 1;. 
16d80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16d90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16da0 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  OK && pFile->eFi
16db0 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f  leLock>=PENDING_
16dc0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
16dd0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
16de0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
16df0 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
16e00 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
16e10 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
16e20 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
16e30 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53  ->eFileLock>=RES
16e40 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f  ERVED_LOCK && co
16e50 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
16e60 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
16e70 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16e80 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16e90 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
16ea0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  1, 0);.      if(
16eb0 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20   !rc ){ .       
16ec0 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
16ed0 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d  ed = 0; .      }
16ee0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
16ef0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
16f00 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
16f10 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
16f20 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a  e->nShared>1)){.
16f30 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
16f40 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
16f50 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _LOCK;.    }.  }
16f60 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
16f70 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63  E_OK && eFileLoc
16f80 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20  k==NO_LOCK ){.. 
16f90 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
16fa0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
16fb0 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
16fc0 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
16fd0 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
16fe0 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
16ff0 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
17000 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
17010 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
17020 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
17030 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   */.    unsigned
17040 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65   long long share
17050 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52  dLockByte = SHAR
17060 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
17070 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
17080 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
17090 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
170a0 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
170b0 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  {.      Simulate
170c0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
170d0 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
170e0 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
170f0 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ).      Simulate
17100 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
17110 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b 69  ;.      if( !ski
17120 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20  pShared ){.     
17130 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
17140 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17150 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65  th, pFile, share
17160 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29  dLockByte, 1, 0)
17170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17180 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20  if( !rc ){.     
17190 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
171a0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
171b0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
171c0 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
171d0 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
171e0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
171f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17200 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d   pInode->nLock--
17210 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17220 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
17230 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
17240 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29  node->nLock==0 )
17250 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50  {.        closeP
17260 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
17270 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17280 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
17290 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
172a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
172b0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
172c0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
172d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
172e0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
172f0 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20  e & cleanup AFP 
17300 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67  specific locking
17310 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61   context .*/.sta
17320 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65  tic int afpClose
17330 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17340 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d) {.  int rc = 
17350 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
17360 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
17370 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
17380 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
17390 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  afpUnlock(id, NO
173a0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78  _LOCK);.    unix
173b0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
173c0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
173d0 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  ode && pFile->pI
173e0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
173f0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
17400 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
17410 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
17420 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
17430 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
17440 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
17450 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
17460 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
17470 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
17480 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
17490 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
174a0 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20  ode->aPending.  
174b0 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
174c0 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
174d0 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  when.      ** th
174e0 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
174f0 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  leared..      */
17500 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e  .      setPendin
17510 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  gFd(pFile);.    
17520 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  }.    releaseIno
17530 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
17540 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17550 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
17560 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d  ntext);.    rc =
17570 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
17580 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  d);.    unixLeav
17590 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20  eMutex();.  }.  
175a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
175b0 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
175c0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
175d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
175e0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a  ING_STYLE */./*.
175f0 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76  ** The code abov
17600 65 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63  e is the AFP loc
17610 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
17620 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73  .  The code is s
17630 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61  pecific.** to Ma
17640 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f  cOSX and does no
17650 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20  t work on other 
17660 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20  unix platforms. 
17670 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   No alternative.
17680 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ** is available.
17690 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63    If you don't c
176a0 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63  ompile for a mac
176b0 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78  , then the "unix
176c0 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20  -afp".** VFS is 
176d0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  not available..*
176e0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
176f0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
17700 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c  he AFP lock impl
17710 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
17720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17730 2a 0a 2a 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 2f 0a 0a 2f 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 2a 2a 2a  ****************
177a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
177e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
177f0 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67  egin NFS Locking
17800 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
17810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17820 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
17830 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
17840 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
17850 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a  ING_STYLE./*. **
17860 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
17870 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
17880 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
17890 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
178a0 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d   eFileLock. ** m
178b0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
178c0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
178d0 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66  LOCK.. **. ** If
178e0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
178f0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
17900 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
17910 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
17920 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  . ** the request
17930 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
17940 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
17950 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73  s a no-op.. */.s
17960 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c  tatic int nfsUnl
17970 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
17980 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
17990 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ock){.  return p
179a0 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
179b0 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a  FileLock, 1);.}.
179c0 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
179d0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
179e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
179f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
17a00 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
17a10 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46 53 20  bove is the NFS 
17a20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
17a30 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
17a40 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
17a50 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
17a60 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
17a70 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
17a80 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
17a90 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
17aa0 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  le.  .**.*******
17ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
17ac0 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f  nd of the NFS lo
17ad0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
17ae0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
17af0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 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 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
17b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
17ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c  ********** Non-l
17bb0 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66  ocking sqlite3_f
17bc0 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile methods ****
17bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
17bf0 54 68 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f  The next divisio
17c00 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65  n contains imple
17c10 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61  mentations for a
17c20 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68  ll methods of th
17c30 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  e .** sqlite3_fi
17c40 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20  le object other 
17c50 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  than the locking
17c60 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c   methods.  The l
17c70 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64  ocking.** method
17c80 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 69  s were defined i
17c90 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76  n divisions abov
17ca0 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d  e (one locking m
17cb0 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76  ethod per.** div
17cc0 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d  ision).  Those m
17cd0 65 74 68 6f 64 73 20 74 68 61 74 20 61 72 65 20  ethods that are 
17ce0 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f  common to all lo
17cf0 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61  cking modes.** a
17d00 72 65 20 67 61 74 68 65 72 20 74 6f 67 65 74 68  re gather togeth
17d10 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76  er into this div
17d20 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ision..*/../*.**
17d30 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66   Seek to the off
17d40 73 65 74 20 70 61 73 73 65 64 20 61 73 20 74 68  set passed as th
17d50 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
17d60 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74  t, then read cnt
17d70 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20   .** bytes into 
17d80 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65  pBuf. Return the
17d90 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
17da0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a   actually read..
17db0 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f  **.** NB:  If yo
17dc0 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  u define USE_PRE
17dd0 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36  AD or USE_PREAD6
17de0 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  4, then it might
17df0 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65   also.** be nece
17e00 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20  ssary to define 
17e10 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f  _XOPEN_SOURCE to
17e20 20 62 65 20 35 30 30 2e 20 20 54 68 69 73 20 76   be 500.  This v
17e30 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e  aries from.** on
17e40 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74  e system to anot
17e50 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69  her.  Since SQLi
17e60 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69  te does not defi
17e70 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20  ne USE_PREAD.** 
17e80 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20  any any form by 
17e90 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c  default, we will
17ea0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
17eb0 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f  define _XOPEN_SO
17ec0 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63  URCE..** See tic
17ed0 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20 23  kets #2741 and #
17ee0 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  2681..**.** To a
17ef0 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
17f00 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
17f10 20 61 20 66 61 69 6c 65 64 20 72 65 61 64 20 74   a failed read t
17f20 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
17f30 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
17f40 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
17f50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
17f60 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c  kAndRead(unixFil
17f70 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
17f80 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69  nt64 offset, voi
17f90 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
17fa0 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69  ){.  int got;.#i
17fb0 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f  f (!defined(USE_
17fc0 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e  PREAD) && !defin
17fd0 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29  ed(USE_PREAD64))
17fe0 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74  .  i64 newOffset
17ff0 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
18000 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69  _START;.#if defi
18010 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
18020 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 72 65   do{ got = osPre
18030 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
18040 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77  cnt, offset); }w
18050 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65  hile( got<0 && e
18060 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
18070 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
18080 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
18090 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
180a0 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67  PREAD64).  do{ g
180b0 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69  ot = osPread64(i
180c0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
180d0 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65   offset); }while
180e0 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
180f0 3d 3d 45 49 4e 54 52 29 3b 0a 20 20 53 69 6d 75  ==EINTR);.  Simu
18100 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
18110 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20   = -1 );.#else. 
18120 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65   newOffset = lse
18130 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  ek(id->h, offset
18140 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53  , SEEK_SET);.  S
18150 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
18160 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20  newOffset-- );. 
18170 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d   if( newOffset!=
18180 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66  offset ){.    if
18190 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d  ( newOffset == -
181a0 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  1 ){.      ((uni
181b0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
181c0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
181d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
181e0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
181f0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09  >lastErrno = 0;.
18200 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  ...    }.    ret
18210 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 64 6f  urn -1;.  }.  do
18220 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69  { got = osRead(i
18230 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
18240 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20  ; }while( got<0 
18250 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
18260 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  );.#endif.  TIME
18270 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74  R_END;.  if( got
18280 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  <0 ){.    ((unix
18290 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
182a0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
182b0 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  }.  OSTRACE(("RE
182c0 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25  AD    %-3d %5d %
182d0 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64  7lld %llu\n", id
182e0 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74  ->h, got, offset
182f0 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
18300 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b  );.  return got;
18310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
18320 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
18330 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
18340 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
18350 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
18360 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
18370 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
18380 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
18390 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
183a0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
183b0 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71  t unixRead(.  sq
183c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
183d0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a  .  void *pBuf, .
183e0 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c    int amt,.  sql
183f0 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
18400 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  t.){.  unixFile 
18410 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
18420 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67  le *)id;.  int g
18430 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  ot;.  assert( id
18440 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
18450 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  s is a database 
18460 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
18470 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72  nal, master-jour
18480 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a  nal or temp.  **
18490 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65   file), the byte
184a0 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  s in the locking
184b0 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65   range should ne
184c0 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77  ver be read or w
184d0 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30  ritten. */.#if 0
184e0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
184f0 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  ->pUnused==0.   
18500 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
18510 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
18520 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
18530 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
18540 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
18550 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64  .  got = seekAnd
18560 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73  Read(pFile, offs
18570 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  et, pBuf, amt);.
18580 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29    if( got==amt )
18590 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
185a0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
185b0 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
185c0 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
185d0 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64  t by seekAndRead
185e0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
185f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
18600 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
18610 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
18620 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79  = 0; /* not a sy
18630 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
18640 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
18650 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
18660 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
18670 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
18680 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
18690 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f  [got], 0, amt-go
186a0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
186b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
186c0 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f  T_READ;.  }.}../
186d0 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
186e0 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f   offset in id->o
186f0 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20  ffset then read 
18700 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70  cnt bytes into p
18710 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  Buf..** Return t
18720 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
18730 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
18740 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66  .  Update the of
18750 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  fset..**.** To a
18760 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
18770 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
18780 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20   a failed write 
18790 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
187a0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
187b0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
187c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
187d0 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46  ekAndWrite(unixF
187e0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66  ile *id, i64 off
187f0 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  set, const void 
18800 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
18810 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20  .  int got;.#if 
18820 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  (!defined(USE_PR
18830 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64  EAD) && !defined
18840 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20  (USE_PREAD64)). 
18850 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
18860 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53  #endif.  TIMER_S
18870 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65  TART;.#if define
18880 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64  d(USE_PREAD).  d
18890 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74  o{ got = osPwrit
188a0 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
188b0 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68  nt, offset); }wh
188c0 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
188d0 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65  rno==EINTR );.#e
188e0 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
188f0 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67  PREAD64).  do{ g
18900 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 36 34 28  ot = osPwrite64(
18910 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
18920 2c 20 6f 66 66 73 65 74 29 3b 7d 77 68 69 6c 65  , offset);}while
18930 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
18940 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a  ==EINTR);.#else.
18950 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
18960 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
18970 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
18980 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18990 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a   newOffset-- );.
189a0 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21    if( newOffset!
189b0 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69  =offset ){.    i
189c0 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20  f( newOffset == 
189d0 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e  -1 ){.      ((un
189e0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
189f0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
18a00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18a10 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
18a20 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
18a30 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ....    }.    re
18a40 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 64  turn -1;.  }.  d
18a50 6f 7b 20 67 6f 74 20 3d 20 6f 73 57 72 69 74 65  o{ got = osWrite
18a60 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
18a70 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c  t); }while( got<
18a80 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
18a90 52 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  R );.#endif.  TI
18aa0 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67  MER_END;.  if( g
18ab0 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e  ot<0 ){.    ((un
18ac0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
18ad0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
18ae0 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
18af0 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35  "WRITE   %-3d %5
18b00 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c  d %7lld %llu\n",
18b10 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66   id->h, got, off
18b20 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  set, TIMER_ELAPS
18b30 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  ED));.  return g
18b40 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  ot;.}.../*.** Wr
18b50 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
18b60 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
18b70 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
18b80 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
18b90 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
18ba0 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
18bb0 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
18bc0 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65  ic int unixWrite
18bd0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
18be0 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76   *id, .  const v
18bf0 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e  oid *pBuf, .  in
18c00 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33  t amt,.  sqlite3
18c10 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29  _int64 offset .)
18c20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
18c30 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
18c40 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65  )id;.  int wrote
18c50 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
18c60 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
18c70 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  amt>0 );..  /* I
18c80 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61  f this is a data
18c90 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61  base file (not a
18ca0 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72   journal, master
18cb0 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70  -journal or temp
18cc0 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65  .  ** file), the
18cd0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
18ce0 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75  cking range shou
18cf0 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ld never be read
18d00 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a   or written. */.
18d10 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
18d20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d  pFile->pUnused==
18d30 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  0.       || offs
18d40 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et>=PENDING_BYTE
18d50 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f  +512.       || o
18d60 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49  ffset+amt<=PENDI
18d70 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65  NG_BYTE .  );.#e
18d80 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44  ndif..#ifndef ND
18d90 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20  EBUG.  /* If we 
18da0 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d  are doing a norm
18db0 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61  al write to a da
18dc0 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
18dd0 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20  opposed to.  ** 
18de0 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
18df0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
18e00 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
18e10 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
18e20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61  a.  ** normal da
18e30 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65  tabase file) the
18e40 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  n record the fac
18e50 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  t that the datab
18e60 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61  ase.  ** has cha
18e70 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
18e80 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
18e90 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72  r is modified, r
18ea0 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20  ecord that.  ** 
18eb0 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20  fact too..  */. 
18ec0 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f   if( pFile->inNo
18ed0 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20  rmalWrite ){.   
18ee0 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
18ef0 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61   = 1;  /* The da
18f00 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
18f10 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20  modified */.    
18f20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26  if( offset<=24 &
18f30 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37  & offset+amt>=27
18f40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
18f50 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64  ;.      char old
18f60 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53  Cntr[4];.      S
18f70 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
18f80 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72  nign(1);.      r
18f90 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  c = seekAndRead(
18fa0 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e  pFile, 24, oldCn
18fb0 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69  tr, 4);.      Si
18fc0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
18fd0 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
18fe0 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d  ( rc!=4 || memcm
18ff0 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68  p(oldCntr, &((ch
19000 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66  ar*)pBuf)[24-off
19010 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20  set], 4)!=0 ){. 
19020 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72         pFile->tr
19030 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b  ansCntrChng = 1;
19040 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
19050 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73  tion counter has
19060 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20   changed */.    
19070 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
19080 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61  ndif..  while( a
19090 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d  mt>0 && (wrote =
190a0 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46   seekAndWrite(pF
190b0 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75  ile, offset, pBu
190c0 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20  f, amt))>0 ){.  
190d0 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
190e0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72      offset += wr
190f0 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
19100 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
19110 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d  rote];.  }.  Sim
19120 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77  ulateIOError(( w
19130 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31  rote=(-1), amt=1
19140 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44   ));.  SimulateD
19150 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77  iskfullError(( w
19160 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29  rote=0, amt=1 ))
19170 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29  ;..  if( amt>0 )
19180 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c  {.    if( wrote<
19190 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74  0 && pFile->last
191a0 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b  Errno!=ENOSPC ){
191b0 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  .      /* lastEr
191c0 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
191d0 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  ndWrite */.     
191e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
191f0 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
19200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
19210 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
19220 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74  0; /* not a syst
19230 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
19240 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19250 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
19260 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19270 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
19280 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
19290 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
192a0 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
192b0 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
192c0 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
192d0 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
192e0 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
192f0 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67  cs are occurring
19300 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69   at the right ti
19310 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mes..*/.int sqli
19320 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  te3_sync_count =
19330 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   0;.int sqlite3_
19340 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  fullsync_count =
19350 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
19360 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73  * We do not trus
19370 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f  t systems to pro
19380 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66  vide a working f
19390 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d  datasync().  Som
193a0 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20  e do..** Others 
193b0 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61  do no.  To be sa
193c0 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63  fe, we will stic
193d0 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 6f 77  k with the (slow
193e0 65 72 29 20 66 73 79 6e 63 28 29 2e 0a 2a 2a 20  er) fsync()..** 
193f0 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74  If you know that
19400 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65   your system doe
19410 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61 73  s support fdatas
19420 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c  ync() correctly,
19430 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20  .** then simply 
19440 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66  compile with -Df
19450 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79  datasync=fdatasy
19460 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  nc.*/.#if !defin
19470 65 64 28 66 64 61 74 61 73 79 6e 63 29 20 26 26  ed(fdatasync) &&
19480 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75   !defined(__linu
19490 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20 66 64  x__).# define fd
194a0 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65  atasync fsync.#e
194b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69  ndif../*.** Defi
194c0 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
194d0 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65  C to 0 or 1 depe
194e0 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
194f0 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46   or not.** the F
19500 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f  _FULLFSYNC macro
19510 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f   is defined.  F_
19520 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72  FULLFSYNC is cur
19530 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61  rently.** only a
19540 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20  vailable on Mac 
19550 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20  OS X.  But that 
19560 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f  could change..*/
19570 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53  .#ifdef F_FULLFS
19580 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56  YNC.# define HAV
19590 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65  E_FULLFSYNC 1.#e
195a0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56  lse.# define HAV
195b0 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65  E_FULLFSYNC 0.#e
195c0 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ndif.../*.** The
195d0 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20   fsync() system 
195e0 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f  call does not wo
195f0 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64  rk as advertised
19600 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78   on many.** unix
19610 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66   systems.  The f
19620 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75  ollowing procedu
19630 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  re is an attempt
19640 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77   to make.** it w
19650 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a  ork better..**.*
19660 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  * The SQLITE_NO_
19670 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62  SYNC macro disab
19680 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73  les all fsync()s
19690 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75  .  This is usefu
196a0 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67  l.** for testing
196b0 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
196c0 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65   run through the
196d0 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63   test suite quic
196e0 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20  kly..** You are 
196f0 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64  strongly advised
19700 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79   *not* to deploy
19710 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
19720 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  SYNC.** enabled,
19730 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   however, since 
19740 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
19750 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20  YNC enabled, an 
19760 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70  OS crash.** or p
19770 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c  ower failure wil
19780 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74  l likely corrupt
19790 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
197a0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  le..**.** SQLite
197b0 20 73 65 74 73 20 74 68 65 20 64 61 74 61 4f 6e   sets the dataOn
197c0 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65 20 73  ly flag if the s
197d0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
197e0 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  is unchanged..**
197f0 20 54 68 65 20 69 64 65 61 20 62 65 68 69 6e 64   The idea behind
19800 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61   dataOnly is tha
19810 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  t it should only
19820 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   write the file 
19830 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69  content.** to di
19840 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64  sk, not the inod
19850 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20  e.  We only set 
19860 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20  dataOnly if the 
19870 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a  file size is .**
19880 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65   unchanged since
19890 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
198a0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  s part of the in
198b0 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a  ode.  However, .
198c0 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c 6c  ** Ted Ts'o tell
198d0 73 20 75 73 20 74 68 61 74 20 66 64 61 74 61 73  s us that fdatas
198e0 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20  ync() will also 
198f0 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65 20  write the inode 
19900 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73  if the.** file s
19910 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e  ize has changed.
19920 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20    The only real 
19930 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
19940 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a  en fdatasync().*
19950 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20 54  * and fsync(), T
19960 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73 20  ed tells us, is 
19970 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29  that fdatasync()
19980 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20   will not flush 
19990 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20  the.** inode if 
199a0 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e  the mtime or own
199b0 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64  er or other inod
199c0 65 20 61 74 74 72 69 62 75 74 65 73 20 68 61 76  e attributes hav
199d0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65  e changed..** We
199e0 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74   only care about
199f0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20   the file size, 
19a00 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66 69  not the other fi
19a10 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c 20 73  le attributes, s
19a20 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20 53  o.** as far as S
19a30 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72 6e  QLite is concern
19a40 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e 63  ed, an fdatasync
19a50 28 29 20 69 73 20 61 6c 77 61 79 73 20 61 64 65  () is always ade
19a60 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65  quate..** So, we
19a70 20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61 74   always use fdat
19a80 61 73 79 6e 63 28 29 20 69 66 20 69 74 20 69 73  async() if it is
19a90 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67 61   available, rega
19aa0 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65  rdless of.** the
19ab0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
19ac0 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a  taOnly flag..*/.
19ad0 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f  static int full_
19ae0 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e  fsync(int fd, in
19af0 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20  t fullSync, int 
19b00 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74  dataOnly){.  int
19b10 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66   rc;..  /* The f
19b20 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f  ollowing "ifdef/
19b30 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63  elif/else/" bloc
19b40 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 73  k has the same s
19b50 74 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a  tructure as.  **
19b60 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20   the one below. 
19b70 49 74 20 69 73 20 72 65 70 6c 69 63 61 74 65 64  It is replicated
19b80 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20   here solely to 
19b90 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67  avoid cluttering
19ba0 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65   .  ** up the re
19bb0 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68 65  al code with the
19bc0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
19bd0 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f  R() macros..  */
19be0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
19bf0 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f  O_SYNC.  UNUSED_
19c00 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
19c10 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
19c20 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55  R(fullSync);.  U
19c30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
19c40 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66  dataOnly);.#elif
19c50 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a   HAVE_FULLFSYNC.
19c60 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
19c70 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65  ER(dataOnly);.#e
19c80 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
19c90 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29  AMETER(fullSync)
19ca0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
19cb0 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
19cc0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63  #endif..  /* Rec
19cd0 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ord the number o
19ce0 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20  f times that we 
19cf0 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e  do a normal fsyn
19d00 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55  c() and .  ** FU
19d10 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73  LLSYNC.  This is
19d20 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73   used during tes
19d30 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74  ting to verify t
19d40 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75  hat this procedu
19d50 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c  re.  ** gets cal
19d60 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72  led with the cor
19d70 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a  rect arguments..
19d80 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
19d90 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75  TE_TEST.  if( fu
19da0 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33  llSync ) sqlite3
19db0 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b  _fullsync_count+
19dc0 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e  +;.  sqlite3_syn
19dd0 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  c_count++;.#endi
19de0 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f  f..  /* If we co
19df0 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20  mpiled with the 
19e00 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66  SQLITE_NO_SYNC f
19e10 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e  lag, then syncin
19e20 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f  g is a.  ** no-o
19e30 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  p.  */.#ifdef SQ
19e40 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72  LITE_NO_SYNC.  r
19e50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  c = SQLITE_OK;.#
19e60 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
19e70 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  YNC.  if( fullSy
19e80 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f  nc ){.    rc = o
19e90 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c  sFcntl(fd, F_FUL
19ea0 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65  LFSYNC, 0);.  }e
19eb0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  lse{.    rc = 1;
19ec0 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65  .  }.  /* If the
19ed0 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65   FULLFSYNC faile
19ee0 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  d, fall back to 
19ef0 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73  attempting an fs
19f00 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73  ync()..  ** It s
19f10 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73  houldn't be poss
19f20 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79  ible for fullfsy
19f30 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68  nc to fail on th
19f40 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69  e local .  ** fi
19f50 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53  le system (on OS
19f60 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69  X), so failure i
19f70 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55  ndicates that FU
19f80 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e  LLFSYNC.  ** isn
19f90 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72  't supported for
19fa0 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65   this file syste
19fb0 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61  m. So, attempt a
19fc0 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e  n fsync .  ** an
19fd0 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f  d (for now) igno
19fe0 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  re the overhead 
19ff0 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73  of a superfluous
1a000 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20   fcntl call.  . 
1a010 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74   ** It'd be bett
1a020 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c  er to detect ful
1a030 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f  lfsync support o
1a040 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20  nce and avoid . 
1a050 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61   ** the fcntl ca
1a060 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79  ll every time sy
1a070 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20  nc is called..  
1a080 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63  */.  if( rc ) rc
1a090 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23   = fsync(fd);..#
1a0a0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  elif defined(__A
1a0b0 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61  PPLE__).  /* fda
1a0c0 74 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b  tasync() on HFS+
1a0d0 20 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75   doesn't yet flu
1a0e0 73 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  sh the file size
1a0f0 20 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63   if it changed c
1a100 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f  orrectly.  ** so
1a110 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65   currently we de
1a120 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63  fault to the mac
1a130 72 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65  ro that redefine
1a140 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66  s fdatasync to f
1a150 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  sync.  */.  rc =
1a160 20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73   fsync(fd);.#els
1a170 65 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73  e .  rc = fdatas
1a180 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f  ync(fd);.#if OS_
1a190 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63  VXWORKS.  if( rc
1a1a0 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ==-1 && errno==E
1a1b0 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63  NOTSUP ){.    rc
1a1c0 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20   = fsync(fd);.  
1a1d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  }.#endif /* OS_V
1a1e0 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66  XWORKS */.#endif
1a1f0 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45   /* ifdef SQLITE
1a200 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41  _NO_SYNC elif HA
1a210 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a  VE_FULLFSYNC */.
1a220 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b  .  if( OS_VXWORK
1a230 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a  S && rc!= -1 ){.
1a240 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a      rc = 0;.  }.
1a250 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a260 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
1a270 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
1a280 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
1a290 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
1a2a0 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   disk..**.** If 
1a2b0 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e  dataOnly==0 then
1a2c0 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69   both the file i
1a2d0 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65  tself and its me
1a2e0 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20  tadata (file.** 
1a2f0 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d  size, access tim
1a300 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63  e, etc) are sync
1a310 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79  ed.  If dataOnly
1a320 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  !=0 then only th
1a330 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69  e.** file data i
1a340 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
1a350 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f  Under Unix, also
1a360 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1a370 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
1a380 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65  try for the file
1a390 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65  .** has been cre
1a3a0 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e  ated by fsync-in
1a3b0 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  g the directory 
1a3c0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
1a3d0 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65  e file..** If we
1a3e0 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20   do not do this 
1a3f0 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72  and we encounter
1a400 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
1a410 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  , the directory.
1a420 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
1a430 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e   journal might n
1a440 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77  ot exist after w
1a450 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e  e reboot.  The n
1a460 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f  ext.** SQLite to
1a470 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
1a480 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74   will not know t
1a490 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1a4a0 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a  exists (because.
1a4b0 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
1a4c0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a   entry for the j
1a4d0 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72  ournal was never
1a4e0 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68   created) and th
1a4f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
1a500 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62   will not roll b
1a510 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c  ack - possibly l
1a520 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61  eading to databa
1a530 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  se corruption..*
1a540 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1a550 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  xSync(sqlite3_fi
1a560 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67  le *id, int flag
1a570 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
1a580 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
1a590 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
1a5a0 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e  ..  int isDataOn
1a5b0 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49  ly = (flags&SQLI
1a5c0 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
1a5d0 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73  );.  int isFulls
1a5e0 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30  ync = (flags&0x0
1a5f0 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
1a600 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  FULL;..  /* Chec
1a610 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51  k that one of SQ
1a620 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
1a630 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73   or FULL was pas
1a640 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
1a650 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
1a660 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
1a670 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73  .      || (flags
1a680 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
1a690 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20  YNC_FULL.  );.. 
1a6a0 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c   /* Unix cannot,
1a6b0 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d   but some system
1a6c0 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  s may return SQL
1a6d0 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65  ITE_FULL from he
1a6e0 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69  re. This.  ** li
1a6f0 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68  ne is to test th
1a700 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73  at doing so does
1a710 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70   not cause any p
1a720 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20  roblems..  */.  
1a730 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
1a740 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
1a750 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20  LITE_FULL );..  
1a760 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
1a770 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e  .  OSTRACE(("SYN
1a780 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  C    %-3d\n", pF
1a790 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d  ile->h));.  rc =
1a7a0 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c   full_fsync(pFil
1a7b0 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63  e->h, isFullsync
1a7c0 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20  , isDataOnly);. 
1a7d0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1a7e0 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20  ( rc=1 );.  if( 
1a7f0 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  rc ){.    pFile-
1a800 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1a810 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75  no;.    return u
1a820 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1a830 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20  TE_IOERR_FSYNC, 
1a840 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46  "full_fsync", pF
1a850 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
1a860 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69  .  if( pFile->di
1a870 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 4f 53  rfd>=0 ){.    OS
1a880 54 52 41 43 45 28 28 22 44 49 52 53 59 4e 43 20  TRACE(("DIRSYNC 
1a890 25 2d 33 64 20 28 68 61 76 65 5f 66 75 6c 6c 66  %-3d (have_fullf
1a8a0 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63  sync=%d fullsync
1a8b0 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  =%d)\n", pFile->
1a8c0 64 69 72 66 64 2c 0a 20 20 20 20 20 20 20 20 20  dirfd,.         
1a8d0 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e     HAVE_FULLFSYN
1a8e0 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b  C, isFullsync));
1a8f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a900 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
1a910 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63      /* The direc
1a920 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6f 6e 6c  tory sync is onl
1a930 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 66  y attempted if f
1a940 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a 20 20 20  ull_fsync is.   
1a950 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 20 6f   ** turned off o
1a960 72 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20  r unavailable.  
1a970 49 66 20 61 20 66 75 6c 6c 5f 66 73 79 6e 63 20  If a full_fsync 
1a980 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 0a  occurred above,.
1a990 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
1a9a0 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69  directory sync i
1a9b0 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 0a 20  s superfluous.. 
1a9c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
1a9d0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 7c  HAVE_FULLFSYNC |
1a9e0 7c 20 21 69 73 46 75 6c 6c 73 79 6e 63 29 20 26  | !isFullsync) &
1a9f0 26 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  & full_fsync(pFi
1aa00 6c 65 2d 3e 64 69 72 66 64 2c 30 2c 30 29 20 29  le->dirfd,0,0) )
1aa10 7b 0a 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20  {.       /*.    
1aa20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 72 65     ** We have re
1aa30 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20  ceived multiple 
1aa40 72 65 70 6f 72 74 73 20 6f 66 20 66 73 79 6e 63  reports of fsync
1aa50 28 29 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20  () returning.   
1aa60 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 20 77 68      ** errors wh
1aa70 65 6e 20 61 70 70 6c 69 65 64 20 74 6f 20 64 69  en applied to di
1aa80 72 65 63 74 6f 72 69 65 73 20 6f 6e 20 63 65 72  rectories on cer
1aa90 74 61 69 6e 20 66 69 6c 65 20 73 79 73 74 65 6d  tain file system
1aaa0 73 2e 0a 20 20 20 20 20 20 20 2a 2a 20 41 20 66  s..       ** A f
1aab0 61 69 6c 65 64 20 64 69 72 65 63 74 6f 72 79 20  ailed directory 
1aac0 73 79 6e 63 20 69 73 20 6e 6f 74 20 61 20 62 69  sync is not a bi
1aad0 67 20 64 65 61 6c 2e 20 20 53 6f 20 69 74 20 73  g deal.  So it s
1aae0 65 65 6d 73 0a 20 20 20 20 20 20 20 2a 2a 20 62  eems.       ** b
1aaf0 65 74 74 65 72 20 74 6f 20 69 67 6e 6f 72 65 20  etter to ignore 
1ab00 74 68 65 20 65 72 72 6f 72 2e 20 20 54 69 63 6b  the error.  Tick
1ab10 65 74 20 23 31 36 35 37 0a 20 20 20 20 20 20 20  et #1657.       
1ab20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 70 46 69  */.       /* pFi
1ab30 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1ab40 65 72 72 6e 6f 3b 20 2a 2f 0a 20 20 20 20 20 20  errno; */.      
1ab50 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   /* return SQLIT
1ab60 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20  E_IOERR; */.    
1ab70 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  }.#endif.    /* 
1ab80 4f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 79 6e  Only need to syn
1ab90 63 20 6f 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65  c once, so close
1aba0 20 74 68 65 20 20 64 69 72 65 63 74 6f 72 79 20   the  directory 
1abb0 77 68 65 6e 20 77 65 20 61 72 65 20 64 6f 6e 65  when we are done
1abc0 20 2a 2f 0a 20 20 20 20 72 6f 62 75 73 74 5f 63   */.    robust_c
1abd0 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c  lose(pFile, pFil
1abe0 65 2d 3e 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45  e->dirfd, __LINE
1abf0 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  __);.    pFile->
1ac00 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 7d 0a  dirfd = -1;.  }.
1ac10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ac20 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
1ac30 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
1ac40 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
1ac50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1ac60 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  ixTruncate(sqlit
1ac70 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34  e3_file *id, i64
1ac80 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46   nByte){.  unixF
1ac90 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1aca0 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69  ixFile *)id;.  i
1acb0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
1acc0 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75   pFile );.  Simu
1acd0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
1ace0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1acf0 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20  _TRUNCATE );..  
1ad00 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  /* If the user h
1ad10 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20  as configured a 
1ad20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74  chunk-size for t
1ad30 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61  his file, trunca
1ad40 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65  te the.  ** file
1ad50 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73   so that it cons
1ad60 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67  ists of an integ
1ad70 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75  er number of chu
1ad80 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20  nks (i.e. the.  
1ad90 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73  ** actual file s
1ada0 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70  ize after the op
1adb0 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c  eration may be l
1adc0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72  arger than the r
1add0 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69  equested.  ** si
1ade0 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ze)..  */.  if( 
1adf0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 29  pFile->szChunk )
1ae00 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28  {.    nByte = ((
1ae10 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73  nByte + pFile->s
1ae20 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c  zChunk - 1)/pFil
1ae30 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
1ae40 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
1ae50 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74  }..  rc = robust
1ae60 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65  _ftruncate(pFile
1ae70 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74  ->h, (off_t)nByt
1ae80 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
1ae90 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1aea0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1aeb0 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1aec0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1aed0 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74  RR_TRUNCATE, "ft
1aee0 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d  runcate", pFile-
1aef0 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65  >zPath);.  }else
1af00 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
1af10 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
1af20 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
1af30 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
1af40 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
1af50 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  posed to.    ** 
1af60 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
1af70 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
1af80 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
1af90 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
1afa0 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  a.    ** normal 
1afb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61  database file) a
1afc0 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74  nd we truncate t
1afd0 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
1afe0 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74  length,.    ** t
1aff0 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20  hat effectively 
1b000 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1b010 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69  ge counter.  Thi
1b020 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20  s might happen. 
1b030 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f     ** when resto
1b040 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ring a database 
1b050 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70  using the backup
1b060 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f   API from a zero
1b070 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73  -length.    ** s
1b080 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ource..    */.  
1b090 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
1b0a0 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42  ormalWrite && nB
1b0b0 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
1b0c0 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
1b0d0 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Chng = 1;.    }.
1b0e0 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75  #endif..    retu
1b0f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b100 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  }.}../*.** Deter
1b110 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74  mine the current
1b120 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20   size of a file 
1b130 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74  in bytes.*/.stat
1b140 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53  ic int unixFileS
1b150 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1b160 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65   *id, i64 *pSize
1b170 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1b180 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
1b190 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
1b1a0 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 28    rc = osFstat((
1b1b0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1b1c0 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75  h, &buf);.  Simu
1b1d0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
1b1e0 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  1 );.  if( rc!=0
1b1f0 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
1b200 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
1b210 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1b220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1b230 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20  ERR_FSTAT;.  }. 
1b240 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74   *pSize = buf.st
1b250 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65  _size;..  /* Whe
1b260 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f  n opening a zero
1b270 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20  -size database, 
1b280 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  the findInodeInf
1b290 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20  o() procedure.  
1b2a0 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67  ** writes a sing
1b2b0 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61  le byte into tha
1b2c0 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  t file in order 
1b2d0 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
1b2e0 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65   bug.  ** in the
1b2f0 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65   OS-X msdos file
1b300 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65  system.  In orde
1b310 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c  r to avoid probl
1b320 65 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20  ems with upper. 
1b330 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e   ** layers, we n
1b340 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  eed to report th
1b350 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20  is file size as 
1b360 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68  zero even though
1b370 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c   it is.  ** real
1b380 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23  ly 1.   Ticket #
1b390 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  3260..  */.  if(
1b3a0 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53   *pSize==1 ) *pS
1b3b0 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74  ize = 0;...  ret
1b3c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1b3d0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
1b3e0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1b3f0 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
1b400 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61  PPLE__)./*.** Ha
1b410 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d  ndler for proxy-
1b420 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e  locking file-con
1b430 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66  trol verbs.  Def
1b440 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68  ined below in th
1b450 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f  e.** proxying lo
1b460 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a  cking division..
1b470 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
1b480 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  oxyFileControl(s
1b490 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
1b4a0 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a  ,void*);.#endif.
1b4b0 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
1b4c0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1b4d0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51  to handle the SQ
1b4e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
1b4f0 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f  HINT .** file-co
1b500 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e  ntrol operation.
1b510 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73  .**.** If the us
1b520 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65  er has configure
1b530 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66  d a chunk-size f
1b540 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 69 74  or this file, it
1b550 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 74 68 61   could be.** tha
1b560 74 20 74 68 65 20 66 69 6c 65 20 6e 65 65 64 73  t the file needs
1b570 20 74 6f 20 62 65 20 65 78 74 65 6e 64 65 64 20   to be extended 
1b580 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 4f  at this point. O
1b590 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a 2a 2a  therwise, the.**
1b5a0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
1b5b0 5a 45 5f 48 49 4e 54 20 6f 70 65 72 61 74 69 6f  ZE_HINT operatio
1b5c0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  n is a no-op for
1b5d0 20 55 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63   Unix..*/.static
1b5e0 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69   int fcntlSizeHi
1b5f0 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  nt(unixFile *pFi
1b600 6c 65 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  le, i64 nByte){.
1b610 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1b620 68 75 6e 6b 20 29 7b 0a 20 20 20 20 69 36 34 20  hunk ){.    i64 
1b630 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
1b640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
1b650 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
1b660 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
1b670 61 74 20 62 75 66 3b 20 20 20 20 20 20 20 20 20  at buf;         
1b680 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1b690 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75  hold return valu
1b6a0 65 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f  es of fstat() */
1b6b0 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46  .   .    if( osF
1b6c0 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
1b6d0 62 75 66 29 20 29 20 72 65 74 75 72 6e 20 53 51  buf) ) return SQ
1b6e0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1b6f0 3b 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28  ;..    nSize = (
1b700 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a  (nByte+pFile->sz
1b710 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65  Chunk-1) / pFile
1b720 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69  ->szChunk) * pFi
1b730 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20  le->szChunk;.   
1b740 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29   if( nSize>(i64)
1b750 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a  buf.st_size ){..
1b760 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
1b770 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
1b780 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f  ) && HAVE_POSIX_
1b790 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20  FALLOCATE.      
1b7a0 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f  /* The code belo
1b7b0 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68  w is handling th
1b7c0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
1b7d0 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20  f osFallocate() 
1b7e0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63  .      ** correc
1b7f0 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  tly. posix_fallo
1b800 63 61 74 65 28 29 20 69 73 20 64 65 66 69 6e 65  cate() is define
1b810 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65  d to "returns ze
1b820 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a  ro on success, .
1b830 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65        ** or an e
1b840 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20  rror number on  
1b850 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68  failure". See th
1b860 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65  e manpage for de
1b870 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tails. */.      
1b880 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64  int err;.      d
1b890 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d  o{.        err =
1b8a0 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69   osFallocate(pFi
1b8b0 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69  le->h, buf.st_si
1b8c0 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74  ze, nSize-buf.st
1b8d0 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77  _size);.      }w
1b8e0 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52  hile( err==EINTR
1b8f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72   );.      if( er
1b900 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  r ) return SQLIT
1b910 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23  E_IOERR_WRITE;.#
1b920 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66  else.      /* If
1b930 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74   the OS does not
1b940 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c   have posix_fall
1b950 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74  ocate(), fake it
1b960 2e 20 46 69 72 73 74 20 75 73 65 0a 20 20 20 20  . First use.    
1b970 20 20 2a 2a 20 66 74 72 75 6e 63 61 74 65 28 29    ** ftruncate()
1b980 20 74 6f 20 73 65 74 20 74 68 65 20 66 69 6c 65   to set the file
1b990 20 73 69 7a 65 2c 20 74 68 65 6e 20 77 72 69 74   size, then writ
1b9a0 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  e a single byte 
1b9b0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
1b9c0 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65 61 63  last byte in eac
1b9d0 68 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74  h block within t
1b9e0 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69  he extended regi
1b9f0 6f 6e 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a  on. This.      *
1ba00 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 74 65  * is the same te
1ba10 63 68 6e 69 71 75 65 20 75 73 65 64 20 62 79 20  chnique used by 
1ba20 67 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65  glibc to impleme
1ba30 6e 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  nt posix_falloca
1ba40 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  te().      ** on
1ba50 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 64 6f   systems that do
1ba60 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c   not have a real
1ba70 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 73 79 73   fallocate() sys
1ba80 74 65 6d 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20  tem call..      
1ba90 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c  */.      int nBl
1baa0 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69  k = buf.st_blksi
1bab0 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73  ze;  /* File-sys
1bac0 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a  tem block size *
1bad0 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69  /.      i64 iWri
1bae0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
1baf0 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73      /* Next offs
1bb00 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  et to write to *
1bb10 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62  /..      if( rob
1bb20 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46  ust_ftruncate(pF
1bb30 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65 29 20 29  ile->h, nSize) )
1bb40 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
1bb50 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1bb60 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  no;.        retu
1bb70 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
1bb80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1bb90 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74  NCATE, "ftruncat
1bba0 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
1bbb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1bbc0 20 69 57 72 69 74 65 20 3d 20 28 28 62 75 66 2e   iWrite = ((buf.
1bbd0 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b  st_size + 2*nBlk
1bbe0 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b   - 1)/nBlk)*nBlk
1bbf0 2d 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  -1;.      while(
1bc00 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 20 29 7b   iWrite<nSize ){
1bc10 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 57 72  .        int nWr
1bc20 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ite = seekAndWri
1bc30 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65  te(pFile, iWrite
1bc40 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20  , "", 1);.      
1bc50 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20    if( nWrite!=1 
1bc60 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1bc70 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20  IOERR_WRITE;.   
1bc80 20 20 20 20 20 69 57 72 69 74 65 20 2b 3d 20 6e       iWrite += n
1bc90 42 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  Blk;.      }.#en
1bca0 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  dif.    }.  }.. 
1bcb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bcc0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f  K;.}../*.** Info
1bcd0 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74  rmation and cont
1bce0 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66  rol of an open f
1bcf0 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
1bd00 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
1bd10 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
1bd20 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
1bd30 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
1bd40 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
1bd50 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1bd60 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45  _FCNTL_LOCKSTATE
1bd70 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
1bd80 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69  )pArg = ((unixFi
1bd90 6c 65 2a 29 69 64 29 2d 3e 65 46 69 6c 65 4c 6f  le*)id)->eFileLo
1bda0 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ck;.      return
1bdb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1bdc0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1bdd0 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a  E_LAST_ERRNO: {.
1bde0 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
1bdf0 67 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29  g = ((unixFile*)
1be00 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  id)->lastErrno;.
1be10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1be20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1be30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1be40 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20  NTL_CHUNK_SIZE: 
1be50 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
1be60 6c 65 2a 29 69 64 29 2d 3e 73 7a 43 68 75 6e 6b  le*)id)->szChunk
1be70 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
1be80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1be90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1bea0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1beb0 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
1bec0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  {.      return f
1bed0 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 28 75 6e  cntlSizeHint((un
1bee0 69 78 46 69 6c 65 20 2a 29 69 64 2c 20 2a 28 69  ixFile *)id, *(i
1bef0 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  64 *)pArg);.    
1bf00 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1bf10 45 5f 46 43 4e 54 4c 5f 52 45 41 44 4f 4e 4c 59  E_FCNTL_READONLY
1bf20 5f 53 48 4d 3a 20 7b 0a 20 20 20 20 20 20 28 28  _SHM: {.      ((
1bf30 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 72  unixFile*)id)->r
1bf40 65 61 64 4f 6e 6c 79 53 68 6d 20 3d 20 28 70 41  eadOnlyShm = (pA
1bf50 72 67 21 3d 30 29 3b 0a 20 20 20 20 20 20 72 65  rg!=0);.      re
1bf60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bf70 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44      }.#ifndef ND
1bf80 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20  EBUG.    /* The 
1bf90 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73  pager calls this
1bfa0 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61   method to signa
1bfb0 6c 20 74 68 61 74 20 69 74 20 68 61 73 20 64 6f  l that it has do
1bfc0 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c  ne.    ** a roll
1bfd0 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68  back and that th
1bfe0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68  e database is th
1bff0 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65  erefore unchange
1c000 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20  d and.    ** it 
1c010 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66  hence it is OK f
1c020 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  or the transacti
1c030 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  on change counte
1c040 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75  r to be.    ** u
1c050 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f  nchanged..    */
1c060 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1c070 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1c080 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75  GED: {.      ((u
1c090 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62  nixFile*)id)->db
1c0a0 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
1c0b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c0c0 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OK;.    }.#endif
1c0d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1c0e0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1c0f0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1c100 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20  PLE__).    case 
1c110 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
1c120 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61  ROXYFILE:.    ca
1c130 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  se SQLITE_GET_LO
1c140 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20  CKPROXYFILE: {. 
1c150 20 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78       return prox
1c160 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c  yFileControl(id,
1c170 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a  op,pArg);.    }.
1c180 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1c190 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1c1a0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
1c1b0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20  (__APPLE__) */. 
1c1c0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1c1d0 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54 45  CNTL_SYNC_OMITTE
1c1e0 44 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  D: {.      retur
1c1f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
1c200 20 41 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20   A no-op */.    
1c210 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
1c220 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
1c230 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1c240 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
1c250 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  in bytes of the 
1c260 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b  underlying block
1c270 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74   device for.** t
1c280 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
1c290 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73  e. This is almos
1c2a0 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  t always 512 byt
1c2b0 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a  es, but may be.*
1c2c0 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d  * larger for som
1c2d0 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  e devices..**.**
1c2e0 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73   SQLite code ass
1c2f0 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  umes this functi
1c300 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  on cannot fail. 
1c310 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  It also assumes 
1c320 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66  that.** if two f
1c330 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
1c340 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   in the same fil
1c350 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f  e-system directo
1c360 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61  ry (i.e..** a da
1c370 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a  tabase and its j
1c380 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
1c390 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
1c3a0 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
1c3b0 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
1c3c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1c3d0 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  ixSectorSize(sql
1c3e0 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
1c3f0 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed){.  UNUSED_PA
1c400 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
1c410 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1c420 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
1c430 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _SIZE;.}../*.** 
1c440 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63  Return the devic
1c450 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
1c460 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 20  s for the file. 
1c470 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 30  This is always 0
1c480 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74   for unix..*/.st
1c490 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76  atic int unixDev
1c4a0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1c4b0 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  cs(sqlite3_file 
1c4c0 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
1c4d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
1c4e0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
1c4f0 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   0;.}..#ifndef S
1c500 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
1c510 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73  ./*.** Object us
1c520 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
1c530 61 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  an shared memory
1c540 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a   buffer.  .**.**
1c550 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74   When multiple t
1c560 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72  hreads all refer
1c570 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20 77 61  ence the same wa
1c580 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68 20 74 68  l-index, each th
1c590 72 65 61 64 0a 2a 2a 20 68 61 73 20 69 74 73 20  read.** has its 
1c5a0 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  own unixShm obje
1c5b0 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c  ct, but they all
1c5c0 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67   point to a sing
1c5d0 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f  le instance.** o
1c5e0 66 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f  f this unixShmNo
1c5f0 64 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f  de object.  In o
1c600 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68  ther words, each
1c610 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70   wal-index is op
1c620 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63  ened.** only onc
1c630 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a  e per process..*
1c640 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78 53 68  *.** Each unixSh
1c650 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
1c660 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73  connected to a s
1c670 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49  ingle unixInodeI
1c680 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57  nfo object..** W
1c690 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65  e could coalesce
1c6a0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 6e 74   this object int
1c6b0 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c  o unixInodeInfo,
1c6c0 20 62 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20   but that would 
1c6d0 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70  mean.** every op
1c6e0 65 6e 20 66 69 6c 65 20 74 68 61 74 20 64 6f 65  en file that doe
1c6f0 73 20 6e 6f 74 20 75 73 65 20 73 68 61 72 65 64  s not use shared
1c700 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65   memory (in othe
1c710 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a  r words, most.**
1c720 20 6f 70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75   open files) wou
1c730 6c 64 20 68 61 76 65 20 74 6f 20 63 61 72 72 79  ld have to carry
1c740 20 61 72 6f 75 6e 64 20 74 68 69 73 20 65 78 74   around this ext
1c750 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ra information. 
1c760 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49   So.** the unixI
1c770 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
1c780 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
1c790 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69 78 53  er to this unixS
1c7a0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a  hmNode object.**
1c7b0 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53 68 6d   and the unixShm
1c7c0 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63  Node object is c
1c7d0 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e  reated only when
1c7e0 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75   needed..**.** u
1c7f0 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  nixMutexHeld() m
1c800 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e  ust be true when
1c810 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73   creating or des
1c820 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20  troying.** this 
1c830 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20  object or while 
1c840 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
1c850 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
1c860 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20   fields:.**.**  
1c870 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54      nRef.**.** T
1c880 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1c890 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  lds are read-onl
1c8a0 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65  y after the obje
1c8b0 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a  ct is created:.*
1c8c0 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a  * .**      fid.*
1c8d0 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  *      zFilename
1c8e0 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e  .**.** Either un
1c8f0 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20  ixShmNode.mutex 
1c900 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20  must be held or 
1c910 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66  unixShmNode.nRef
1c920 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d  ==0 and.** unixM
1c930 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72  utexHeld() is tr
1c940 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20  ue when reading 
1c950 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f  or writing any o
1c960 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e  ther field.** in
1c970 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e   this structure.
1c980 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53  .*/.struct unixS
1c990 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49  hmNode {.  unixI
1c9a0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1c9b0 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f  ;     /* unixIno
1c9c0 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73  deInfo that owns
1c9d0 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a   this SHM node *
1c9e0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1c9f0 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f  x *mutex;      /
1ca00 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73  * Mutex to acces
1ca10 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  s this object */
1ca20 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
1ca30 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
1ca40 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61   Name of the mma
1ca50 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69  pped file */.  i
1ca60 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20  nt h;           
1ca70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
1ca80 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
1ca90 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67  r */.  int szReg
1caa0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
1cab0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61    /* Size of sha
1cac0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1cad0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  ns */.  int nReg
1cae0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
1caf0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72     /* Size of ar
1cb00 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  ray apRegion */.
1cb10 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f    char **apRegio
1cb20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
1cb30 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20  Array of mapped 
1cb40 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1cb50 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  gions */.  int n
1cb60 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
1cb70 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1cb80 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  of unixShm objec
1cb90 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
1cba0 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  his */.  unixShm
1cbb0 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
1cbc0 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53      /* All unixS
1cbd0 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
1cbe0 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
1cbf0 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
1cc00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1cc10 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
1cc20 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 61 70 70 69   read-only mappi
1cc30 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
1cc40 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65  ITE_DEBUG.  u8 e
1cc50 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
1cc60 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1cc70 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
1cc80 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73  s held */.  u8 s
1cc90 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
1cca0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1ccb0 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
1ccc0 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74  eld */.  u8 next
1ccd0 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20  ShmId;          
1cce0 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69      /* Next avai
1ccf0 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64  lable unixShm.id
1cd00 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
1cd10 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63  .};../*.** Struc
1cd20 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e  ture used intern
1cd30 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53  ally by this VFS
1cd40 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73   to record the s
1cd50 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70  tate of an.** op
1cd60 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  en shared memory
1cd70 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
1cd80 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1cd90 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74   fields are init
1cda0 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69  ialized when thi
1cdb0 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  s object is crea
1cdc0 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72  ted and.** are r
1cdd0 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66  ead-only thereaf
1cde0 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e  ter:.**.**    un
1cdf0 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20  ixShm.pFile.**  
1ce00 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a    unixShm.id.**.
1ce10 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65  ** All other fie
1ce20 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  lds are read/wri
1ce30 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d  te.  The unixShm
1ce40 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75  .pFile->mutex mu
1ce50 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
1ce60 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e  ile accessing an
1ce70 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65  y read/write fie
1ce80 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  lds..*/.struct u
1ce90 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53  nixShm {.  unixS
1cea0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1ceb0 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  ;     /* The und
1cec0 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e  erlying unixShmN
1ced0 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ode object */.  
1cee0 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20  unixShm *pNext; 
1cef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1cf00 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20  xt unixShm with 
1cf10 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d  the same unixShm
1cf20 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73  Node */.  u8 has
1cf30 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
1cf40 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1cf50 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78  holding the unix
1cf60 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
1cf70 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73  .  u16 sharedMas
1cf80 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
1cf90 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
1cfa0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
1cfb0 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20  u16 exclMask;   
1cfc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1cfd0 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
1cfe0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69  locks held */.#i
1cff0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1d000 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20  G.  u8 id;      
1d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d020 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e  * Id of this con
1d030 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69  nection within i
1d040 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  ts unixShmNode *
1d050 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
1d060 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65  ** Constants use
1d070 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f  d for locking.*/
1d080 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48  .#define UNIX_SH
1d090 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51  M_BASE   ((22+SQ
1d0a0 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a  LITE_SHM_NLOCK)*
1d0b0 34 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69  4)         /* fi
1d0c0 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f  rst lock byte */
1d0d0 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48  .#define UNIX_SH
1d0e0 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53  M_DMS    (UNIX_S
1d0f0 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53  HM_BASE+SQLITE_S
1d100 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65  HM_NLOCK)  /* de
1d110 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a  adman switch */.
1d120 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73  ./*.** Apply pos
1d130 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
1d140 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20  s for all bytes 
1d150 66 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67  from ofst throug
1d160 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a  h ofst+n-1..**.*
1d170 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66  * Locks block if
1d180 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61   the mask is exa
1d190 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20  ctly UNIX_SHM_C 
1d1a0 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63  and are non-bloc
1d1b0 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73  king.** otherwis
1d1c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1d1d0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
1d1e0 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  ck(.  unixShmNod
1d1f0 65 20 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20  e *pShmNode, /* 
1d200 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74  Apply locks to t
1d210 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d  his open shared-
1d220 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a  memory segment *
1d230 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  /.  int lockType
1d240 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f  ,          /* F_
1d250 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20  UNLCK, F_RDLCK, 
1d260 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  or F_WRLCK */.  
1d270 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
1d280 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1d290 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b  byte of the lock
1d2a0 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69  ing range */.  i
1d2b0 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20 20 20  nt n            
1d2c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d2d0 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
1d2e0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
1d2f0 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f  flock f;       /
1d300 2a 20 54 68 65 20 70 6f 73 69 78 20 61 64 76 69  * The posix advi
1d310 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72  sory locking str
1d320 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
1d330 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1d340 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1d350 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f   form fcntl() */
1d360 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f  ..  /* Access to
1d370 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
1d380 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61   object is seria
1d390 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c  lized by the cal
1d3a0 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ler */.  assert(
1d3b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1d3c0 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  eld(pShmNode->mu
1d3d0 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  tex) || pShmNode
1d3e0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
1d3f0 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20  /* Shared locks 
1d400 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20  never span more 
1d410 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f  than one byte */
1d420 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
1d430 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52  || lockType!=F_R
1d440 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  DLCK );..  /* Lo
1d450 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72  cks are within r
1d460 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ange */.  assert
1d470 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49  ( n>=1 && n<SQLI
1d480 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
1d490 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
1d4a0 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  >h>=0 ){.    /* 
1d4b0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
1d4c0 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
1d4d0 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  s */.    memset(
1d4e0 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29  &f, 0, sizeof(f)
1d4f0 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20  );.    f.l_type 
1d500 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20  = lockType;.    
1d510 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  f.l_whence = SEE
1d520 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73  K_SET;.    f.l_s
1d530 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20  tart = ofst;.   
1d540 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20   f.l_len = n;.. 
1d550 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
1d560 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53  pShmNode->h, F_S
1d570 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72  ETLK, &f);.    r
1d580 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f  c = (rc!=(-1)) ?
1d590 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
1d5a0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
1d5b0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 67   /* Update the g
1d5c0 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  lobal lock state
1d5d0 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72   and do debug tr
1d5e0 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20  acing */.#ifdef 
1d5f0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
1d600 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54   u16 mask;.  OST
1d610 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
1d620 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 31  "));.  mask = (1
1d630 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
1d640 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72  <<ofst);.  if( r
1d650 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d660 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
1d670 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
1d680 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
1d690 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
1d6a0 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
1d6b0 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20  de->exclMask &= 
1d6c0 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68  ~mask;.      pSh
1d6d0 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
1d6e0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
1d6f0 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
1d700 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
1d710 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
1d720 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ead-lock %d ok",
1d730 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
1d740 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
1d750 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
1d760 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
1d770 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
1d780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d790 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
1d7a0 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
1d7b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
1d7c0 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ite-lock %d ok",
1d7d0 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
1d7e0 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
1d7f0 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
1d800 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
1d810 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
1d820 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d830 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
1d840 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
1d850 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f    OSTRACE(("unlo
1d860 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f  ck %d failed", o
1d870 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  fst));.    }else
1d880 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
1d890 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
1d8a0 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c  OSTRACE(("read-l
1d8b0 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20  ock failed"));. 
1d8c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d8d0 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
1d8e0 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
1d8f0 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
1d900 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  te-lock %d faile
1d910 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
1d920 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
1d930 28 22 20 2d 20 61 66 74 65 72 77 61 72 64 73 20  (" - afterwards 
1d940 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20  %03x,%03x\n",.  
1d950 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
1d960 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  e->sharedMask, p
1d970 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
1d980 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  k));.  }.#endif.
1d990 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20  .  return rc;   
1d9a0 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20       .}.../*.** 
1d9b0 50 75 72 67 65 20 74 68 65 20 75 6e 69 78 53 68  Purge the unixSh
1d9c0 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f  mNodeList list o
1d9d0 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69  f all entries wi
1d9e0 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e  th unixShmNode.n
1d9f0 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  Ref==0..**.** Th
1da00 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20  is is not a VFS 
1da10 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
1da20 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74  thod; it is a ut
1da30 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63  ility function c
1da40 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20  alled.** by VFS 
1da50 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
1da60 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
1da70 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72   void unixShmPur
1da80 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  ge(unixFile *pFd
1da90 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ){.  unixShmNode
1daa0 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64   *p = pFd->pInod
1dab0 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61  e->pShmNode;.  a
1dac0 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
1dad0 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20  Held() );.  if( 
1dae0 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20  p && p->nRef==0 
1daf0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1db00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e    assert( p->pIn
1db10 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65  ode==pFd->pInode
1db20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d   );.    if( p->m
1db30 75 74 65 78 20 29 20 73 71 6c 69 74 65 33 5f 6d  utex ) sqlite3_m
1db40 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74  utex_free(p->mut
1db50 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ex);.    for(i=0
1db60 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20  ; i<p->nRegion; 
1db70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
1db80 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  p->h>=0 ){.     
1db90 20 20 20 6d 75 6e 6d 61 70 28 70 2d 3e 61 70 52     munmap(p->apR
1dba0 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52  egion[i], p->szR
1dbb0 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65  egion);.      }e
1dbc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1dbd0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52  ite3_free(p->apR
1dbe0 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20  egion[i]);.     
1dbf0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1dc00 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52  ite3_free(p->apR
1dc10 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20  egion);.    if( 
1dc20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  p->h>=0 ){.     
1dc30 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
1dc40 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  d, p->h, __LINE_
1dc50 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d  _);.      p->h =
1dc60 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   -1;.    }.    p
1dc70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
1dc80 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  de = 0;.    sqli
1dc90 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
1dca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1dcb0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
1dcc0 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  rea associated w
1dcd0 69 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73  ith open databas
1dce0 65 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20 0a  e file pDbFd.  .
1dcf0 2a 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  ** This particul
1dd00 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ar implementatio
1dd10 6e 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66  n uses mmapped f
1dd20 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iles..**.** The 
1dd30 66 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70  file used to imp
1dd40 6c 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65  lement shared-me
1dd50 6d 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20 73  mory is in the s
1dd60 61 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  ame directory.**
1dd70 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74   as the open dat
1dd80 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 68  abase file and h
1dd90 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  as the same name
1dda0 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74   as the open dat
1ddb0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69  abase.** file wi
1ddc0 74 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73 75  th the "-shm" su
1ddd0 66 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f 72  ffix added.  For
1dde0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
1ddf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
1de00 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72  * is "/home/user
1de10 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68 65  1/config.db" the
1de20 6e 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  n the file that 
1de30 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6d  is created and m
1de40 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68  mapped.** for sh
1de50 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  ared memory will
1de60 20 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d   be called "/hom
1de70 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64  e/user1/config.d
1de80 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20  b-shm".  .**.** 
1de90 41 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63 68  Another approach
1dea0 20 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66 69   to is to use fi
1deb0 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20  les in /dev/shm 
1dec0 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61  or /dev/tmp or a
1ded0 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20  n.** some other 
1dee0 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74  tmpfs mount. But
1def0 20 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61 20   if a file in a 
1df00 64 69 66 66 65 72 65 6e 74 20 64 69 72 65 63 74  different direct
1df10 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ory.** from the 
1df20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1df30 20 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66 66   used, then diff
1df40 65 72 69 6e 67 20 61 63 63 65 73 73 20 70 65 72  ering access per
1df50 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61  missions.** or a
1df60 20 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20   chroot() might 
1df70 63 61 75 73 65 20 74 77 6f 20 64 69 66 66 65 72  cause two differ
1df80 65 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f 6e  ent processes on
1df90 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74   the same.** dat
1dfa0 61 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70 20  abase to end up 
1dfb0 75 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20  using different 
1dfc0 66 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65 64  files for shared
1dfd0 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65   memory - .** me
1dfe0 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69 72  aning that their
1dff0 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f   memory would no
1e000 74 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61 72  t really be shar
1e010 65 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a  ed - resulting.*
1e020 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f  * in database co
1e030 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72  rruption.  Never
1e040 74 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74 6d  theless, this tm
1e050 70 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a 2a  pfs file usage.*
1e060 2a 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64  * can be enabled
1e070 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1e080 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
1e090 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f  SHM_DIRECTORY="/
1e0a0 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74  dev/shm".** or t
1e0b0 68 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  he equivalent.  
1e0c0 54 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 53  The use of the S
1e0d0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
1e0e0 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ORY compile-time
1e0f0 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c  .** option resul
1e100 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61  ts in an incompa
1e110 74 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53  tible build of S
1e120 51 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f  QLite;  builds o
1e130 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74  f SQLite.** that
1e140 20 77 69 74 68 20 64 69 66 66 65 72 69 6e 67 20   with differing 
1e150 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
1e160 54 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61 74  TORY settings at
1e170 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65  tempt to use the
1e180 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61 73  .** same databas
1e190 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
1e1a0 6d 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61 73  me time, databas
1e1b0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c  e corruption wil
1e1c0 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
1e1d0 6c 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f 53  lt. The SQLITE_S
1e1e0 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d  HM_DIRECTORY com
1e1f0 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
1e200 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a   is considered.*
1e210 2a 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22 20  * "unsupported" 
1e220 61 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79 20  and may go away 
1e230 69 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c 69  in a future SQLi
1e240 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a  te release..**.*
1e250 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
1e260 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f   new shared-memo
1e270 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f  ry file, if no o
1e280 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f  ther instances o
1e290 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61  f that.** file a
1e2a0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  re currently ope
1e2b0 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  n, in this proce
1e2c0 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70  ss or in other p
1e2d0 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a  rocesses, then.*
1e2e0 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20  * the file must 
1e2f0 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
1e300 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68  zero length or h
1e310 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63  ave its header c
1e320 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  leared..**.** If
1e330 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
1e340 74 61 62 61 73 65 20 66 69 6c 65 20 28 70 44 62  tabase file (pDb
1e350 46 64 29 20 69 73 20 75 73 69 6e 67 20 74 68 65  Fd) is using the
1e360 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46 53   "unix-excl" VFS
1e370 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74  .** that means t
1e380 68 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  hat an exclusive
1e390 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
1e3a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e3b0 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e  le and.** that n
1e3c0 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  o other processe
1e3d0 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 65  s are able to re
1e3e0 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20  ad or write the 
1e3f0 64 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a  database.  In.**
1e400 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 64   that case, we d
1e410 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65  o not really nee
1e420 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  d shared memory.
1e430 20 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f    No shared memo
1e440 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63 72  ry.** file is cr
1e450 65 61 74 65 64 2e 20 20 54 68 65 20 73 68 61 72  eated.  The shar
1e460 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62  ed memory will b
1e470 65 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74 68  e simulated with
1e480 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f   heap memory..*/
1e490 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1e4a0 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
1e4b0 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64  (unixFile *pDbFd
1e4c0 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  ){.  struct unix
1e4d0 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20  Shm *p = 0;     
1e4e0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
1e4f0 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65  ection to be ope
1e500 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
1e510 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
1e520 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20  mNode;   /* The 
1e530 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70  underlying mmapp
1e540 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
1e550 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1e560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e570 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
1e580 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
1e590 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  pInode;         
1e5a0 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66   /* The inode of
1e5b0 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
1e5c0 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  ShmFilename;    
1e5d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1e5e0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73 65   of the file use
1e5f0 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69  d for SHM */.  i
1e600 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b  nt nShmFilename;
1e610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e620 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48  * Size of the SH
1e630 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79  M filename in by
1e640 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  tes */..  /* All
1e650 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
1e660 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20  the new unixShm 
1e670 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d  object. */.  p =
1e680 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1e690 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
1e6a0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1e6b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1e6c0 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
1e6d0 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61  sizeof(*p));.  a
1e6e0 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53  ssert( pDbFd->pS
1e6f0 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  hm==0 );..  /* C
1e700 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
1e710 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1e720 65 63 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  ect already exis
1e730 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78 69  ts. Reuse an exi
1e740 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69  sting.  ** one i
1e750 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61 74  f present. Creat
1e760 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
1e770 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
1e780 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
1e790 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 44  );.  pInode = pD
1e7a0 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70  bFd->pInode;.  p
1e7b0 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65  ShmNode = pInode
1e7c0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66  ->pShmNode;.  if
1e7d0 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b  ( pShmNode==0 ){
1e7e0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1e7f0 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
1e800 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61 74          /* fstat
1e810 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74 61  () info for data
1e820 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
1e830 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74 28    /* Call fstat(
1e840 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  ) to figure out 
1e850 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
1e860 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1e870 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20  file. If.    ** 
1e880 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65  a new *-shm file
1e890 20 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e 20   is created, an 
1e8a0 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65 20  attempt will be 
1e8b0 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65 20 69  made to create i
1e8c0 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  t.    ** with th
1e8d0 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f  e same permissio
1e8e0 6e 73 2e 20 54 68 65 20 61 63 74 75 61 6c 20 70  ns. The actual p
1e8f0 65 72 6d 69 73 73 69 6f 6e 73 20 74 68 65 20 66  ermissions the f
1e900 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 20  ile is created. 
1e910 20 20 20 2a 2a 20 77 69 74 68 20 61 72 65 20 73     ** with are s
1e920 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 63 75  ubject to the cu
1e930 72 72 65 6e 74 20 75 6d 61 73 6b 20 73 65 74 74  rrent umask sett
1e940 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
1e950 69 66 28 20 6f 73 46 73 74 61 74 28 70 44 62 46  if( osFstat(pDbF
1e960 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 26 26  d->h, &sStat) &&
1e970 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
1e980 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  sLock==0 ){.    
1e990 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1e9a0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20  ERR_FSTAT;.     
1e9b0 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
1e9c0 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  rr;.    }..#ifde
1e9d0 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
1e9e0 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46  ECTORY.    nShmF
1e9f0 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66  ilename = sizeof
1ea00 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45  (SQLITE_SHM_DIRE
1ea10 43 54 4f 52 59 29 20 2b 20 33 30 3b 0a 23 65 6c  CTORY) + 30;.#el
1ea20 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e  se.    nShmFilen
1ea30 61 6d 65 20 3d 20 35 20 2b 20 28 69 6e 74 29 73  ame = 5 + (int)s
1ea40 74 72 6c 65 6e 28 70 44 62 46 64 2d 3e 7a 50 61  trlen(pDbFd->zPa
1ea50 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  th);.#endif.    
1ea60 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74  pShmNode = sqlit
1ea70 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
1ea80 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
1ea90 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20  ShmFilename );. 
1eaa0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d     if( pShmNode=
1eab0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1eac0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1ead0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
1eae0 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20  en_err;.    }.  
1eaf0 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64    memset(pShmNod
1eb00 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53  e, 0, sizeof(*pS
1eb10 68 6d 4e 6f 64 65 29 29 3b 0a 20 20 20 20 7a 53  hmNode));.    zS
1eb20 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68  hmFilename = pSh
1eb30 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
1eb40 20 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e   = (char*)&pShmN
1eb50 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53  ode[1];.#ifdef S
1eb60 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
1eb70 4f 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ORY.    sqlite3_
1eb80 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c  snprintf(nShmFil
1eb90 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e  ename, zShmFilen
1eba0 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ame, .          
1ebb0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1ebc0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
1ebd0 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d  "/sqlite-shm-%x-
1ebe0 25 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %x",.           
1ebf0 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29 73            (u32)s
1ec00 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33  Stat.st_ino, (u3
1ec10 32 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b  2)sStat.st_dev);
1ec20 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74  .#else.    sqlit
1ec30 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d  e3_snprintf(nShm
1ec40 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69  Filename, zShmFi
1ec50 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22  lename, "%s-shm"
1ec60 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1ec70 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d  .#endif.    pShm
1ec80 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  Node->h = -1;.  
1ec90 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d    pDbFd->pInode-
1eca0 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
1ecb0 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  Node;.    pShmNo
1ecc0 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62  de->pInode = pDb
1ecd0 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20  Fd->pInode;.    
1ece0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
1ecf0 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
1ed00 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
1ed10 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66  EX_FAST);.    if
1ed20 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
1ed30 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
1ed40 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1ed50 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
1ed60 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
1ed70 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
1ed80 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
1ed90 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c   ){.      int fl
1eda0 61 67 73 20 3d 20 28 70 44 62 46 64 2d 3e 72 65  ags = (pDbFd->re
1edb0 61 64 4f 6e 6c 79 53 68 6d 20 3f 20 4f 5f 52 44  adOnlyShm ? O_RD
1edc0 4f 4e 4c 59 20 3a 20 4f 5f 52 44 57 52 7c 4f 5f  ONLY : O_RDWR|O_
1edd0 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 70 53  CREAT);.      pS
1ede0 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75  hmNode->h = robu
1edf0 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65  st_open(zShmFile
1ee00 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 28 73 53  name, flags, (sS
1ee10 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37  tat.st_mode & 07
1ee20 37 37 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  77));.      if( 
1ee30 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b  pShmNode->h<0 ){
1ee40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
1ee50 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1ee60 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
1ee70 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c   "open", zShmFil
1ee80 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
1ee90 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
1eea0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
1eeb0 20 70 53 68 6d 4e 6f 64 65 2d 3e 72 65 61 64 4f   pShmNode->readO
1eec0 6e 6c 79 20 3d 20 70 44 62 46 64 2d 3e 72 65 61  nly = pDbFd->rea
1eed0 64 4f 6e 6c 79 53 68 6d 3b 0a 20 20 0a 20 20 20  dOnlyShm;.  .   
1eee0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
1eef0 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72  ee if another pr
1ef00 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
1ef10 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77   the dead-man sw
1ef20 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49  itch..      ** I
1ef30 66 20 6e 6f 74 2c 20 7a 65 72 6f 20 74 68 65 20  f not, zero the 
1ef40 66 69 72 73 74 20 66 65 77 20 62 79 74 65 73 20  first few bytes 
1ef50 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  of the shared-me
1ef60 6d 6f 72 79 20 66 69 6c 65 20 74 6f 20 6d 61 6b  mory file to mak
1ef70 65 0a 20 20 20 20 20 20 2a 2a 20 73 75 72 65 20  e.      ** sure 
1ef80 69 74 20 69 73 20 6e 6f 74 20 6d 69 73 74 61 6b  it is not mistak
1ef90 65 6e 20 66 6f 72 20 76 61 6c 69 64 20 62 79 20  en for valid by 
1efa0 63 6f 64 65 20 69 6e 20 77 61 6c 2e 63 2e 20 45  code in wal.c. E
1efb0 78 63 65 70 74 2c 20 69 66 20 74 68 69 73 20 0a  xcept, if this .
1efc0 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65        ** is a re
1efd0 61 64 2d 6f 6e 6c 79 20 63 6f 6e 6e 65 63 74 69  ad-only connecti
1efe0 6f 6e 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  on to the shared
1eff0 2d 6d 65 6d 6f 72 79 20 74 68 65 6e 20 69 74 20  -memory then it 
1f000 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 0a  is not possible.
1f010 20 20 20 20 20 20 2a 2a 20 74 6f 20 63 68 65 63        ** to chec
1f020 6b 20 63 68 65 63 6b 20 69 66 20 61 6e 6f 74 68  k check if anoth
1f030 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
1f040 6c 64 69 6e 67 20 61 20 72 65 61 64 2d 6c 6f 63  lding a read-loc
1f050 6b 20 6f 6e 20 74 68 65 20 44 4d 53 0a 20 20 20  k on the DMS.   
1f060 20 20 20 2a 2a 20 62 79 74 65 2c 20 61 73 20 77     ** byte, as w
1f070 65 20 63 61 6e 6e 6f 74 20 61 74 74 65 6d 70 74  e cannot attempt
1f080 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 76 69   a write-lock vi
1f090 61 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69  a a read-only fi
1f0a0 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  le .      ** des
1f0b0 63 72 69 70 74 6f 72 2e 20 53 6f 20 69 6e 20 74  criptor. So in t
1f0c0 68 69 73 20 63 61 73 65 2c 20 77 65 20 6a 75 73  his case, we jus
1f0d0 74 20 61 73 73 75 6d 65 20 74 68 65 20 73 68 61  t assume the sha
1f0e0 72 65 64 2d 6d 65 6d 6f 72 79 20 0a 20 20 20 20  red-memory .    
1f0f0 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 72    ** contents ar
1f100 65 20 4f 6b 20 61 6e 64 20 70 72 6f 63 65 65 64  e Ok and proceed
1f110 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
1f120 70 53 68 6d 4e 6f 64 65 2d 3e 72 65 61 64 4f 6e  pShmNode->readOn
1f130 6c 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ly==0 ){.       
1f140 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1f150 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
1f160 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
1f170 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b  ShmNode, F_WRLCK
1f180 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20  , UNIX_SHM_DMS, 
1f190 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  1)==SQLITE_OK ){
1f1a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1f1b0 44 62 46 64 2d 3e 72 65 61 64 4f 6e 6c 79 53 68  DbFd->readOnlySh
1f1c0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  m ){.           
1f1d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
1f1e0 52 52 5f 53 48 4d 4f 50 45 4e 3b 0a 20 20 20 20  RR_SHMOPEN;.    
1f1f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1f200 34 21 3d 6f 73 57 72 69 74 65 28 70 53 68 6d 4e  4!=osWrite(pShmN
1f210 6f 64 65 2d 3e 68 2c 20 22 5c 30 30 5c 30 30 5c  ode->h, "\00\00\
1f220 30 30 5c 30 30 22 2c 20 34 29 20 29 7b 0a 20 20  00\00", 4) ){.  
1f230 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
1f240 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1f250 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
1f260 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a  , "ftruncate", z
1f270 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
1f280 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f290 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1f2a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f2b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f2c0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
1f2d0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44  k(pShmNode, F_RD
1f2e0 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  LCK, UNIX_SHM_DM
1f2f0 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  S, 1);.        }
1f300 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
1f310 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f  ) goto shm_open_
1f320 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
1f330 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
1f340 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
1f350 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 62 75  is read-only, bu
1f360 74 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52  t SQLITE_FCNTL_R
1f370 45 41 44 4f 4e 4c 59 5f 53 48 4d 20 68 61 73 20  EADONLY_SHM has 
1f380 6e 6f 74 0a 20 20 2a 2a 20 62 65 65 6e 20 73 65  not.  ** been se
1f390 74 20 66 6f 72 20 66 69 6c 65 2d 64 65 73 63 72  t for file-descr
1f3a0 69 70 74 6f 72 20 70 44 62 46 64 2c 20 72 65 74  iptor pDbFd, ret
1f3b0 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 20 54 68  urn an error. Th
1f3c0 65 20 77 61 6c 2e 63 20 6d 6f 64 75 6c 65 0a 20  e wal.c module. 
1f3d0 20 2a 2a 20 77 69 6c 6c 20 74 68 65 6e 20 63 61   ** will then ca
1f3e0 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
1f3f0 20 61 67 61 69 6e 20 77 69 74 68 20 53 51 4c 49   again with SQLI
1f400 54 45 5f 46 43 4e 54 4c 5f 52 45 41 44 4f 4e 4c  TE_FCNTL_READONL
1f410 59 5f 53 48 4d 20 73 65 74 2e 0a 20 20 2a 2f 0a  Y_SHM set..  */.
1f420 20 20 65 6c 73 65 20 69 66 28 20 70 53 68 6d 4e    else if( pShmN
1f430 6f 64 65 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  ode->readOnly &&
1f440 20 21 70 44 62 46 64 2d 3e 72 65 61 64 4f 6e 6c   !pDbFd->readOnl
1f450 79 53 68 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  yShm ){.    rc =
1f460 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
1f470 4d 4f 50 45 4e 3b 0a 20 20 20 20 67 6f 74 6f 20  MOPEN;.    goto 
1f480 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1f490 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
1f4a0 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
1f4b0 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75  a child of the u
1f4c0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
1f4d0 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
1f4e0 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53  hmNode;.#ifdef S
1f4f0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
1f500 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
1f510 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
1f520 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
1f530 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d  nRef++;.  pDbFd-
1f540 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69  >pShm = p;.  uni
1f550 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
1f560 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e    /* The referen
1f570 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d  ce count on pShm
1f580 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79  Node has already
1f590 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65   been incremente
1f5a0 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65  d under.  ** the
1f5b0 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75 6e   cover of the un
1f5c0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d  ixEnterMutex() m
1f5d0 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69  utex and the poi
1f5e0 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20  nter from the.  
1f5f0 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 75  ** new (struct u
1f600 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  nixShm) object t
1f610 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
1f620 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
1f630 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
1f640 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
1f650 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
1f660 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
1f670 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
1f680 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
1f690 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
1f6a0 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
1f6b0 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
1f6c0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a  ShmNode->mutex .
1f6d0 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f    ** mutex..  */
1f6e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1f6f0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
1f700 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e  >mutex);.  p->pN
1f710 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
1f720 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f  pFirst;.  pShmNo
1f730 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  de->pFirst = p;.
1f740 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1f750 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1f760 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1f770 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1f780 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61  * Jump here on a
1f790 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f  ny error */.shm_
1f7a0 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78  open_err:.  unix
1f7b0 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b  ShmPurge(pDbFd);
1f7c0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
1f7d0 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f  all frees pShmNo
1f7e0 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  de if required *
1f7f0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
1f800 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  (p);.  unixLeave
1f810 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
1f820 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1f830 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1f840 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
1f850 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65   a pointer to re
1f860 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20  gion iRegion of 
1f870 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d  the .** shared-m
1f880 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
1f890 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
1f8a0 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72  se file fd. Shar
1f8b0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1f8c0 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72  s .** are number
1f8d0 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ed starting from
1f8e0 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72   zero. Each shar
1f8f0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1f900 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a   is szRegion .**
1f910 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
1f920 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1f930 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
1f940 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1f950 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73  ned and *pp is s
1f960 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
1f970 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
1f980 74 68 65 20 62 45 78 74 65 6e 64 20 70 61 72 61  the bExtend para
1f990 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74  meter is 0 and t
1f9a0 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61  he requested sha
1f9b0 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65  red-memory.** re
1f9c0 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65  gion has not bee
1f9d0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20  n allocated (by 
1f9e0 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c  any client, incl
1f9f0 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e  uding one runnin
1fa00 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61  g in a.** separa
1fa10 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65  te process), the
1fa20 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  n *pp is set to 
1fa30 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
1fa40 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
1fa50 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20 6e  .** bExtend is n
1fa60 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20  on-zero and the 
1fa70 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
1fa80 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
1fa90 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62  as not yet .** b
1faa0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
1fab0 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  t is allocated b
1fac0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
1fad0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68  .**.** If the sh
1fae0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1faf0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
1fb00 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72  een allocated or
1fb10 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79   is allocated by
1fb20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73  .** this call as
1fb30 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
1fb40 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70  , then it is map
1fb50 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
1fb60 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72  ocesses .** addr
1fb70 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74  ess space (if it
1fb80 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29   is not already)
1fb90 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  , *pp is set to 
1fba0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70  point to the map
1fbb0 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  ped .** memory a
1fbc0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1fbd0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1fbe0 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70 28   int unixShmMap(
1fbf0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1fc00 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
1fc10 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65     /* Handle ope
1fc20 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  n on database fi
1fc30 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
1fc40 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
1fc50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f          /* Regio
1fc60 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f  n to retrieve */
1fc70 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c  .  int szRegion,
1fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc90 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
1fca0 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62  gions */.  int b
1fcb0 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20 20  Extend,         
1fcc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1fcd0 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c  ue to extend fil
1fce0 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  e if necessary *
1fcf0 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c  /.  void volatil
1fd00 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20  e **pp          
1fd10 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70      /* OUT: Mapp
1fd20 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
1fd30 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46    unixFile *pDbF
1fd40 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
1fd50 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b  d;.  unixShm *p;
1fd60 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
1fd70 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
1fd80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1fd90 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61  .  /* If the sha
1fda0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
1fdb0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1fdc0 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
1fdd0 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70   now. */.  if( p
1fde0 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b  DbFd->pShm==0 ){
1fdf0 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70  .    rc = unixOp
1fe00 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70  enSharedMemory(p
1fe10 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72  DbFd);.    if( r
1fe20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1fe30 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
1fe40 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
1fe50 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
1fe60 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71  ->pShmNode;.  sq
1fe70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1fe80 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1fe90 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  x);.  assert( sz
1fea0 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65  Region==pShmNode
1feb0 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53  ->szRegion || pS
1fec0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d  hmNode->nRegion=
1fed0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1fee0 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
1fef0 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
1ff00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
1ff10 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70  mNode->h>=0 || p
1ff20 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
1ff30 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b  rocessLock==1 );
1ff40 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
1ff50 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46  ode->h<0 || pDbF
1ff60 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
1ff70 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  essLock==0 );.. 
1ff80 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
1ff90 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
1ffa0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70  ){.    char **ap
1ffb0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
1ffc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
1ffd0 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61   apRegion[] arra
1ffe0 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  y */.    int nBy
1fff0 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29  te = (iRegion+1)
20000 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d  *szRegion;  /* M
20010 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20  inimum required 
20020 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
20030 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
20040 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
20050 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66      /* Used by f
20060 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70  stat() */..    p
20070 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
20080 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20  n = szRegion;.. 
20090 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
200a0 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  >h>=0 ){.      /
200b0 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
200c0 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61  region is not ma
200d0 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
200e0 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
200f0 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a   space..      **
20100 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
20110 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
20120 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
20130 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
20140 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c  le is.      ** l
20150 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63  arge enough to c
20160 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65  ontain the reque
20170 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20  sted region)..  
20180 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
20190 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64   osFstat(pShmNod
201a0 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b  e->h, &sStat) ){
201b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
201c0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
201d0 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ZE;.        goto
201e0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
201f0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69      }.  .      i
20200 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  f( sStat.st_size
20210 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  <nByte ){.      
20220 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
20230 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
20240 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
20250 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20 73   If bExtend is s
20260 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  et to.        **
20270 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72   false, exit ear
20280 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20  ly. *pp will be 
20290 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
202a0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
202b0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ed..        **. 
202c0 20 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e         ** Altern
202d0 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74  atively, if bExt
202e0 65 6e 64 20 69 73 20 74 72 75 65 2c 20 75 73 65  end is true, use
202f0 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20   ftruncate() to 
20300 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 20  allocate.       
20310 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65   ** the requeste
20320 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e  d memory region.
20330 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
20340 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e 64      if( !bExtend
20350 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f   ) goto shmpage_
20360 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  out;.        if(
20370 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
20380 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 6e  e(pShmNode->h, n
20390 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Byte) ){.       
203a0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
203b0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
203c0 52 5f 53 48 4d 53 49 5a 45 2c 20 22 66 74 72 75  R_SHMSIZE, "ftru
203d0 6e 63 61 74 65 22 2c 0a 20 20 20 20 20 20 20 20  ncate",.        
203e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203f0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46      pShmNode->zF
20400 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
20410 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
20420 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
20430 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
20440 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65     /* Map the re
20450 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
20460 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20  egion into this 
20470 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
20480 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20  s space. */.    
20490 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 2a  apNew = (char **
204a0 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
204b0 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  (.        pShmNo
204c0 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 28 69  de->apRegion, (i
204d0 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66  Region+1)*sizeof
204e0 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b 0a  (char *).    );.
204f0 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29      if( !apNew )
20500 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
20510 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
20520 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
20530 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
20540 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
20550 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20  egion = apNew;. 
20560 20 20 20 77 68 69 6c 65 28 70 53 68 6d 4e 6f 64     while(pShmNod
20570 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
20580 69 6f 6e 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  ion){.      void
20590 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66   *pMem;.      if
205a0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
205b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
205c0 20 3d 20 6d 6d 61 70 28 30 2c 20 73 7a 52 65 67   = mmap(0, szReg
205d0 69 6f 6e 2c 20 50 52 4f 54 5f 52 45 41 44 7c 28  ion, PROT_READ|(
205e0 21 70 53 68 6d 4e 6f 64 65 2d 3e 72 65 61 64 4f  !pShmNode->readO
205f0 6e 6c 79 3f 50 52 4f 54 5f 57 52 49 54 45 3a 30  nly?PROT_WRITE:0
20600 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ), .            
20610 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d  MAP_SHARED, pShm
20620 4e 6f 64 65 2d 3e 68 2c 20 70 53 68 6d 4e 6f 64  Node->h, pShmNod
20630 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67  e->nRegion*szReg
20640 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ion.        );. 
20650 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d         if( pMem=
20660 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
20670 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
20680 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
20690 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20  E_IOERR_SHMMAP, 
206a0 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65  "mmap", pShmNode
206b0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
206c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
206d0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
206e0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
206f0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
20700 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
20710 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  zRegion);.      
20720 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b    if( pMem==0 ){
20730 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
20740 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
20750 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
20760 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
20770 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73    }.        mems
20780 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65  et(pMem, 0, szRe
20790 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gion);.      }. 
207a0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
207b0 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  pRegion[pShmNode
207c0 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d 20 70 4d 65  ->nRegion] = pMe
207d0 6d 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  m;.      pShmNod
207e0 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20  e->nRegion++;.  
207f0 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65    }.  }..shmpage
20800 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d  _out:.  if( pShm
20810 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52  Node->nRegion>iR
20820 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70  egion ){.    *pp
20830 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52   = pShmNode->apR
20840 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a  egion[iRegion];.
20850 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
20860 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
20870 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
20880 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
20890 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
208a0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
208b0 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
208c0 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
208d0 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  y segment..**.**
208e0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72   Note that the r
208f0 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
20900 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45  een SHAREd and E
20910 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69  XCLUSIVE locks i
20920 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69  s a little.** di
20930 66 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61  fferent here tha
20940 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20  n in posix.  In 
20950 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20  xShmLock(), one 
20960 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f  can go from unlo
20970 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65  cked.** to share
20980 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72  d and back or fr
20990 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65  om unlocked to e
209a0 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63  xclusive and bac
209b0 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a  k.  But one may.
209c0 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73  ** not go from s
209d0 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69  hared to exclusi
209e0 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75  ve or from exclu
209f0 73 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a  sive to shared..
20a00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
20a10 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  ixShmLock(.  sql
20a20 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
20a30 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
20a40 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
20a50 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
20a60 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  ry */.  int ofst
20a70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20a80 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b     /* First lock
20a90 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
20aa0 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
20ab0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
20ac0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20ad0 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71   of locks to acq
20ae0 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
20af0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
20b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b10 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
20b20 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29  th the lock */.)
20b30 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
20b40 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
20b50 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  )fd;      /* Con
20b60 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20  nection holding 
20b70 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
20b80 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20  .  unixShm *p = 
20b90 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20  pDbFd->pShm;    
20ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20bb0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65  shared memory be
20bc0 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  ing locked */.  
20bd0 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20  unixShm *pX;    
20be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bf0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
20c00 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
20c10 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78  blings */.  unix
20c20 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
20c30 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
20c40 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
20c50 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a  ing file iNode *
20c60 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
20c70 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
20c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
20c90 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  ult code */.  u1
20ca0 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  6 mask;         
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cc0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c      /* Mask of l
20cd0 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20  ocks to take or 
20ce0 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73  release */..  as
20cf0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d  sert( pShmNode==
20d00 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
20d10 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73  ShmNode );.  ass
20d20 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
20d30 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
20d40 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
20d50 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73  ( ofst>=0 && ofs
20d60 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  t+n<=SQLITE_SHM_
20d70 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  NLOCK );.  asser
20d80 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73  t( n>=1 );.  ass
20d90 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c  ert( flags==(SQL
20da0 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
20db0 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
20dc0 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
20dd0 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
20de0 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
20df0 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20  _EXCLUSIVE).    
20e00 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
20e10 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
20e20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
20e30 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
20e40 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
20e50 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
20e60 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
20e70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   );.  assert( n=
20e80 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  =1 || (flags & S
20e90 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
20ea0 49 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  IVE)!=0 );.  ass
20eb0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
20ec0 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
20ed0 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
20ee0 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
20ef0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
20f00 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
20f10 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
20f20 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20  =0 );..  mask = 
20f30 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20  (1<<(ofst+n)) - 
20f40 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73  (1<<ofst);.  ass
20f50 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b  ert( n>1 || mask
20f60 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20  ==(1<<ofst) );. 
20f70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
20f80 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
20f90 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
20fa0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
20fb0 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
20fc0 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
20fd0 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
20fe0 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
20ff0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
21000 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
21010 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
21020 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
21030 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
21040 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
21050 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
21060 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
21070 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
21080 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
21090 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
210a0 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
210b0 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
210c0 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
210d0 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
210e0 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
210f0 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
21100 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
21110 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
21120 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
21130 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
21140 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43  pShmNode, F_UNLC
21150 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
21160 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
21170 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
21180 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
21190 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
211a0 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
211b0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
211c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
211d0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
211e0 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
211f0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
21200 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65  ask;.    } .  }e
21210 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
21220 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
21230 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
21240 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
21250 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
21260 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
21270 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
21280 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
21290 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
212a0 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
212b0 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
212c0 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
212d0 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
212e0 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
212f0 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
21300 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
21310 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
21320 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
21330 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
21340 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
21350 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
21360 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
21370 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
21380 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
21390 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
213a0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
213b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
213c0 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
213d0 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
213e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
213f0 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
21400 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
21410 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
21420 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
21430 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21440 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
21450 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
21460 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
21470 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
21480 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c  (pShmNode, F_RDL
21490 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
214a0 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
214b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
214c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
214d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
214e0 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c      /* Get the l
214f0 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b  ocal shared lock
21500 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
21510 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21520 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
21530 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d  k |= mask;.    }
21540 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
21550 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69   Make sure no si
21560 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
21570 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61  s hold locks tha
21580 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69  t will block thi
21590 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20  s.    ** lock.  
215a0 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72  If any do, retur
215b0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69  n SQLITE_BUSY ri
215c0 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f  ght away..    */
215d0 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
215e0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
215f0 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
21600 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
21610 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
21620 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72  !=0 || (pX->shar
21630 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  edMask & mask)!=
21640 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
21650 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
21660 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21670 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
21680 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78     /* Get the ex
21690 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74  clusive locks at
216a0 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
216b0 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63  l.  Then if succ
216c0 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c  essful.    ** al
216d0 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61  so mark the loca
216e0 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20  l connection as 
216f0 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20  being locked..  
21700 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
21710 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21720 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
21730 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
21740 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66  ode, F_WRLCK, of
21750 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
21760 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
21770 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21780 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
21790 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20   (p->sharedMask 
217a0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20  & mask)==0 );.  
217b0 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
217c0 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
217d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
217e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
217f0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
21800 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
21810 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d  "SHM-LOCK shmid-
21820 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25  %d, pid-%d got %
21830 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20  03x,%03x\n",.   
21840 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67          p->id, g
21850 65 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61 72  etpid(), p->shar
21860 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d  edMask, p->exclM
21870 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ask));.  return 
21880 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
21890 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20  lement a memory 
218a0 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72  barrier or memor
218b0 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65  y fence on share
218c0 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a  d memory.  .**.*
218d0 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20  * All loads and 
218e0 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66  stores begun bef
218f0 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20  ore the barrier 
21900 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  must complete be
21910 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64  fore.** any load
21920 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20   or store begun 
21930 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65  after the barrie
21940 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
21950 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72  d unixShmBarrier
21960 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
21970 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 20 20   *fd            
21980 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
21990 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
219a0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
219b0 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  /.){.  UNUSED_PA
219c0 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 75  RAMETER(fd);.  u
219d0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
219e0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
219f0 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  x();.}../*.** Cl
21a00 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ose a connection
21a10 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   to shared-memor
21a20 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75  y.  Delete the u
21a30 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74  nderlying .** st
21a40 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46  orage if deleteF
21a50 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lag is true..**.
21a60 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  ** If there is n
21a70 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  o shared memory 
21a80 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
21a90 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
21aa0 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
21ab0 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73  ine is a harmles
21ac0 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  s no-op..*/.stat
21ad0 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e  ic int unixShmUn
21ae0 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  map(.  sqlite3_f
21af0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
21b00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
21b10 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
21b20 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
21b30 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20  deleteFlag      
21b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
21b50 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d  elete shared-mem
21b60 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ory if true */.)
21b70 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20  {.  unixShm *p; 
21b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b90 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
21ba0 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73  ction to be clos
21bb0 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  ed */.  unixShmN
21bc0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
21bd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
21be0 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
21bf0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
21c00 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20    unixShm **pp; 
21c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
21c30 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f   over sibling co
21c40 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75  nnections */.  u
21c50 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  nixFile *pDbFd; 
21c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21c70 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
21c80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
21c90 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e  /..  pDbFd = (un
21ca0 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  ixFile*)fd;.  p 
21cb0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
21cc0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
21cd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
21ce0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
21cf0 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72  hmNode;..  asser
21d00 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
21d10 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
21d20 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
21d30 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
21d40 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
21d50 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  e );..  /* Remov
21d60 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66  e connection p f
21d70 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63  rom the set of c
21d80 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63  onnections assoc
21d90 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20  iated.  ** with 
21da0 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71  pShmNode */.  sq
21db0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
21dc0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
21dd0 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53  x);.  for(pp=&pS
21de0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
21df0 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26  (*pp)!=p; pp = &
21e00 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a  (*pp)->pNext){}.
21e10 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
21e20 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65  ;..  /* Free the
21e30 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f   connection p */
21e40 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
21e50 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  p);.  pDbFd->pSh
21e60 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  m = 0;.  sqlite3
21e70 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
21e80 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a  mNode->mutex);..
21e90 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65    /* If pShmNode
21ea0 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68  ->nRef has reach
21eb0 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ed 0, then close
21ec0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
21ed0 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f    ** shared-memo
21ee0 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a  ry file, too */.
21ef0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
21f00 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ();.  assert( pS
21f10 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29  hmNode->nRef>0 )
21f20 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ;.  pShmNode->nR
21f30 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d  ef--;.  if( pShm
21f40 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Node->nRef==0 ){
21f50 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46  .    if( deleteF
21f60 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d  lag && pShmNode-
21f70 3e 68 3e 3d 30 20 29 20 75 6e 6c 69 6e 6b 28 70  >h>=0 ) unlink(p
21f80 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
21f90 6d 65 29 3b 0a 20 20 20 20 75 6e 69 78 53 68 6d  me);.    unixShm
21fa0 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20  Purge(pDbFd);.  
21fb0 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
21fc0 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ex();..  return 
21fd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
21fe0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e  else.# define un
21ff0 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23  ixShmMap     0.#
22000 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c   define unixShmL
22010 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ock    0.# defin
22020 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72  e unixShmBarrier
22030 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
22040 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e  ShmUnmap   0.#en
22050 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
22060 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
22070 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e  /../*.** Here en
22080 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ds the implement
22090 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c  ation of all sql
220a0 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
220b0 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
220c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
220d0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65   sqlite3_file Me
220e0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
220f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22100 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
22110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22150 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ****/../*.** Thi
22160 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
22170 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  ins definitions 
22180 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  of sqlite3_io_me
22190 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68  thods objects th
221a0 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  at.** implement 
221b0 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63  various file loc
221c0 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e  king strategies.
221d0 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69    It also contai
221e0 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a  ns definitions.*
221f0 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75  * of "finder" fu
22200 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64  nctions.  A find
22210 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  er-function is u
22220 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  sed to locate th
22230 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  e appropriate.**
22240 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
22250 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61  ods object for a
22260 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
22270 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20  base file.  The 
22280 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c  pAppData.** fiel
22290 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  d of the sqlite3
222a0 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73  _vfs VFS objects
222b0 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
222c0 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20   to be pointers 
222d0 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  to.** the correc
222e0 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  t finder-functio
222f0 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a  n for that VFS..
22300 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65  **.** Most finde
22310 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  r functions retu
22320 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
22330 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f  a fixed sqlite3_
22340 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
22350 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20  ject.  The only 
22360 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64  interesting find
22370 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  er-function is a
22380 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c  utolockIoFinder,
22390 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20   which.** looks 
223a0 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  at the filesyste
223b0 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73  m type and tries
223c0 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65   to guess the be
223d0 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  st locking.** st
223e0 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74  rategy from that
223f0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64  ..**.** For find
22400 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77  er-funtion F, tw
22410 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72  o objects are cr
22420 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eated:.**.**    
22430 28 31 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e  (1) The real fin
22440 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der-function nam
22450 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a  ed "FImpt()"..**
22460 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e  .**    (2) A con
22470 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f  stant pointer to
22480 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   this function n
22490 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a  amed just "F"..*
224a0 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  *.**.** A pointe
224b0 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74  r to the F point
224c0 65 72 20 69 73 20 75 73 65 64 20 61 73 20 74 68  er is used as th
224d0 65 20 70 41 70 70 44 61 74 61 20 76 61 6c 75 65  e pAppData value
224e0 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65   for VFS.** obje
224f0 63 74 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f  cts.  We have to
22500 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64   do this instead
22510 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70   of letting pApp
22520 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69  Data point.** di
22530 72 65 63 74 6c 79 20 61 74 20 74 68 65 20 66 69  rectly at the fi
22540 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69  nder-function si
22550 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20 70 72  nce C90 rules pr
22560 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a  event a void*.**
22570 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e   from be cast in
22580 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f  to a function po
22590 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  inter..**.**.** 
225a0 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
225b0 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65   this macro gene
225c0 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74  rates two object
225d0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20  s:.**.**   *  A 
225e0 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33  constant sqlite3
225f0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
22600 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74  ct call METHOD t
22610 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a  hat has locking.
22620 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20  **      methods 
22630 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c  CLOSE, LOCK, UNL
22640 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a  OCK, CKRESLOCK..
22650 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f  **.**   *  An I/
22660 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20  O method finder 
22670 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
22680 46 49 4e 44 45 52 20 74 68 61 74 20 72 65 74 75  FINDER that retu
22690 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  rns a pointer.**
226a0 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54        to the MET
226b0 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  HOD object in th
226c0 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65  e previous bulle
226d0 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f  t..*/.#define IO
226e0 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 20  METHODS(FINDER, 
226f0 4d 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c  METHOD, VERSION,
22700 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e   CLOSE, LOCK, UN
22710 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20  LOCK, CKLOCK)   
22720 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
22730 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
22740 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20  hods METHOD = { 
22750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22770 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20    \.   VERSION, 
22780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22790 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
227a0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227c0 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20   \.   CLOSE,    
227d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227e0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20    /* xClose */  
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 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20  \.   unixRead,  
22820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22830 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20   /* xRead */    
22840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
22860 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20  .   unixWrite,  
22870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22880 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20  /* xWrite */    
22890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
228b0 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c     unixTruncate,
228c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
228d0 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20  * xTruncate */  
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 5c 0a 20               \. 
22900 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20    unixSync,     
22910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22920 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20   xSync */       
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 5c 0a 20 20              \.  
22950 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20   unixFileSize,  
22960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22970 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20  xFileSize */    
22980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22990 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
229a0 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
229b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
229c0 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
229d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229e0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55            \.   U
229f0 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20  NLOCK,          
22a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
22a10 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  nlock */        
22a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a30 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b           \.   CK
22a40 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
22a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68            /* xCh
22a60 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
22a70 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
22a80 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
22a90 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20  xFileControl,   
22aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
22ab0 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20  eControl */     
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ad0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
22ae0 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20  SectorSize,     
22af0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
22b00 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20  orSize */       
22b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44        \.   unixD
22b30 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
22b40 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63  tics,  /* xDevic
22b50 65 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f  eCapabilities */
22b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b70 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
22b80 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mMap,           
22b90 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
22ba0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
22bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bc0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
22bd0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
22be0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
22bf0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
22c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c10 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42     \.   unixShmB
22c20 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20  arrier,         
22c30 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
22c40 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  er */           
22c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c60 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e    \.   unixShmUn
22c70 6d 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20  map             
22c80 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20     /* xShmUnmap 
22c90 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
22ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cb0 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20   \.};           
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d00 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
22d10 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
22d20 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28  s *FINDER##Impl(
22d30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75  const char *z, u
22d40 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c  nixFile *p){   \
22d50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
22d60 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50  TER(z); UNUSED_P
22d70 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20  ARAMETER(p);    
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
22da0 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44    return &METHOD
22db0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e30 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
22e40 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
22e50 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
22e60 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63  *const FINDER)(c
22e70 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
22e80 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20  ile *p)    \.   
22e90 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b   = FINDER##Impl;
22ea0 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65  ../*.** Here are
22eb0 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69   all of the sqli
22ec0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
22ed0 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20  bjects for each 
22ee0 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e  of the.** lockin
22ef0 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46  g strategies.  F
22f00 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65  unctions that re
22f10 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  turn pointers to
22f20 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a   these methods.*
22f30 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74  * are also creat
22f40 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53  ed..*/.IOMETHODS
22f50 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65  (.  posixIoFinde
22f60 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
22f70 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
22f80 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78   name */.  posix
22f90 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
22fa0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
22fb0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
22fc0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20  t name */.  2,  
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fe0 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
22ff0 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c 65  memory is enable
23000 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65  d */.  unixClose
23010 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23020 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
23030 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c  d */.  unixLock,
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23050 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
23060 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b   */.  unixUnlock
23070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23080 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
23090 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b  d */.  unixCheck
230a0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
230b0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
230c0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
230d0 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
230e0 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  nolockIoFinder, 
230f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
23100 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
23110 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d  e */.  nolockIoM
23120 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
23130 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
23140 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
23150 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
23160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23170 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
23180 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
23190 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c  /.  nolockClose,
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
231b0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
231c0 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20  /.  nolockLock, 
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
231e0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
231f0 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  .  nolockUnlock,
23200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23210 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
23220 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52  /.  nolockCheckR
23230 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a  eservedLock   /*
23240 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
23250 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
23260 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74  IOMETHODS(.  dot
23270 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
23280 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
23290 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
232a0 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  /.  dotlockIoMet
232b0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  hods,         /*
232c0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
232d0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
232e0 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
232f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23300 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
23310 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
23320 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20   dotlockClose,  
23330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
23340 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
23350 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20   dotlockLock,   
23360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
23370 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
23380 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20  dotlockUnlock,  
23390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
233a0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
233b0 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73   dotlockCheckRes
233c0 65 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43  ervedLock  /* xC
233d0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
233e0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69   method */.)..#i
233f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
23400 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
23410 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d   !OS_VXWORKS.IOM
23420 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49  ETHODS(.  flockI
23430 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
23440 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
23450 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
23460 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c   flockIoMethods,
23470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
23480 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
23490 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
234a0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
234b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
234c0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
234d0 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c  disabled */.  fl
234e0 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
234f0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
23500 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  e method */.  fl
23510 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
23520 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
23530 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
23540 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
23550 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
23560 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  k method */.  fl
23570 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
23580 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63  Lock    /* xChec
23590 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
235a0 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
235b0 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
235c0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65  .IOMETHODS(.  se
235d0 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  mIoFinder,      
235e0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
235f0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
23600 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64  */.  semIoMethod
23610 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
23620 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
23630 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
23640 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
23650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23660 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
23670 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
23680 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20    semClose,     
23690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
236a0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
236b0 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20    semLock,      
236c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
236d0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
236e0 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   semUnlock,     
236f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
23700 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
23710 20 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76    semCheckReserv
23720 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78  edLock      /* x
23730 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
23740 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
23750 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
23760 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
23770 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
23780 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
23790 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69  THODS(.  afpIoFi
237a0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
237b0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
237c0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
237d0 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  afpIoMethods,   
237e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
237f0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
23800 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
23810 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
23820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
23830 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
23840 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70  isabled */.  afp
23850 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
23860 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
23870 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
23880 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
23890 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
238a0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55  method */.  afpU
238b0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
238c0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
238d0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
238e0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
238f0 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k      /* xCheck
23900 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
23910 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
23920 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  ./*.** The proxy
23930 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
23940 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68  is a "super-meth
23950 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65  od" in the sense
23960 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e   that it.** open
23970 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65  s secondary file
23980 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
23990 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c   the conch and l
239a0 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a  ock files and.**
239b0 20 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20   it uses proxy, 
239c0 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61  dot-file, AFP, a
239d0 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69  nd flock() locki
239e0 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  ng methods on th
239f0 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79  ose.** secondary
23a00 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69   files.  For thi
23a10 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69  s reason, the di
23a20 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c  vision that impl
23a30 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20  ements.** proxy 
23a40 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74  locking is locat
23a50 65 64 20 6d 75 63 68 20 66 75 72 74 68 65 72 20  ed much further 
23a60 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65  down in the file
23a70 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a  .  But we need.*
23a80 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e  * to go ahead an
23a90 64 20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c  d define the sql
23aa0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
23ab0 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  and finder funct
23ac0 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79  ion.** for proxy
23ad0 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20   locking here.  
23ae0 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64 65  So we forward de
23af0 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65  clare the I/O me
23b00 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65  thods..*/.#if de
23b10 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
23b20 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
23b30 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
23b40 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
23b50 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
23b60 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  le*);.static int
23b70 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74   proxyLock(sqlit
23b80 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
23b90 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
23ba0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
23bb0 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74  ile*, int);.stat
23bc0 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63  ic int proxyChec
23bd0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
23be0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
23bf0 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  *);.IOMETHODS(. 
23c00 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20   proxyIoFinder, 
23c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
23c20 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
23c30 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d  me */.  proxyIoM
23c40 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
23c50 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
23c60 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
23c70 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
23c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c90 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
23ca0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
23cb0 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c  */.  proxyClose,
23cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23cd0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
23ce0 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20  */.  proxyLock, 
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23d00 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
23d10 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c  /.  proxyUnlock,
23d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23d30 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
23d40 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52  */.  proxyCheckR
23d50 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f  eservedLock    /
23d60 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
23d70 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
23d80 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20  .#endif../* nfs 
23d90 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e  lockd on OSX 10.
23da0 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72  3+ doesn't clear
23db0 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65   write locks whe
23dc0 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
23dd0 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69   set */.#if defi
23de0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
23df0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
23e00 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
23e10 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f  METHODS(.  nfsIo
23e20 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
23e30 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
23e40 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
23e50 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c  .  nfsIoMethods,
23e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23e70 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
23e80 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
23e90 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23eb0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
23ec0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
23ed0 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20    unixClose,    
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23ef0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
23f00 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20  .  unixLock,    
23f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23f20 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
23f30 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20  .  nfsUnlock,   
23f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23f50 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
23f60 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65  */.  unixCheckRe
23f70 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20  servedLock      
23f80 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
23f90 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
23fa0 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  ).#endif..#if de
23fb0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
23fc0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
23fd0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
23fe0 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e  /* .** This "fin
23ff0 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74  der" function at
24000 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d  tempts to determ
24010 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ine the best loc
24020 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a  king strategy .*
24030 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  * for the databa
24040 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74  se file "filePat
24050 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74  h".  It then ret
24060 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  urns the sqlite3
24070 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
24080 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
24090 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74  ments that strat
240a0 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  egy..**.** This 
240b0 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e  is for MacOSX on
240c0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly..*/.static co
240d0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
240e0 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b  ethods *autolock
240f0 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20  IoFinderImpl(.  
24100 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
24110 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65  Path,    /* name
24120 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
24130 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
24140 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20  ile *pNew       
24150 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65      /* open file
24160 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
24170 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
24180 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  .){.  static con
24190 73 74 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e  st struct Mappin
241a0 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  g {.    const ch
241b0 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b  ar *zFilesystem;
241c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
241d0 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   Filesystem type
241e0 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e   name */.    con
241f0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
24200 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b  thods *pMethods;
24210 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74     /* Appropriat
24220 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
24230 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d   */.  } aMap[] =
24240 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20   {.    { "hfs", 
24250 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
24260 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73  ds },.    { "ufs
24270 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65  ",    &posixIoMe
24280 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
24290 61 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d  afpfs",  &afpIoM
242a0 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
242b0 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f  "smbfs",  &afpIo
242c0 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
242d0 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f   "webdav", &nolo
242e0 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ckIoMethods },. 
242f0 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b     { 0, 0 }.  };
24300 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
24310 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f  ct statfs fsInfo
24320 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
24330 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66   lockInfo;..  if
24340 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20  ( !filePath ){. 
24350 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74     /* If filePat
24360 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  h==NULL that mea
24370 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
24380 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65  g with a transie
24390 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74  nt file.    ** t
243a0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
243b0 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20  d to be locked. 
243c0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e  */.    return &n
243d0 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
243e0 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73    }.  if( statfs
243f0 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e  (filePath, &fsIn
24400 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) != -1 ){.   
24410 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c   if( fsInfo.f_fl
24420 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59  ags & MNT_RDONLY
24430 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
24440 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
24450 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  s;.    }.    for
24460 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46  (i=0; aMap[i].zF
24470 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b  ilesystem; i++){
24480 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
24490 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
244a0 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a  ename, aMap[i].z
244b0 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29  Filesystem)==0 )
244c0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
244d0 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64   aMap[i].pMethod
244e0 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
244f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75  .  }..  /* Defau
24500 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73  lt case. Handles
24510 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73  , amongst others
24520 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65  , "nfs"..  ** Te
24530 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  st byte-range lo
24540 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29  ck using fcntl()
24550 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75  . If the call su
24560 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73  cceeds, .  ** as
24570 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69  sume that the fi
24580 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le-system suppor
24590 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c  ts POSIX style l
245a0 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f  ocks. .  */.  lo
245b0 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
245c0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
245d0 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
245e0 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
245f0 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
24600 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
24610 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46  RDLCK;.  if( osF
24620 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f  cntl(pNew->h, F_
24630 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f  GETLK, &lockInfo
24640 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66  )!=-1 ) {.    if
24650 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
24660 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e  f_fstypename, "n
24670 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fs")==0 ){.     
24680 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65   return &nfsIoMe
24690 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73  thods;.    } els
246a0 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e {.      return
246b0 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
246c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
246d0 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74  .    return &dot
246e0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
246f0 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73   }.}.static cons
24700 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
24710 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74  hods .  *(*const
24720 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
24730 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  r)(const char*,u
24740 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f  nixFile*) = auto
24750 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
24760 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  ;..#endif /* def
24770 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
24780 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
24790 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
247a0 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  /..#if OS_VXWORK
247b0 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  S && SQLITE_ENAB
247c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
247d0 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69  ./* .** This "fi
247e0 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61  nder" function a
247f0 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72  ttempts to deter
24800 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f  mine the best lo
24810 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a  cking strategy .
24820 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  ** for the datab
24830 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61  ase file "filePa
24840 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65  th".  It then re
24850 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65  turns the sqlite
24860 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20  3_io_methods.** 
24870 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c  object that impl
24880 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61  ements that stra
24890 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tegy..**.** This
248a0 20 69 73 20 66 6f 72 20 56 58 57 6f 72 6b 73 20   is for VXWorks 
248b0 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
248c0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
248d0 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f  _methods *autolo
248e0 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a  ckIoFinderImpl(.
248f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
24900 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61  lePath,    /* na
24910 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
24920 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  se file */.  uni
24930 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20  xFile *pNew     
24940 20 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65        /* the ope
24950 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f  n file object */
24960 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  .){.  struct flo
24970 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20  ck lockInfo;..  
24980 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b  if( !filePath ){
24990 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50  .    /* If fileP
249a0 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  ath==NULL that m
249b0 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c  eans we are deal
249c0 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73  ing with a trans
249d0 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a  ient file.    **
249e0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
249f0 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
24a00 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
24a10 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
24a20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74  ;.  }..  /* Test
24a30 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73   if fcntl() is s
24a40 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65  upported and use
24a50 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63   POSIX style loc
24a60 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  ks..  ** Otherwi
24a70 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  se fall back to 
24a80 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68  the named semaph
24a90 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f  ore method..  */
24aa0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65  .  lockInfo.l_le
24ab0 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66  n = 1;.  lockInf
24ac0 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  o.l_start = 0;. 
24ad0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e   lockInfo.l_when
24ae0 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
24af0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65   lockInfo.l_type
24b00 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66   = F_RDLCK;.  if
24b10 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e  ( osFcntl(pNew->
24b20 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
24b30 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20  kInfo)!=-1 ) {. 
24b40 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
24b50 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
24b60 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
24b70 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  semIoMethods;.  
24b80 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  }.}.static const
24b90 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
24ba0 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20  ods .  *(*const 
24bb0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
24bc0 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
24bd0 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c  ixFile*) = autol
24be0 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b  ockIoFinderImpl;
24bf0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  ..#endif /* OS_V
24c00 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45  XWORKS && SQLITE
24c10 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
24c20 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STYLE */../*.** 
24c30 41 6e 20 61 62 73 74 72 61 63 74 20 74 79 70 65  An abstract type
24c40 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74   for a pointer t
24c50 6f 20 61 20 49 4f 20 6d 65 74 68 6f 64 20 66 69  o a IO method fi
24c60 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a  nder function:.*
24c70 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20  /.typedef const 
24c80 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
24c90 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70  ds *(*finder_typ
24ca0 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  e)(const char*,u
24cb0 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a  nixFile*);.../**
24cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
24d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d20 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f  ******* sqlite3_
24d30 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
24d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d50 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
24d60 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
24d70 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d  tains the implem
24d80 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68  entation of meth
24d90 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71  ods on the.** sq
24da0 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74  lite3_vfs object
24db0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  ..*/../*.** Init
24dc0 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65  ialize the conte
24dd0 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46  nts of the unixF
24de0 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 6f  ile structure po
24df0 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e  inted to by pId.
24e00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
24e10 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20  illInUnixFile(. 
24e20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
24e30 66 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  fs,      /* Poin
24e40 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
24e50 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20  t */.  int h,   
24e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24e70 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
24e80 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62  riptor of file b
24e90 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
24ea0 20 69 6e 74 20 64 69 72 66 64 2c 20 20 20 20 20   int dirfd,     
24eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
24ec0 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
24ed0 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  iptor */.  sqlit
24ee0 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20  e3_file *pId,   
24ef0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
24f00 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
24f10 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
24f20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
24f30 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
24f40 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  of the file bein
24f50 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e  g opened */.  in
24f60 74 20 6e 6f 4c 6f 63 6b 2c 20 20 20 20 20 20 20  t noLock,       
24f70 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f        /* Omit lo
24f80 63 6b 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f  cking if true */
24f90 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 2c  .  int isDelete,
24fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
24fb0 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66  lete on close if
24fc0 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69   true */.  int i
24fd0 73 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20  sReadOnly       
24fe0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
24ff0 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
25000 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 29 7b   read-only */.){
25010 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
25020 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f  _io_methods *pLo
25030 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e  ckingStyle;.  un
25040 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28  ixFile *pNew = (
25050 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a  unixFile *)pId;.
25060 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
25070 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
25080 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e   pNew->pInode==N
25090 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72  ULL );..  /* Par
250a0 61 6d 65 74 65 72 20 69 73 44 65 6c 65 74 65 20  ameter isDelete 
250b0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6f 6e 20  is only used on 
250c0 76 78 77 6f 72 6b 73 2e 20 45 78 70 72 65 73 73  vxworks. Express
250d0 20 74 68 69 73 20 65 78 70 6c 69 63 69 74 6c 79   this explicitly
250e0 20 0a 20 20 2a 2a 20 68 65 72 65 20 74 6f 20 70   .  ** here to p
250f0 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c 65 72 20  revent compiler 
25100 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74 20 75  warnings about u
25110 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72 73  nused parameters
25120 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f  ..  */.  UNUSED_
25130 50 41 52 41 4d 45 54 45 52 28 69 73 44 65 6c 65  PARAMETER(isDele
25140 74 65 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c  te);..  /* Usual
25150 6c 79 20 74 68 65 20 70 61 74 68 20 7a 46 69 6c  ly the path zFil
25160 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74  ename should not
25170 20 62 65 20 61 20 72 65 6c 61 74 69 76 65 20 70   be a relative p
25180 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a  athname. The.  *
25190 2a 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  * exception is w
251a0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
251b0 70 72 6f 78 79 20 22 63 6f 6e 63 68 22 20 66 69  proxy "conch" fi
251c0 6c 65 20 69 6e 20 62 75 69 6c 64 73 20 74 68 61  le in builds tha
251d0 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74  t.  ** include t
251e0 68 65 20 73 70 65 63 69 61 6c 20 41 70 70 6c 65  he special Apple
251f0 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e   locking styles.
25200 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  .  */.#if define
25210 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
25220 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
25230 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73  CKING_STYLE.  as
25240 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d  sert( zFilename=
25250 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
25260 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20  0]=='/' .    || 
25270 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d  pVfs->pAppData==
25280 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b  (void*)&autolock
25290 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73  IoFinder );.#els
252a0 65 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  e.  assert( zFil
252b0 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c  ename==0 || zFil
252c0 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b  ename[0]=='/' );
252d0 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
252e0 43 45 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33  CE(("OPEN    %-3
252f0 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c  d %s\n", h, zFil
25300 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d  ename));.  pNew-
25310 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e  >h = h;.  pNew->
25320 64 69 72 66 64 20 3d 20 64 69 72 66 64 3b 0a 20  dirfd = dirfd;. 
25330 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a   pNew->zPath = z
25340 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 66 28 20  Filename;.  if( 
25350 6d 65 6d 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61  memcmp(pVfs->zNa
25360 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 2c 31  me,"unix-excl",1
25370 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  0)==0 ){.    pNe
25380 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20 55  w->ctrlFlags = U
25390 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20  NIXFILE_EXCL;.  
253a0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
253b0 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b 0a  >ctrlFlags = 0;.
253c0 20 20 7d 0a 20 20 69 66 28 20 69 73 52 65 61 64    }.  if( isRead
253d0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 70 4e 65 77  Only ){.    pNew
253e0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
253f0 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a  NIXFILE_RDONLY;.
25400 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f    }..#if OS_VXWO
25410 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20  RKS.  pNew->pId 
25420 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c  = vxworksFindFil
25430 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  eId(zFilename);.
25440 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d    if( pNew->pId=
25450 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b  =0 ){.    noLock
25460 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 1;.    rc = S
25470 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
25480 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e  .#endif..  if( n
25490 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  oLock ){.    pLo
254a0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f  ckingStyle = &no
254b0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
254c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63   }else{.    pLoc
254d0 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28  kingStyle = (**(
254e0 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66  finder_type*)pVf
254f0 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69  s->pAppData)(zFi
25500 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23  lename, pNew);.#
25510 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
25520 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
25530 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c     /* Cache zFil
25540 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63  ename in the loc
25550 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46  king context (AF
25560 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76  P and dotlock ov
25570 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20  erride) for.    
25580 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74  ** proxyLock act
25590 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69  ivation is possi
255a0 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78  ble (remote prox
255b0 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62  y is based on db
255c0 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46   name).    ** zF
255d0 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20  ilename remains 
255e0 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65  valid until file
255f0 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73   is closed, to s
25600 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e  upport */.    pN
25610 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
25620 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c  xt = (void*)zFil
25630 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  ename;.#endif.  
25640 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e  }..  if( pLockin
25650 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78  gStyle == &posix
25660 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65  IoMethods.#if de
25670 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
25680 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
25690 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
256a0 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53      || pLockingS
256b0 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65  tyle == &nfsIoMe
256c0 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29  thods.#endif.  )
256d0 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  {.    unixEnterM
256e0 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
256f0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
25700 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
25710 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  de);.    if( rc!
25720 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25730 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72      /* If an err
25740 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 66 69  or occured in fi
25750 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63  ndInodeInfo(), c
25760 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
25770 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a  scriptor.      *
25780 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62  * immediately, b
25790 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20  efore releasing 
257a0 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49  the mutex. findI
257b0 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66  nodeInfo() may f
257c0 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ail.      ** in 
257d0 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20  two scenarios:. 
257e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
257f0 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f     (a) A call to
25800 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e   fstat() failed.
25810 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20  .      **   (b) 
25820 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e  A malloc failed.
25830 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
25840 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20  ** Scenario (b) 
25850 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  may only occur i
25860 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 73  f the process is
25870 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65   holding no othe
25880 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  r.      ** file 
25890 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
258a0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   on the same fil
258b0 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72 65  e. If there were
258c0 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20   other file.    
258d0 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73    ** descriptors
258e0 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74   on this file, t
258f0 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f  hen no malloc wo
25900 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64 20  uld be required 
25910 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64  by.      ** find
25920 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20  InodeInfo(). If 
25930 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
25940 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73 61  , it is quite sa
25950 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20  fe to close.    
25960 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20    ** handle h - 
25970 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  as it is guarant
25980 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69  eed that no posi
25990 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20  x locks will be 
259a0 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a  released.      *
259b0 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20  * by doing so.. 
259c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
259d0 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29   If scenario (a)
259e0 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72 6f   caused the erro
259f0 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72  r then things ar
25a00 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54  e not so safe. T
25a10 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  he.      ** impl
25a20 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20  icit assumption 
25a30 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66 20  here is that if 
25a40 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74  fstat() fails, t
25a50 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20  hings are in.   
25a60 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73     ** such bad s
25a70 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70 69  hape that droppi
25a80 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f  ng a lock or two
25a90 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
25aa0 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  much..      */. 
25ab0 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
25ac0 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
25ad0 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d 20  E__);.      h = 
25ae0 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  -1;.    }.    un
25af0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
25b00 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
25b10 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
25b20 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
25b30 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73  __APPLE__).  els
25b40 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
25b50 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74  yle == &afpIoMet
25b60 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41  hods ){.    /* A
25b70 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  FP locking uses 
25b80 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
25b90 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
25ba0 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20  included in.    
25bb0 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e  ** the afpLockin
25bc0 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f  gContext..    */
25bd0 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  .    afpLockingC
25be0 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20  ontext *pCtx;.  
25bf0 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
25c00 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20  ontext = pCtx = 
25c10 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
25c20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b  sizeof(*pCtx) );
25c30 0a 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30  .    if( pCtx==0
25c40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
25c50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
25c60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
25c70 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65   NB: zFilename e
25c80 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e  xists and remain
25c90 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68  s valid until th
25ca0 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  e file is closed
25cb0 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64  .      ** accord
25cc0 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65  ing to requireme
25cd0 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77  nt F11141.  So w
25ce0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
25cf0 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a   make a.      **
25d00 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c   copy of the fil
25d10 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20  ename. */.      
25d20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a  pCtx->dbPath = z
25d30 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
25d40 70 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d  pCtx->reserved =
25d50 20 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f   0;.      srando
25d60 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e  mdev();.      un
25d70 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
25d80 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49        rc = findI
25d90 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
25da0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
25db0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
25dc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25dd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
25de0 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
25df0 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f  ext);.        ro
25e00 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
25e10 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
25e20 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20         h = -1;. 
25e30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69       }.      uni
25e40 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20  xLeaveMutex();  
25e50 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d        .    }.  }
25e60 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20  .#endif..  else 
25e70 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
25e80 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  e == &dotlockIoM
25e90 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
25ea0 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
25eb0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
25ec0 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
25ed0 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
25ee0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74  n.    ** the dot
25ef0 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
25f00 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  xt .    */.    c
25f10 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a  har *zLockFile;.
25f20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d      int nFilenam
25f30 65 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65  e;.    nFilename
25f40 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
25f50 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20  Filename) + 6;. 
25f60 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28     zLockFile = (
25f70 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
25f80 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29  alloc(nFilename)
25f90 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46  ;.    if( zLockF
25fa0 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
25fb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
25fc0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
25fd0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
25fe0 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20  intf(nFilename, 
25ff0 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20  zLockFile, "%s" 
26000 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20  DOTLOCK_SUFFIX, 
26010 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
26020 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  }.    pNew->lock
26030 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f  ingContext = zLo
26040 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  ckFile;.  }..#if
26050 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c   OS_VXWORKS.  el
26060 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
26070 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65  tyle == &semIoMe
26080 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
26090 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
260a0 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
260b0 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
260c0 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
260d0 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   ** included in 
260e0 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f  the semLockingCo
260f0 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20  ntext.    */.   
26100 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
26110 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  );.    rc = find
26120 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20  InodeInfo(pNew, 
26130 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a  &pNew->pInode);.
26140 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
26150 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77  ITE_OK) && (pNew
26160 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d  ->pInode->pSem==
26170 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63  NULL) ){.      c
26180 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20  har *zSemName = 
26190 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53  pNew->pInode->aS
261a0 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e  emName;.      in
261b0 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t n;.      sqlit
261c0 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
261d0 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61  PATHNAME, zSemNa
261e0 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20  me, "/%s.sem",. 
261f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26200 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d        pNew->pId-
26210 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29  >zCanonicalName)
26220 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31  ;.      for( n=1
26230 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e  ; zSemName[n]; n
26240 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66 28  ++ ).        if(
26250 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f   zSemName[n]=='/
26260 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20  ' ) zSemName[n] 
26270 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65  = '_';.      pNe
26280 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20  w->pInode->pSem 
26290 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e  = sem_open(zSemN
262a0 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36  ame, O_CREAT, 06
262b0 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  66, 1);.      if
262c0 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e  ( pNew->pInode->
262d0 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c  pSem == SEM_FAIL
262e0 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ED ){.        rc
262f0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
26300 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
26310 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b  Inode->aSemName[
26320 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  0] = '\0';.     
26330 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69   }.    }.    uni
26340 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
26350 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 70   }.#endif.  .  p
26360 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  New->lastErrno =
26370 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   0;.#if OS_VXWOR
26380 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  KS.  if( rc!=SQL
26390 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
263a0 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  ( h>=0 ) robust_
263b0 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
263c0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20  _LINE__);.    h 
263d0 3d 20 2d 31 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b  = -1;.    unlink
263e0 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
263f0 20 69 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20   isDelete = 0;. 
26400 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 73 44 65 6c   }.  pNew->isDel
26410 65 74 65 20 3d 20 69 73 44 65 6c 65 74 65 3b 0a  ete = isDelete;.
26420 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21  #endif.  if( rc!
26430 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26440 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29    if( dirfd>=0 )
26450 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
26460 65 77 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e  ew, dirfd, __LIN
26470 45 5f 5f 29 3b 0a 20 20 20 20 69 66 28 20 68 3e  E__);.    if( h>
26480 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73  =0 ) robust_clos
26490 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
264a0 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E__);.  }else{. 
264b0 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
264c0 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65   = pLockingStyle
264d0 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65  ;.    OpenCounte
264e0 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  r(+1);.  }.  ret
264f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26500 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73   Open a file des
26510 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64  criptor to the d
26520 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
26530 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61  ing file zFilena
26540 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  me..** If succes
26550 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65  sful, *pFd is se
26560 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  t to the opened 
26570 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
26580 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
26590 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
265a0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
265b0 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  , either SQLITE_
265c0 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49  NOMEM.** or SQLI
265d0 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72  TE_CANTOPEN is r
265e0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64  eturned and *pFd
265f0 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e   is set to an un
26600 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65  defined.** value
26610 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
26620 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
26630 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  , the caller is 
26640 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
26650 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  closing.** the f
26660 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
26670 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28  pFd using close(
26680 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
26690 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
266a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
266b0 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b  name, int *pFd){
266c0 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
266d0 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72   fd = -1;.  char
266e0 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41   zDirname[MAX_PA
266f0 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71  THNAME+1];..  sq
26700 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
26710 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69  AX_PATHNAME, zDi
26720 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69  rname, "%s", zFi
26730 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  lename);.  for(i
26740 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44  i=(int)strlen(zD
26750 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26  irname); ii>1 &&
26760 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27   zDirname[ii]!='
26770 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28  /'; ii--);.  if(
26780 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69   ii>0 ){.    zDi
26790 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27  rname[ii] = '\0'
267a0 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  ;.    fd = robus
267b0 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c  t_open(zDirname,
267c0 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41   O_RDONLY|O_BINA
267d0 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  RY, 0);.    if( 
267e0 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  fd>=0 ){.#ifdef 
267f0 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20 20  FD_CLOEXEC.     
26800 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53   osFcntl(fd, F_S
26810 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64  ETFD, osFcntl(fd
26820 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20  , F_GETFD, 0) | 
26830 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e  FD_CLOEXEC);.#en
26840 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43  dif.      OSTRAC
26850 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64  E(("OPENDIR %-3d
26860 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72   %s\n", fd, zDir
26870 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  name));.    }.  
26880 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20  }.  *pFd = fd;. 
26890 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53   return (fd>=0?S
268a0 51 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67  QLITE_OK:unixLog
268b0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
268c0 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
268d0 6e 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a  n", zDirname));.
268e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
268f0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  the name of a di
26900 72 65 63 74 6f 72 79 20 69 6e 20 77 68 69 63 68  rectory in which
26910 20 74 6f 20 70 75 74 20 74 65 6d 70 6f 72 61 72   to put temporar
26920 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e  y files..** If n
26930 6f 20 73 75 69 74 61 62 6c 65 20 74 65 6d 70 6f  o suitable tempo
26940 72 61 72 79 20 66 69 6c 65 20 64 69 72 65 63 74  rary file direct
26950 6f 72 79 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ory can be found
26960 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
26970 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
26980 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c  har *unixTempFil
26990 65 44 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74  eDir(void){.  st
269a0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
269b0 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20  *azDirs[] = {.  
269c0 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20     0,.     0,.  
269d0 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20     "/var/tmp",. 
269e0 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a      "/usr/tmp",.
269f0 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20       "/tmp",.   
26a00 20 20 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69    0        /* Li
26a10 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f  st terminator */
26a20 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  .  };.  unsigned
26a30 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
26a40 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e   stat buf;.  con
26a50 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  st char *zDir = 
26a60 30 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20  0;..  azDirs[0] 
26a70 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  = sqlite3_temp_d
26a80 69 72 65 63 74 6f 72 79 3b 0a 20 20 69 66 28 20  irectory;.  if( 
26a90 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44  !azDirs[1] ) azD
26aa0 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28  irs[1] = getenv(
26ab0 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 66 6f 72  "TMPDIR");.  for
26ac0 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
26ad0 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a  zDirs)/sizeof(az
26ae0 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61  Dirs[0]); zDir=a
26af0 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20  zDirs[i++]){.   
26b00 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 63   if( zDir==0 ) c
26b10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
26b20 20 6f 73 53 74 61 74 28 7a 44 69 72 2c 20 26 62   osStat(zDir, &b
26b30 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  uf) ) continue;.
26b40 20 20 20 20 69 66 28 20 21 53 5f 49 53 44 49 52      if( !S_ISDIR
26b50 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20  (buf.st_mode) ) 
26b60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
26b70 28 20 6f 73 41 63 63 65 73 73 28 7a 44 69 72 2c  ( osAccess(zDir,
26b80 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b   07) ) continue;
26b90 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
26ba0 20 20 72 65 74 75 72 6e 20 7a 44 69 72 3b 0a 7d    return zDir;.}
26bb0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
26bc0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
26bd0 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a  name in zBuf.  z
26be0 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  Buf must be allo
26bf0 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  cated.** by the 
26c00 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20  calling process 
26c10 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69 67 20  and must be big 
26c20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61  enough to hold a
26c30 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d  t least.** pVfs-
26c40 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65  >mxPathname byte
26c50 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
26c60 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
26c70 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
26c80 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63  *zBuf){.  static
26c90 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
26ca0 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
26cb0 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
26cc0 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
26cd0 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
26ce0 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
26cf0 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
26d00 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  9";.  unsigned i
26d10 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74  nt i, j;.  const
26d20 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a 0a 20 20   char *zDir;..  
26d30 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
26d40 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
26d50 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
26d60 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
26d70 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
26d80 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
26d90 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
26da0 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
26db0 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
26dc0 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
26dd0 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74   .  */.  Simulat
26de0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
26df0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b   SQLITE_IOERR );
26e00 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e 69 78 54  ..  zDir = unixT
26e10 65 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a 20 20  empFileDir();.  
26e20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 7a 44  if( zDir==0 ) zD
26e30 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20  ir = ".";..  /* 
26e40 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f  Check that the o
26e50 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20  utput buffer is 
26e60 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
26e70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
26e80 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20  ile .  ** name. 
26e90 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65  If it is not, re
26ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
26eb0 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73  R..  */.  if( (s
26ec0 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73 74  trlen(zDir) + st
26ed0 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50  rlen(SQLITE_TEMP
26ee0 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20  _FILE_PREFIX) + 
26ef0 31 37 29 20 3e 3d 20 28 73 69 7a 65 5f 74 29 6e  17) >= (size_t)n
26f00 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Buf ){.    retur
26f10 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
26f20 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 73    }..  do{.    s
26f30 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
26f40 6e 42 75 66 2d 31 37 2c 20 7a 42 75 66 2c 20 22  nBuf-17, zBuf, "
26f50 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f  %s/"SQLITE_TEMP_
26f60 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69  FILE_PREFIX, zDi
26f70 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28 69 6e 74  r);.    j = (int
26f80 29 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20  )strlen(zBuf);. 
26f90 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
26fa0 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b  mness(15, &zBuf[
26fb0 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  j]);.    for(i=0
26fc0 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
26fd0 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d  ){.      zBuf[j]
26fe0 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b   = (char)zChars[
26ff0 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   ((unsigned char
27000 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f  )zBuf[j])%(sizeo
27010 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a  f(zChars)-1) ];.
27020 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a      }.    zBuf[j
27030 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28  ] = 0;.  }while(
27040 20 6f 73 41 63 63 65 73 73 28 7a 42 75 66 2c 30   osAccess(zBuf,0
27050 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
27060 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
27070 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
27080 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
27090 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
270a0 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  E__)./*.** Routi
270b0 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20  ne to transform 
270c0 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20  a unixFile into 
270d0 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  a proxy-locking 
270e0 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70  unixFile..** Imp
270f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74  lementation in t
27100 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69  he proxy-lock di
27110 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64  vision, but used
27120 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a   by unixOpen().*
27130 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46  * if SQLITE_PREF
27140 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
27150 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
27160 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
27170 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
27180 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e  e(unixFile*, con
27190 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69  st char*);.#endi
271a0 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  f../*.** Search 
271b0 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69  for an unused fi
271c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
271d0 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  at was opened on
271e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
271f0 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  * file (not a jo
27200 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d  urnal or master-
27210 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64  journal file) id
27220 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 74 68  entified by path
27230 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69  name.** zPath wi
27240 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58  th SQLITE_OPEN_X
27250 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e  XX flags matchin
27260 67 20 74 68 6f 73 65 20 70 61 73 73 65 64 20 61  g those passed a
27270 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  s the second.** 
27280 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
27290 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
272a0 20 53 75 63 68 20 61 20 66 69 6c 65 20 64 65 73   Such a file des
272b0 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73  criptor may exis
272c0 74 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20  t if a database 
272d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63  connection was c
272e0 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65  losed.** but the
272f0 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
27300 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c   descriptor coul
27310 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  d not be closed 
27320 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20  because some.** 
27330 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
27340 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  iptor open on th
27350 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68  e same file is h
27360 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f  olding a file-lo
27370 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20  ck..** Refer to 
27380 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  comments in the 
27390 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63  unixClose() func
273a0 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e  tion and the len
273b0 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20  gthy comment.** 
273c0 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69  describing "Posi
273d0 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69  x Advisory Locki
273e0 6e 67 22 20 61 74 20 74 68 65 20 73 74 61 72 74  ng" at the start
273f0 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f   of this file fo
27400 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65  r .** further de
27410 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63  tails. Also, tic
27420 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a  ket #4018..**.**
27430 20 49 66 20 61 20 73 75 69 74 61 62 6c 65 20 66   If a suitable f
27440 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
27450 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74  s found, then it
27460 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
27470 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65   no.** such file
27480 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c   descriptor is l
27490 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65  ocated, -1 is re
274a0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
274b0 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a  c UnixUnusedFd *
274c0 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63  findReusableFd(c
274d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
274e0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
274f0 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
27500 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  nused = 0;..  /*
27510 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66   Do not search f
27520 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c  or an unused fil
27530 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
27540 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63  vxworks. Not bec
27550 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b  ause.  ** vxwork
27560 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65  s would not bene
27570 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61  fit from the cha
27580 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77  nge (it might, w
27590 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a  e're not sure),.
275a0 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65    ** but because
275b0 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20   no way to test 
275c0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
275d0 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73  available. It is
275e0 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f   better .  ** no
275f0 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69  t to risk breaki
27600 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f  ng vxworks suppo
27610 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20  rt for the sake 
27620 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75  of such an obscu
27630 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65  re .  ** feature
27640 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58  .  */.#if !OS_VX
27650 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73  WORKS.  struct s
27660 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
27670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27680 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28  Results of stat(
27690 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  ) call */..  /* 
276a0 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61  A stat() call ma
276b0 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f  y fail for vario
276c0 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74  us reasons. If t
276d0 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20  his happens, it 
276e0 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63  is.  ** almost c
276f0 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f  ertain that an o
27700 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68  pen() call on th
27710 65 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c  e same path will
27720 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a   also fail..  **
27730 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
27740 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
27750 63 75 72 73 20 69 6e 20 74 68 65 20 73 74 61 74  curs in the stat
27760 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74  () call here, it
27770 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64   is.  ** ignored
27780 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72   and -1 is retur
27790 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
277a0 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e  will try to open
277b0 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a   a new file.  **
277c0 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74   descriptor on t
277d0 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61  he same path, fa
277e0 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61  il, and return a
277f0 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74  n error to SQLit
27800 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65  e..  **.  ** Eve
27810 6e 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e  n if a subsequen
27820 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f  t open() call do
27830 65 73 20 73 75 63 63 65 65 64 2c 20 74 68 65 20  es succeed, the 
27840 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a  consequences of.
27850 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69    ** not searchi
27860 6e 67 20 66 6f 72 20 61 20 72 65 73 75 73 61 62  ng for a resusab
27870 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
27880 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e  or are not dire.
27890 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74    */.  if( 0==st
278a0 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74  at(zPath, &sStat
278b0 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f  ) ){.    unixIno
278c0 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
278d0 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
278e0 74 65 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64  tex();.    pInod
278f0 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  e = inodeList;. 
27900 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65     while( pInode
27910 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c   && (pInode->fil
27920 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73  eId.dev!=sStat.s
27930 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20 20  t_dev.          
27940 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49             || pI
27950 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f  node->fileId.ino
27960 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20  !=sStat.st_ino) 
27970 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ){.       pInode
27980 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
27990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
279a0 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  pInode ){.      
279b0 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70  UnixUnusedFd **p
279c0 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d  p;.      for(pp=
279d0 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64  &pInode->pUnused
279e0 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e  ; *pp && (*pp)->
279f0 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70  flags!=flags; pp
27a00 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  =&((*pp)->pNext)
27a10 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64  );.      pUnused
27a20 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66   = *pp;.      if
27a30 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
27a40 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73       *pp = pUnus
27a50 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ed->pNext;.     
27a60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69   }.    }.    uni
27a70 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
27a80 20 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20   }.#endif    /* 
27a90 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a  if !OS_VXWORKS *
27aa0 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73  /.  return pUnus
27ab0 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ed;.}../*.** Thi
27ac0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
27ad0 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e  lled by unixOpen
27ae0 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  () to determine 
27af0 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73  the unix permiss
27b00 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74  ions.** to creat
27b10 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68  e new files with
27b20 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  . If no error oc
27b30 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
27b40 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
27b50 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20  .** and a value 
27b60 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73  suitable for pas
27b70 73 69 6e 67 20 61 73 20 74 68 65 20 74 68 69 72  sing as the thir
27b80 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70  d argument to op
27b90 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74  en(2) is.** writ
27ba0 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49  ten to *pMode. I
27bb0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
27bc0 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20  curs, an SQLite 
27bd0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
27be0 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  * returned and t
27bf0 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f  he value of *pMo
27c00 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69  de is not modifi
27c10 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
27c20 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
27c30 65 64 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  ed is a temporar
27c40 79 20 66 69 6c 65 2c 20 69 74 20 69 73 20 61 6c  y file, it is al
27c50 77 61 79 73 20 63 72 65 61 74 65 64 20 77 69 74  ways created wit
27c60 68 0a 2a 2a 20 74 68 65 20 6f 63 74 61 6c 20 70  h.** the octal p
27c70 65 72 6d 69 73 73 69 6f 6e 73 20 30 36 30 30 20  ermissions 0600 
27c80 28 72 65 61 64 2f 77 72 69 74 61 62 6c 65 20 62  (read/writable b
27c90 79 20 6f 77 6e 65 72 20 6f 6e 6c 79 29 2e 20 49  y owner only). I
27ca0 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73  f the file.** is
27cb0 20 61 20 64 61 74 61 62 61 73 65 20 6f 72 20 6d   a database or m
27cc0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
27cd0 6c 65 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  le, it is create
27ce0 64 20 77 69 74 68 20 74 68 65 20 70 65 72 6d 69  d with the permi
27cf0 73 73 69 6f 6e 73 20 0a 2a 2a 20 6d 61 73 6b 20  ssions .** mask 
27d00 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
27d10 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 2e  ILE_PERMISSIONS.
27d20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  .**.** Finally, 
27d30 69 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  if the file bein
27d40 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41  g opened is a WA
27d50 4c 20 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75  L or regular jou
27d60 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
27d70 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
27d80 6e 20 71 75 65 72 69 65 73 20 74 68 65 20 66 69  n queries the fi
27d90 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
27da0 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e  e permissions on
27db0 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70   the .** corresp
27dc0 6f 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20  onding database 
27dd0 66 69 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70  file and sets *p
27de0 4d 6f 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c  Mode to this val
27df0 75 65 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a  ue. Whenever .**
27e00 20 70 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61   possible, WAL a
27e10 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nd journal files
27e20 20 61 72 65 20 63 72 65 61 74 65 64 20 75 73 69   are created usi
27e30 6e 67 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d  ng the same perm
27e40 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74  issions .** as t
27e50 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
27e60 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
27e70 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43  static int findC
27e80 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20  reateFileMode(. 
27e90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
27ea0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
27eb0 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65   /* Path of file
27ec0 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e   (possibly) bein
27ed0 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69  g created */.  i
27ee0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
27ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27f00 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 61  * Flags passed a
27f10 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74  s 4th argument t
27f20 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d  o xOpen() */.  m
27f30 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 20 20 20 20  ode_t *pMode    
27f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27f50 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f  * OUT: Permissio
27f60 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20  ns to open file 
27f70 77 69 74 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  with */.){.  int
27f80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27fa0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
27fb0 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51   if( flags & (SQ
27fc0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51  LITE_OPEN_WAL|SQ
27fd0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
27fe0 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63  OURNAL) ){.    c
27ff0 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48  har zDb[MAX_PATH
28000 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20  NAME+1];     /* 
28010 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  Database file pa
28020 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44  th */.    int nD
28030 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
28040 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
28050 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73  r of valid bytes
28060 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73   in zDb */.    s
28070 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
28080 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
28090 4f 75 74 70 75 74 20 6f 66 20 73 74 61 74 28 29  Output of stat()
280a0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
280b0 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61  e */..    /* zPa
280c0 74 68 20 69 73 20 61 20 70 61 74 68 20 74 6f 20  th is a path to 
280d0 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c  a WAL or journal
280e0 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f   file. The follo
280f0 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76  wing block deriv
28100 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  es.    ** the pa
28110 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69  th to the associ
28120 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
28130 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54  le from zPath. T
28140 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65  his block handle
28150 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c  s.    ** the fol
28160 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f  lowing naming co
28170 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a  nventions:.    *
28180 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  *.    **   "<pat
28190 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c  h to db>-journal
281a0 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
281b0 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20  h to db>-wal".  
281c0 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
281d0 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 2d 4e 4e 4e   db>-journal-NNN
281e0 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  N".    **   "<pa
281f0 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 2d 4e 4e  th to db>-wal-NN
28200 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  NN".    **.    *
28210 2a 20 77 68 65 72 65 20 4e 4e 4e 4e 20 69 73 20  * where NNNN is 
28220 61 20 34 20 64 69 67 69 74 20 64 65 63 69 6d 61  a 4 digit decima
28230 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e  l number. The NN
28240 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65  NN naming scheme
28250 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73  s are .    ** us
28260 65 64 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d  ed by the test_m
28270 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c  ultiplex.c modul
28280 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44  e..    */.    nD
28290 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  b = sqlite3Strle
282a0 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20  n30(zPath) - 1; 
282b0 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 44 62 3e  .    while( nDb>
282c0 30 20 26 26 20 7a 50 61 74 68 5b 6e 44 62 5d 21  0 && zPath[nDb]!
282d0 3d 27 6c 27 20 29 20 6e 44 62 2d 2d 3b 0a 20 20  ='l' ) nDb--;.  
282e0 20 20 6e 44 62 20 2d 3d 20 28 28 66 6c 61 67 73    nDb -= ((flags
282f0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57   & SQLITE_OPEN_W
28300 41 4c 29 20 3f 20 33 20 3a 20 37 29 3b 0a 20 20  AL) ? 3 : 7);.  
28310 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50    memcpy(zDb, zP
28320 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a  ath, nDb);.    z
28330 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a  Db[nDb] = '\0';.
28340 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74 61 74  .    if( 0==stat
28350 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29 7b  (zDb, &sStat) ){
28360 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  .      *pMode = 
28370 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20  sStat.st_mode & 
28380 30 37 37 37 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  0777;.    }else{
28390 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
283a0 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
283b0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
283c0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
283d0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
283e0 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64  OSE ){.    *pMod
283f0 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 65 6c 73  e = 0600;.  }els
28400 65 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  e{.    *pMode = 
28410 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
28420 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b  ILE_PERMISSIONS;
28430 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
28450 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a  the file zPath..
28460 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c  ** .** Previousl
28470 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53  y, the SQLite OS
28480 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65   layer used thre
28490 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70  e functions in p
284a0 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20  lace of this.** 
284b0 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  one:.**.**     s
284c0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
284d0 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20  Write();.**     
284e0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
284f0 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20  dOnly();.**     
28500 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
28510 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20  lusive();.**.** 
28520 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72  These calls corr
28530 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f  espond to the fo
28540 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
28550 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  ions of flags:.*
28560 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69  *.**     ReadWri
28570 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41  te() ->     (REA
28580 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29  DWRITE | CREATE)
28590 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79  .**     ReadOnly
285a0 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44  ()  ->     (READ
285b0 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70  ONLY) .**     Op
285c0 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e  enExclusive() ->
285d0 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
285e0 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45  EATE | EXCLUSIVE
285f0 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20  ).**.** The old 
28600 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
28610 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65  accepted a boole
28620 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64  an argument - "d
28630 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74  elFlag". If.** t
28640 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61  rue, the file wa
28650 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
28660 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
28670 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
28680 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65  e.** file handle
28690 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69   closed. To achi
286a0 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66  eve the same eff
286b0 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e  ect using this n
286c0 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  ew .** interface
286d0 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45  , add the DELETE
286e0 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20  ONCLOSE flag to 
286f0 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
28700 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70  above for .** Op
28710 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a  enExclusive()..*
28720 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
28730 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  xOpen(.  sqlite3
28740 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
28750 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
28760 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
28770 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74  is the xOpen met
28780 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
28790 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
287a0 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d        /* Pathnam
287b0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
287c0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
287d0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
287e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
287f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
28800 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
28810 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
28820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28830 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73    /* Input flags
28840 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20   to control the 
28850 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  opening */.  int
28860 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
28870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
28880 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e  put flags return
28890 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72  ed to SQLite cor
288a0 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  e */.){.  unixFi
288b0 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
288c0 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
288d0 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20   fd = -1;       
288e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
288f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72  ile descriptor r
28900 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28  eturned by open(
28910 29 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64  ) */.  int dirfd
28920 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
28930 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
28940 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
28950 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e  or */.  int open
28960 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
28970 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
28980 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28  to pass to open(
28990 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  ) */.  int eType
289a0 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46   = flags&0xFFFFF
289b0 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66  F00;  /* Type of
289c0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
289d0 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20  .  int noLock;  
289e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289f0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69    /* True to omi
28a00 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  t locking primit
28a10 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ives */.  int rc
28a20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
28a30 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
28a40 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65  tion Return Code
28a50 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63   */..  int isExc
28a60 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
28a70 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
28a80 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
28a90 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
28aa0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
28ab0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
28ac0 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
28ad0 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
28ae0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
28af0 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73  REATE);.  int is
28b00 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
28b10 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
28b20 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69  N_READONLY);.  i
28b30 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
28b40 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
28b50 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
28b60 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  );.#if SQLITE_EN
28b70 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
28b80 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50  LE.  int isAutoP
28b90 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26  roxy  = (flags &
28ba0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54   SQLITE_OPEN_AUT
28bb0 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a  OPROXY);.#endif.
28bc0 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e  .  /* If creatin
28bd0 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61  g a master or ma
28be0 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c  in-file journal,
28bf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
28c00 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20  ill open.  ** a 
28c10 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
28c20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  on the directory
28c30 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20   too. The first 
28c40 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a  time unixSync().
28c50 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74    ** is called t
28c60 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
28c70 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
28c80 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61  l be fsync()ed a
28c90 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a  nd close()d..  *
28ca0 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44 69  /.  int isOpenDi
28cb0 72 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72 65  rectory = (isCre
28cc0 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
28cd0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
28ce0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
28cf0 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
28d00 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
28d10 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  AIN_JOURNAL .   
28d20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
28d30 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29  TE_OPEN_WAL.  ))
28d40 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
28d50 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
28d60 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
28d70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
28d80 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
28d90 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
28da0 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
28db0 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
28dc0 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
28dd0 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
28de0 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  pname[MAX_PATHNA
28df0 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  ME+1];.  const c
28e00 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61  har *zName = zPa
28e10 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  th;..  /* Check 
28e20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
28e30 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
28e40 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  e: .  **.  **   
28e50 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
28e60 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
28e70 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
28e80 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
28e90 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29   and .  **   (b)
28ea0 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
28eb0 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
28ec0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
28ed0 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
28ee0 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
28ef0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
28f00 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
28f10 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
28f20 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
28f30 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
28f40 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
28f50 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
28f60 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
28f70 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
28f80 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
28f90 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
28fa0 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
28fb0 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
28fc0 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
28fd0 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
28fe0 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
28ff0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
29000 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
29010 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
29020 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
29030 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
29040 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
29050 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a  rnal are never .
29060 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
29070 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20  ly deleted. Nor 
29080 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65  are they ever te
29090 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20  mporary files.  
290a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  */.  assert( (!i
290b0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
290c0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
290d0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
290e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
290f0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
29100 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
29110 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
29120 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
29130 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
29140 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
29150 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
29160 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  TER_JOURNAL );. 
29170 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
29180 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
29190 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
291a0 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a  PEN_WAL );..  /*
291b0 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
291c0 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73   upper layer has
291d0 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   set one of the 
291e0 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67  "file-type" flag
291f0 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
29200 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
29210 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20  EN_MAIN_DB      
29220 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
29230 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20  _OPEN_TEMP_DB . 
29240 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
29250 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
29260 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
29270 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
29280 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  EMP_JOURNAL .   
29290 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
292a0 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
292b0 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
292c0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
292d0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
292e0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
292f0 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
29300 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d  ENT_DB || eType=
29310 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
29320 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  .  );..  memset(
29330 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  p, 0, sizeof(uni
29340 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20  xFile));..  if( 
29350 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
29360 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20  EN_MAIN_DB ){.  
29370 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
29380 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e  pUnused;.    pUn
29390 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61  used = findReusa
293a0 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61  bleFd(zName, fla
293b0 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e  gs);.    if( pUn
293c0 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64  used ){.      fd
293d0 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a   = pUnused->fd;.
293e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
293f0 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
29400 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
29410 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20  (*pUnused));.   
29420 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20     if( !pUnused 
29430 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
29440 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
29450 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29460 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70    p->pUnused = p
29470 55 6e 75 73 65 64 3b 0a 20 20 7d 65 6c 73 65 20  Unused;.  }else 
29480 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20  if( !zName ){.  
29490 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
294a0 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72   NULL, the upper
294b0 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73   layer is reques
294c0 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65  ting a temp file
294d0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
294e0 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f  isDelete && !isO
294f0 70 65 6e 44 69 72 65 63 74 6f 72 79 29 3b 0a 20  penDirectory);. 
29500 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54     rc = unixGetT
29510 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48  empname(MAX_PATH
29520 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65  NAME+1, zTmpname
29530 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
29540 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
29560 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a   }.    zName = z
29570 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20  Tmpname;.  }..  
29580 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
29590 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c   value of the fl
295a0 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 70 61  ags parameter pa
295b0 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75  ssed to POSIX fu
295c0 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e  nction.  ** open
295d0 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62  (). These must b
295e0 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65  e calculated eve
295f0 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e  n if open() is n
29600 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20  ot called, as.  
29610 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 73  ** they may be s
29620 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
29630 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
29640 20 61 6e 64 20 75 73 65 64 20 62 79 20 74 68 65   and used by the
29650 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69   .  ** 'conch fi
29660 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63  le' locking func
29670 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20  tions later on. 
29680 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64   */.  if( isRead
29690 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67  only )  openFlag
296a0 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  s |= O_RDONLY;. 
296b0 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
296c0 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20   ) openFlags |= 
296d0 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73  O_RDWR;.  if( is
296e0 43 72 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e  Create )    open
296f0 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54  Flags |= O_CREAT
29700 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73  ;.  if( isExclus
29710 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20  ive ) openFlags 
29720 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46  |= (O_EXCL|O_NOF
29730 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c  OLLOW);.  openFl
29740 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46  ags |= (O_LARGEF
29750 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a  ILE|O_BINARY);..
29760 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
29770 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64    mode_t openMod
29780 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
29790 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74  /* Permissions t
297a0 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77 69  o create file wi
297b0 74 68 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  th */.    rc = f
297c0 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
297d0 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20  e(zName, flags, 
297e0 26 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20  &openMode);.    
297f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29800 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
29810 74 28 20 21 70 2d 3e 70 55 6e 75 73 65 64 20 29  t( !p->pUnused )
29820 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29830 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
29840 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d  EN_WAL || eType=
29850 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
29860 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20  N_JOURNAL );.   
29870 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
29880 20 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f 62    }.    fd = rob
29890 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  ust_open(zName, 
298a0 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d  openFlags, openM
298b0 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ode);.    OSTRAC
298c0 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64  E(("OPENX   %-3d
298d0 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20   %s 0%o\n", fd, 
298e0 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
298f0 29 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  ));.    if( fd<0
29900 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49   && errno!=EISDI
29910 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74 65  R && isReadWrite
29920 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65   && !isExclusive
29930 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   ){.      /* Fai
29940 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  led to open the 
29950 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72  file for read/wr
29960 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79 20  ite access. Try 
29970 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  read-only. */.  
29980 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53      flags &= ~(S
29990 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
299a0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
299b0 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20  _CREATE);.      
299c0 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f  openFlags &= ~(O
299d0 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a  _RDWR|O_CREAT);.
299e0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
299f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
29a00 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46  NLY;.      openF
29a10 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59  lags |= O_RDONLY
29a20 3b 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e  ;.      isReadon
29a30 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 64  ly = 1;.      fd
29a40 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
29a50 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  Name, openFlags,
29a60 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20   openMode);.    
29a70 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  }.    if( fd<0 )
29a80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
29a90 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
29aa0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
29ab0 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a  "open", zName);.
29ac0 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
29ad0 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
29ae0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64    }.  assert( fd
29af0 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75  >=0 );.  if( pOu
29b00 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70  tFlags ){.    *p
29b10 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  OutFlags = flags
29b20 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
29b30 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70  pUnused ){.    p
29b40 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20  ->pUnused->fd = 
29b50 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73  fd;.    p->pUnus
29b60 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67  ed->flags = flag
29b70 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  s;.  }..  if( is
29b80 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53  Delete ){.#if OS
29b90 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61  _VXWORKS.    zPa
29ba0 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73  th = zName;.#els
29bb0 65 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61  e.    unlink(zNa
29bc0 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  me);.#endif.  }.
29bd0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
29be0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
29bf0 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f    else{.    p->o
29c00 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46  penFlags = openF
29c10 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  lags;.  }.#endif
29c20 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 44 69  ..  if( isOpenDi
29c30 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 72  rectory ){.    r
29c40 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  c = openDirector
29c50 79 28 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29  y(zPath, &dirfd)
29c60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
29c70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29c80 20 2f 2a 20 49 74 20 69 73 20 73 61 66 65 20 74   /* It is safe t
29c90 6f 20 63 6c 6f 73 65 20 66 64 20 61 74 20 74 68  o close fd at th
29ca0 69 73 20 70 6f 69 6e 74 2c 20 62 65 63 61 75 73  is point, becaus
29cb0 65 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  e it is guarante
29cc0 65 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  ed not.      ** 
29cd0 74 6f 20 62 65 20 6f 70 65 6e 20 6f 6e 20 61 20  to be open on a 
29ce0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
29cf0 66 20 69 74 20 77 65 72 65 20 6f 70 65 6e 20 6f  f it were open o
29d00 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
29d10 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 77  e,.      ** it w
29d20 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65  ould not be safe
29d30 20 74 6f 20 63 6c 6f 73 65 20 61 73 20 74 68 69   to close as thi
29d40 73 20 77 6f 75 6c 64 20 72 65 6c 65 61 73 65 20  s would release 
29d50 61 6e 79 20 6c 6f 63 6b 73 20 68 65 6c 64 0a 20  any locks held. 
29d60 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66       ** on the f
29d70 69 6c 65 20 62 79 20 74 68 69 73 20 70 72 6f 63  ile by this proc
29d80 65 73 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61  ess.  */.      a
29d90 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53 51  ssert( eType!=SQ
29da0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
29db0 42 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73  B );.      robus
29dc0 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
29dd0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
29de0 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
29df0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  ed;.    }.  }..#
29e00 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43  ifdef FD_CLOEXEC
29e10 0a 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46  .  osFcntl(fd, F
29e20 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28  _SETFD, osFcntl(
29e30 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
29e40 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
29e50 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20  endif..  noLock 
29e60 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  = eType!=SQLITE_
29e70 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20  OPEN_MAIN_DB;.. 
29e80 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f   .#if defined(__
29e90 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
29ea0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
29eb0 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74  G_STYLE.  struct
29ec0 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
29ed0 20 20 69 66 28 20 66 73 74 61 74 66 73 28 66 64    if( fstatfs(fd
29ee0 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31  , &fsInfo) == -1
29ef0 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
29f00 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74  le*)pFile)->last
29f10 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
29f20 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20     if( dirfd>=0 
29f30 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70  ) robust_close(p
29f40 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , dirfd, __LINE_
29f50 5f 29 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63  _);.    robust_c
29f60 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49  lose(p, fd, __LI
29f70 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72  NE__);.    retur
29f80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
29f90 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20  CCESS;.  }.  if 
29fa0 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d  (0 == strncmp("m
29fb0 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f  sdos", fsInfo.f_
29fc0 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20  fstypename, 5)) 
29fd0 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
29fe0 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
29ff0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
2a000 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20  AGS_IS_MSDOS;.  
2a010 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69 66 20  }.#endif.  .#if 
2a020 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2a030 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20  CKING_STYLE.#if 
2a040 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
2a050 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73  OXY_LOCKING.  is
2a060 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23  AutoProxy = 1;.#
2a070 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41 75  endif.  if( isAu
2a080 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74  toProxy && (zPat
2a090 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f  h!=NULL) && (!no
2a0a0 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78  Lock) && pVfs->x
2a0b0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  Open ){.    char
2a0c0 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74   *envforce = get
2a0d0 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43  env("SQLITE_FORC
2a0e0 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22  E_PROXY_LOCKING"
2a0f0 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72  );.    int usePr
2a100 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  oxy = 0;..    /*
2a110 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
2a120 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d  OXY_LOCKING==1 m
2a130 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79  eans force alway
2a140 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d  s use proxy, 0 m
2a150 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76  eans .    ** nev
2a160 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55  er use proxy, NU
2a170 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f  LL means use pro
2a180 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c  xy for non-local
2a190 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f   files only.  */
2a1a0 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63  .    if( envforc
2a1b0 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  e!=NULL ){.     
2a1c0 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69   useProxy = atoi
2a1d0 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20  (envforce)>0;.  
2a1e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2a1f0 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
2a200 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 73  nfo;.      if( s
2a210 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73  tatfs(zPath, &fs
2a220 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
2a230 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65         /* In the
2a240 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66  ory, the close(f
2a250 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f  d) call is sub-o
2a260 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66  ptimal. If the f
2a270 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20  ile opened.     
2a280 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73     ** with fd is
2a290 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
2a2a0 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
2a2b0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2a2c0 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  s open.        *
2a2d0 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74  * on that file t
2a2e0 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
2a2f0 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f  y holding adviso
2a300 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a  ry locks on it,.
2a310 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2a320 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73  the call to clos
2a330 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20  e() will cancel 
2a340 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20  those locks. In 
2a350 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20  practice,.      
2a360 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d    ** we're assum
2a370 69 6e 67 20 74 68 61 74 20 73 74 61 74 66 73 28  ing that statfs(
2a380 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76  ) doesn't fail v
2a390 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65  ery often. At le
2a3a0 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  ast.        ** n
2a3b0 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66  ot while other f
2a3c0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2a3d0 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73 61  opened by the sa
2a3e0 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20  me process on.  
2a3f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d        ** the sam
2a400 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69  e file are worki
2a410 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ng.  */.        
2a420 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  p->lastErrno = e
2a430 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66  rrno;.        if
2a440 28 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20  ( dirfd>=0 ){.  
2a450 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63          robust_c
2a460 6c 6f 73 65 28 70 2c 20 64 69 72 66 64 2c 20 5f  lose(p, dirfd, _
2a470 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2a480 20 20 7d 0a 20 20 20 20 20 20 20 20 72 6f 62 75    }.        robu
2a490 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20  st_close(p, fd, 
2a4a0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
2a4b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
2a4c0 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20  OERR_ACCESS;.   
2a4d0 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
2a4e0 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d  inished;.      }
2a4f0 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
2a500 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  = !(fsInfo.f_fla
2a510 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20  gs&MNT_LOCAL);. 
2a520 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65     }.    if( use
2a530 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72  Proxy ){.      r
2a540 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
2a550 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72  le(pVfs, fd, dir
2a560 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
2a570 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  , noLock,.      
2a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a590 20 20 20 20 69 73 44 65 6c 65 74 65 2c 20 69 73      isDelete, is
2a5a0 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 20  Readonly);.     
2a5b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a5c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2a5d0 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
2a5e0 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46  mUnixFile((unixF
2a5f0 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75  ile*)pFile, ":au
2a600 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69  to:");.        i
2a610 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a620 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2a630 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74   Use unixClose t
2a640 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72  o clean up the r
2a650 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69  esources added i
2a660 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  n fillInUnixFile
2a670 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
2a680 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65  nd clear all the
2a690 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66   structure's ref
2a6a0 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66  erences.  Specif
2a6b0 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20  ically, .       
2a6c0 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65     ** pFile->pMe
2a6d0 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55  thods will be NU
2a6e0 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43  LL so sqlite3OsC
2a6f0 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e  lose will be a n
2a700 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20  o-op .          
2a710 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  */.          uni
2a720 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20  xClose(pFile);. 
2a730 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2a740 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2a750 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
2a760 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
2a770 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2a780 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  .  .  rc = fillI
2a790 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
2a7a0 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65  fd, dirfd, pFile
2a7b0 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c  , zPath, noLock,
2a7c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a7d0 20 20 20 20 20 20 20 69 73 44 65 6c 65 74 65 2c         isDelete,
2a7e0 20 69 73 52 65 61 64 6f 6e 6c 79 29 3b 0a 6f 70   isReadonly);.op
2a7f0 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69  en_finished:.  i
2a800 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a810 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2a820 66 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29  free(p->pUnused)
2a830 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a840 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  c;.}.../*.** Del
2a850 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20  ete the file at 
2a860 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69  zPath. If the di
2a870 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69  rSync argument i
2a880 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a  s true, fsync().
2a890 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
2a8a0 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20   after deleting 
2a8b0 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
2a8c0 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65  tic int unixDele
2a8d0 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
2a8e0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20  s *NotUsed,     
2a8f0 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  /* VFS containin
2a900 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44  g this as the xD
2a910 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  elete method */.
2a920 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2a930 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  ath,        /* N
2a940 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62  ame of file to b
2a950 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69  e deleted */.  i
2a960 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20  nt dirSync      
2a970 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
2a980 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72  rue, fsync() dir
2a990 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
2a9a0 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b  eting file */.){
2a9b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2a9c0 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f  TE_OK;.  UNUSED_
2a9d0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2a9e0 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
2a9f0 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
2aa00 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
2aa10 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b 28  );.  if( unlink(
2aa20 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 26 26 20  zPath)==(-1) && 
2aa30 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b  errno!=ENOENT ){
2aa40 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
2aa50 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2aa60 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75  IOERR_DELETE, "u
2aa70 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a  nlink", zPath);.
2aa80 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
2aa90 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
2aaa0 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63  NC.  if( dirSync
2aab0 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a   ){.    int fd;.
2aac0 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72      rc = openDir
2aad0 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66  ectory(zPath, &f
2aae0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
2aaf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
2ab00 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
2ab10 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d    if( fsync(fd)=
2ab20 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20  =-1 ).#else.    
2ab30 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20    if( fsync(fd) 
2ab40 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  ).#endif.      {
2ab50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
2ab60 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
2ab70 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
2ab80 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74  C, "fsync", zPat
2ab90 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
2aba0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30    robust_close(0
2abb0 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
2abc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2abd0 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
2abe0 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  ../*.** Test the
2abf0 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72   existance of or
2ac00 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69   access permissi
2ac10 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74  ons of file zPat
2ac20 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70  h. The.** test p
2ac30 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73  erformed depends
2ac40 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
2ac50 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
2ac60 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
2ac70 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31  EXISTS: Return 1
2ac80 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   if the file exi
2ac90 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  sts.**     SQLIT
2aca0 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
2acb0 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  TE: Return 1 if 
2acc0 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
2acd0 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a   and writable..*
2ace0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
2acf0 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65  ESS_READONLY: Re
2ad00 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
2ad10 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a  le is readable..
2ad20 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  **.** Otherwise 
2ad30 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
2ad40 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65  tic int unixAcce
2ad50 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
2ad60 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a  s *NotUsed,   /*
2ad70 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e   The VFS contain
2ad80 69 6e 67 20 74 68 69 73 20 78 41 63 63 65 73 73  ing this xAccess
2ad90 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
2ada0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
2adb0 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
2adc0 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d  the file to exam
2add0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ine */.  int fla
2ade0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2adf0 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77   /* What do we w
2ae00 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f  ant to learn abo
2ae10 75 74 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c  ut the zPath fil
2ae20 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  e? */.  int *pRe
2ae30 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
2ae40 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20  /* Write result 
2ae50 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a  boolean here */.
2ae60 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d  ){.  int amode =
2ae70 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   0;.  UNUSED_PAR
2ae80 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
2ae90 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
2aea0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
2aeb0 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20  E_IOERR_ACCESS; 
2aec0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61  );.  switch( fla
2aed0 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  gs ){.    case S
2aee0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
2aef0 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  STS:.      amode
2af00 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62   = F_OK;.      b
2af10 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
2af20 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
2af30 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d  DWRITE:.      am
2af40 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b  ode = W_OK|R_OK;
2af50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2af60 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
2af70 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20  CESS_READ:.     
2af80 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20   amode = R_OK;. 
2af90 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
2afa0 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
2afb0 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
2afc0 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
2afd0 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
2afe0 74 20 3d 20 28 6f 73 41 63 63 65 73 73 28 7a 50  t = (osAccess(zP
2aff0 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b  ath, amode)==0);
2b000 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 51  .  if( flags==SQ
2b010 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
2b020 54 53 20 26 26 20 2a 70 52 65 73 4f 75 74 20 29  TS && *pResOut )
2b030 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
2b040 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28 20 30  t buf;.    if( 0
2b050 3d 3d 73 74 61 74 28 7a 50 61 74 68 2c 20 26 62  ==stat(zPath, &b
2b060 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69  uf) && buf.st_si
2b070 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ze==0 ){.      *
2b080 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 20  pResOut = 0;.   
2b090 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2b0a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
2b0b0 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61  *.** Turn a rela
2b0c0 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e  tive pathname in
2b0d0 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61  to a full pathna
2b0e0 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65  me. The relative
2b0f0 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72   path.** is stor
2b100 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d  ed as a nul-term
2b110 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e  inated string in
2b120 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
2b130 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61  ted to by.** zPa
2b140 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20  th. .**.** zOut 
2b150 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
2b160 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73  er of at least s
2b170 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
2b180 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20  hname bytes .** 
2b190 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d  (in this case, M
2b1a0 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65  AX_PATHNAME byte
2b1b0 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74  s). The full-pat
2b1c0 68 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a  h is written to.
2b1d0 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62  ** this buffer b
2b1e0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
2b1f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2b200 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  nixFullPathname(
2b210 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2b220 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
2b230 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
2b240 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  fs object */.  c
2b250 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2b260 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2b270 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76  Possibly relativ
2b280 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  e input path */.
2b290 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20    int nOut,     
2b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2b0 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75  /* Size of outpu
2b2c0 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65  t buffer in byte
2b2d0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75  s */.  char *zOu
2b2e0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2b2f0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
2b300 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f  uffer */.){..  /
2b310 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
2b320 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
2b330 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
2b340 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
2b350 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
2b360 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
2b370 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
2b380 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
2b390 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
2b3a0 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
2b3b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
2b3c0 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
2b3d0 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
2b3e0 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
2b3f0 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ng directory has
2b400 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a   been unlinked..
2b410 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
2b420 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
2b430 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a  QLITE_ERROR );..
2b440 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e    assert( pVfs->
2b450 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f  mxPathname==MAX_
2b460 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e  PATHNAME );.  UN
2b470 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2b480 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f  Vfs);..  zOut[nO
2b490 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut-1] = '\0';.  
2b4a0 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f  if( zPath[0]=='/
2b4b0 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ' ){.    sqlite3
2b4c0 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20  _snprintf(nOut, 
2b4d0 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74  zOut, "%s", zPat
2b4e0 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  h);.  }else{.   
2b4f0 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69   int nCwd;.    i
2b500 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74  f( osGetcwd(zOut
2b510 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a  , nOut-1)==0 ){.
2b520 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
2b530 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
2b540 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
2b550 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29  "getcwd", zPath)
2b560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64  ;.    }.    nCwd
2b570 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
2b580 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
2b590 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d  3_snprintf(nOut-
2b5a0 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64  nCwd, &zOut[nCwd
2b5b0 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68 29  ], "/%s", zPath)
2b5c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
2b5d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69  QLITE_OK;.}...#i
2b5e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b5f0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
2b600 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
2b610 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
2b620 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
2b630 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
2b640 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
2b650 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
2b660 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
2b670 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
2b680 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  y..*/.#include <
2b690 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20  dlfcn.h>.static 
2b6a0 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e  void *unixDlOpen
2b6b0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2b6c0 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61  tUsed, const cha
2b6d0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
2b6e0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2b6f0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
2b700 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c  turn dlopen(zFil
2b710 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20  ename, RTLD_NOW 
2b720 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a  | RTLD_GLOBAL);.
2b730 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  }../*.** SQLite 
2b740 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
2b750 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ion immediately 
2b760 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
2b770 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a  unixDlSym() or.*
2b780 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66  * unixDlOpen() f
2b790 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20  ails (returns a 
2b7a0 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49  null pointer). I
2b7b0 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65  f a more detaile
2b7c0 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61  d error.** messa
2b7d0 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ge is available,
2b7e0 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74   it is written t
2b7f0 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f  o zBufOut. If no
2b800 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
2b810 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  * is available, 
2b820 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20  zBufOut is left 
2b830 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53  unmodified and S
2b840 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65 66  QLite uses a def
2b850 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65  ault.** error me
2b860 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssage..*/.static
2b870 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f   void unixDlErro
2b880 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  r(sqlite3_vfs *N
2b890 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
2b8a0 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
2b8b0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2b8c0 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50  zErr;.  UNUSED_P
2b8d0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2b8e0 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
2b8f0 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20  tex();.  zErr = 
2b900 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  dlerror();.  if(
2b910 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c   zErr ){.    sql
2b920 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
2b930 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73  uf, zBufOut, "%s
2b940 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  ", zErr);.  }.  
2b950 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2b960 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2b970 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69  (*unixDlSym(sqli
2b980 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2b990 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74  , void *p, const
2b9a0 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69   char*zSym))(voi
2b9b0 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47  d){.  /* .  ** G
2b9c0 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  CC with -pedanti
2b9d0 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74 68  c-errors says th
2b9e0 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20  at C90 does not 
2b9f0 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f  allow a void* to
2ba00 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e   be.  ** cast in
2ba10 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  to a pointer to 
2ba20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64  a function.  And
2ba30 20 79 65 74 20 74 68 65 20 6c 69 62 72 61 72 79   yet the library
2ba40 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65   dlsym() routine
2ba50 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  .  ** returns a 
2ba60 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20 72  void* which is r
2ba70 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  eally a pointer 
2ba80 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  to a function.  
2ba90 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a  So how do we.  *
2baa0 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69  * use dlsym() wi
2bab0 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
2bac0 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ors?.  **.  ** V
2bad0 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20  ariable x below 
2bae0 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
2baf0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2bb00 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a  function taking.
2bb10 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20    ** parameters 
2bb20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20  void* and const 
2bb30 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e  char* and return
2bb40 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
2bb50 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a   a function..  *
2bb60 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20  * We initialize 
2bb70 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69  x by assigning i
2bb80 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
2bb90 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74  he dlsym() funct
2bba0 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20  ion..  ** (That 
2bbb0 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69  assignment requi
2bbc0 72 65 73 20 61 20 63 61 73 74 2e 29 20 20 54 68  res a cast.)  Th
2bbd0 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66  en we call the f
2bbe0 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a  unction that.  *
2bbf0 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  * x points to.  
2bc00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
2bc10 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75  work-around is u
2bc20 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20  nlikely to work 
2bc30 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79  correctly on any
2bc40 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20   system where.  
2bc50 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61  ** you really ca
2bc60 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63  nnot cast a func
2bc70 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74  tion pointer int
2bc80 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68  o void*.  But th
2bc90 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  en, on the.  ** 
2bca0 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79  other hand, dlsy
2bcb0 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  m() will not wor
2bcc0 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74  k on such a syst
2bcd0 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65  em either, so we
2bce0 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72   have.  ** not r
2bcf0 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68  eally lost anyth
2bd00 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64  ing..  */.  void
2bd10 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f   (*(*x)(void*,co
2bd20 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64  nst char*))(void
2bd30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2bd40 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2bd50 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29    x = (void(*(*)
2bd60 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
2bd70 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d  r*))(void))dlsym
2bd80 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28  ;.  return (*x)(
2bd90 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74  p, zSym);.}.stat
2bda0 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c  ic void unixDlCl
2bdb0 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
2bdc0 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
2bdd0 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53  pHandle){.  UNUS
2bde0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2bdf0 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65  Used);.  dlclose
2be00 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  (pHandle);.}.#el
2be10 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
2be20 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
2be30 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
2be40 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69  */.  #define uni
2be50 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65  xDlOpen  0.  #de
2be60 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72  fine unixDlError
2be70 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
2be80 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  xDlSym   0.  #de
2be90 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65  fine unixDlClose
2bea0 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
2beb0 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65   Write nBuf byte
2bec0 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61  s of random data
2bed0 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
2bee0 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f   buffer zBuf..*/
2bef0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2bf00 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
2bf10 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2bf20 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
2bf30 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
2bf40 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2bf50 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73  ed);.  assert((s
2bf60 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a  ize_t)nBuf>=(siz
2bf70 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65  eof(time_t)+size
2bf80 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a  of(int)));..  /*
2bf90 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74   We have to init
2bfa0 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70  ialize zBuf to p
2bfb0 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20  revent valgrind 
2bfc0 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20  from reporting. 
2bfd0 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65   ** errors.  The
2bfe0 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20   reports issued 
2bff0 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20  by valgrind are 
2c000 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77  incorrect - we w
2c010 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72  ould.  ** prefer
2c020 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d   that the random
2c030 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65  ness be increase
2c040 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20  d by making use 
2c050 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e  of the.  ** unin
2c060 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
2c070 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61  in zBuf - but va
2c080 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65  lgrind errors te
2c090 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a  nd to worry.  **
2c0a0 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61   some users.  Ra
2c0b0 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c  ther than argue,
2c0c0 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72   it seems easier
2c0d0 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c   just to initial
2c0e0 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f  ize.  ** the who
2c0f0 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c  le array and sil
2c100 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65  ence valgrind, e
2c110 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
2c120 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73  s less randomnes
2c130 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61  s.  ** in the ra
2c140 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a  ndom seed..  **.
2c150 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e    ** When testin
2c160 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  g, initializing 
2c170 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69  zBuf[] to zero i
2c180 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68  s all we do.  Th
2c190 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68  at means.  ** th
2c1a0 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  at we always use
2c1b0 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d   the same random
2c1c0 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65   number sequence
2c1d0 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68  .  This makes th
2c1e0 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70  e.  ** tests rep
2c1f0 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  eatable..  */.  
2c200 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
2c210 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66 69  nBuf);.#if !defi
2c220 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
2c230 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64  .  {.    int pid
2c240 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20 72  , fd;.    fd = r
2c250 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76  obust_open("/dev
2c260 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
2c270 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  NLY, 0);.    if(
2c280 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74   fd<0 ){.      t
2c290 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74  ime_t t;.      t
2c2a0 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d  ime(&t);.      m
2c2b0 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20  emcpy(zBuf, &t, 
2c2c0 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20  sizeof(t));.    
2c2d0 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28 29    pid = getpid()
2c2e0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
2c2f0 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c  zBuf[sizeof(t)],
2c300 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69   &pid, sizeof(pi
2c310 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d));.      asser
2c320 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a  t( sizeof(t)+siz
2c330 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f  eof(pid)<=(size_
2c340 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20  t)nBuf );.      
2c350 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29  nBuf = sizeof(t)
2c360 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a   + sizeof(pid);.
2c370 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c380 20 64 6f 7b 20 6e 42 75 66 20 3d 20 6f 73 52 65   do{ nBuf = osRe
2c390 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75  ad(fd, zBuf, nBu
2c3a0 66 29 3b 20 7d 77 68 69 6c 65 28 20 6e 42 75 66  f); }while( nBuf
2c3b0 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
2c3c0 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75  TR );.      robu
2c3d0 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20  st_close(0, fd, 
2c3e0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
2c3f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
2c400 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f  turn nBuf;.}.../
2c410 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
2c420 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
2c430 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
2c440 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
2c450 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
2c460 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2c470 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77  f microseconds w
2c480 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e  e want to sleep.
2c490 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
2c4a0 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
2c4b0 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
2c4c0 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75  ds of sleep actu
2c4d0 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65  ally.** requeste
2c4e0 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72  d from the under
2c4f0 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
2c500 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72  system, a number
2c510 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
2c520 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
2c530 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
2c540 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  argument, but no
2c550 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74  t less.** than t
2c560 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
2c570 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
2c580 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
2c590 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d   *NotUsed, int m
2c5a0 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69  icroseconds){.#i
2c5b0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
2c5c0 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73  truct timespec s
2c5d0 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20  p;..  sp.tv_sec 
2c5e0 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f  = microseconds /
2c5f0 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74   1000000;.  sp.t
2c600 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73  v_nsec = (micros
2c610 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30  econds % 1000000
2c620 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f  ) * 1000;.  nano
2c630 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29  sleep(&sp, NULL)
2c640 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2c650 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2c660 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
2c670 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69  onds;.#elif defi
2c680 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
2c690 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   && HAVE_USLEEP.
2c6a0 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65    usleep(microse
2c6b0 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
2c6c0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2c6d0 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ed);.  return mi
2c6e0 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73  croseconds;.#els
2c6f0 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20  e.  int seconds 
2c700 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b  = (microseconds+
2c710 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b  999999)/1000000;
2c720 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73  .  sleep(seconds
2c730 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2c740 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2c750 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73    return seconds
2c760 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66  *1000000;.#endif
2c770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
2c780 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
2c790 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
2c7a0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73  n-zero value, is
2c7b0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a   interpreted as.
2c7c0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
2c7d0 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
2c7e0 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20  970 and is used 
2c7f0 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  to set the resul
2c800 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  t of.** sqlite3O
2c810 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64  sCurrentTime() d
2c820 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a  uring testing..*
2c830 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2c840 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
2c850 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
2c860 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74  0;  /* Fake syst
2c870 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e  em time in secon
2c880 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a  ds since 1970. *
2c890 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
2c8a0 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
2c8b0 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
2c8c0 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
2c8d0 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e  Time).  Write in
2c8e0 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65  to *piNow.** the
2c8f0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
2c900 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
2c910 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69  an Day number ti
2c920 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20  mes 86_400_000. 
2c930 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72   In.** other wor
2c940 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a  ds, write into *
2c950 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72  piNow the number
2c960 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
2c970 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61   since the Julia
2c980 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f  n.** epoch of no
2c990 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20  on in Greenwich 
2c9a0 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20  on November 24, 
2c9b0 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69  4714 B.C accordi
2c9c0 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f  ng to the.** pro
2c9d0 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e  leptic Gregorian
2c9e0 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a   calendar..**.**
2c9f0 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   On success, ret
2ca00 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
2ca10 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
2ca20 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
2ca30 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
2ca40 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74   int unixCurrent
2ca50 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
2ca60 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2ca70 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
2ca80 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20  iNow){.  static 
2ca90 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
2caa0 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20  t64 unixEpoch = 
2cab0 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65  24405875*(sqlite
2cac0 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
2cad0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
2cae0 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74  GETTOD).  time_t
2caf0 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a   t;.  time(&t);.
2cb00 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c    *piNow = ((sql
2cb10 69 74 65 33 5f 69 6e 74 36 34 29 74 29 2a 31 30  ite3_int64)t)*10
2cb20 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  00 + unixEpoch;.
2cb30 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  #elif OS_VXWORKS
2cb40 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
2cb50 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b  ec sNow;.  clock
2cb60 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52  _gettime(CLOCK_R
2cb70 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b  EALTIME, &sNow);
2cb80 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78  .  *piNow = unix
2cb90 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71  Epoch + 1000*(sq
2cba0 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77  lite3_int64)sNow
2cbb0 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74  .tv_sec + sNow.t
2cbc0 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b 0a  v_nsec/1000000;.
2cbd0 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74  #else.  struct t
2cbe0 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 67  imeval sNow;.  g
2cbf0 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f  ettimeofday(&sNo
2cc00 77 2c 20 30 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  w, 0);.  *piNow 
2cc10 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30  = unixEpoch + 10
2cc20 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
2cc30 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20  4)sNow.tv_sec + 
2cc40 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30  sNow.tv_usec/100
2cc50 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  0;.#endif..#ifde
2cc60 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
2cc70 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
2cc80 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
2cc90 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73  *piNow = 1000*(s
2cca0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c  qlite3_int64)sql
2ccb0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
2ccc0 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20  e + unixEpoch;. 
2ccd0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53   }.#endif.  UNUS
2cce0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2ccf0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
2cd00 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  0;.}../*.** Find
2cd10 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
2cd20 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
2cd30 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
2cd40 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  ).  Write the.**
2cd50 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
2cd60 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
2cd70 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e  an Day number in
2cd80 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a  to *prNow and.**
2cd90 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
2cda0 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
2cdb0 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
2cdc0 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
2cdd0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
2cde0 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
2cdf0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64  _vfs *NotUsed, d
2ce00 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20  ouble *prNow){. 
2ce10 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
2ce20 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2ce30 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2ce40 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
2ce50 49 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20  Int64(0, &i);.  
2ce60 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30  *prNow = i/86400
2ce70 30 30 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20  000.0;.  return 
2ce80 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61  0;.}../*.** We a
2ce90 64 64 65 64 20 74 68 65 20 78 47 65 74 4c 61 73  dded the xGetLas
2cea0 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20  tError() method 
2ceb0 77 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74 69  with the intenti
2cec0 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a  on of providing.
2ced0 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65  ** better low-le
2cee0 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67  vel error messag
2cef0 65 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e  es when operatin
2cf00 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d  g-system problem
2cf10 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72  s come up.** dur
2cf20 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61  ing SQLite opera
2cf30 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66 61  tion.  But so fa
2cf40 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20  r, none of that 
2cf50 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65  has been impleme
2cf60 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63  nted.** in the c
2cf70 6f 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72 6f  ore.  So this ro
2cf80 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
2cf90 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c  alled.  For now,
2cfa0 20 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a   it is merely.**
2cfb0 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e   a place-holder.
2cfc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2cfd0 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  nixGetLastError(
2cfe0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2cff0 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
2d000 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65  d2, char *NotUse
2d010 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d3){.  UNUSED_PA
2d020 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2d030 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2d040 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a  ETER(NotUsed2);.
2d050 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2d060 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20  ER(NotUsed3);.  
2d070 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
2d080 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2d090 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
2d0a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
2d0b0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
2d0c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d0d0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2d0e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d0f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
2d120 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
2d130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d170 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
2d180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
2d190 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67  in Proxy Locking
2d1a0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
2d1b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d1c0 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f  *.**.** Proxy lo
2d1d0 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65 72  cking is a "uber
2d1e0 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22  -locking-method"
2d1f0 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20   in this sense: 
2d200 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20   It uses the.** 
2d210 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65  other locking me
2d220 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61  thods on seconda
2d230 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20  ry lock files.  
2d240 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
2d250 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72   a.** meta-layer
2d260 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65   over top of the
2d270 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69   primitive locki
2d280 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  ng implemented a
2d290 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  bove.  For.** th
2d2a0 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64  is reason, the d
2d2b0 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70  ivision that imp
2d2c0 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79  lements of proxy
2d2d0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65   locking is defe
2d2e0 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61  rred.** until la
2d2f0 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28  te in the file (
2d300 68 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20  here) after all 
2d310 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f  of the other I/O
2d320 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a   methods have.**
2d330 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20   been defined - 
2d340 73 6f 20 74 68 61 74 20 74 68 65 20 70 72 69 6d  so that the prim
2d350 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  itive locking me
2d360 74 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61  thods are availa
2d370 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63  ble.** as servic
2d380 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20  es to help with 
2d390 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
2d3a0 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b  on of proxy lock
2d3b0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a  ing..**.****.**.
2d3c0 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c  ** The default l
2d3d0 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69  ocking schemes i
2d3e0 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79 74  n SQLite use byt
2d3f0 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e  e-range locks on
2d400 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2d410 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e   file to coordin
2d420 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72  ate safe, concur
2d430 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d  rent access by m
2d440 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a  ultiple readers.
2d450 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b  ** and writers [
2d460 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  http://sqlite.or
2d470 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c  g/lockingv3.html
2d480 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69 6c  ].  The five fil
2d490 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61  e locking.** sta
2d4a0 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50  tes (UNLOCKED, P
2d4b0 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20  ENDING, SHARED, 
2d4c0 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53  RESERVED, EXCLUS
2d4d0 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  IVE) are impleme
2d4e0 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58  nted.** as POSIX
2d4f0 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f   read & write lo
2d500 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20 73  cks over fixed s
2d510 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20  et of locations 
2d520 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20  (via fsctl),.** 
2d530 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f  on AFP and SMB o
2d540 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62 79  nly exclusive by
2d550 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
2d560 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61  re available via
2d570 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f   fsctl.** with _
2d580 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
2d590 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
2d5a0 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20  ckPB2) to track 
2d5b0 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74 65  the same 5 state
2d5c0 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74  s..** To simulat
2d5d0 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74  e a F_RDLCK on t
2d5e0 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c  he shared range,
2d5f0 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d   on AFP a random
2d600 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61  ly selected.** a
2d610 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73 68  ddress in the sh
2d620 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
2d630 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44  ken for a SHARED
2d640 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72   lock, the entir
2d650 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67  e.** shared rang
2d660 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
2d670 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2d680 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45  ):.**.**      PE
2d690 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20  NDING_BYTE      
2d6a0 20 20 30 78 34 30 30 30 30 30 30 30 09 09 20 20    0x40000000..  
2d6b0 20 09 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52   ..**      RESER
2d6c0 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20 30  VED_BYTE       0
2d6d0 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20  x40000001.**    
2d6e0 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20    SHARED_RANGE  
2d6f0 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 32        0x40000002
2d700 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a   -> 0x40000200.*
2d710 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
2d720 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  well on the loca
2d730 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62  l file system, b
2d740 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c  ut shows a nearl
2d750 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f  y 100x.** slowdo
2d760 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f  wn in read perfo
2d770 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65  rmance on AFP be
2d780 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63 6c  cause the AFP cl
2d790 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a  ient disables.**
2d7a0 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65 20   the read cache 
2d7b0 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20  when byte-range 
2d7c0 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e  locks are presen
2d7d0 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65  t.  Enabling the
2d7e0 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65   read.** cache e
2d7f0 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20 63  xposes a cache c
2d800 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d  oherency problem
2d810 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74   that is present
2d820 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20   on all OS X.** 
2d830 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72  supported networ
2d840 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20  k file systems. 
2d850 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74   NFS and AFP bot
2d860 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a  h observe the.**
2d870 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73   close-to-open s
2d880 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73  emantics for ens
2d890 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65  uring cache cohe
2d8a0 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f  rency.** [http:/
2d8b0 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65  /nfs.sourceforge
2d8c0 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77  .net/#faq_a8], w
2d8d0 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66  hich does not ef
2d8e0 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64  fectively.** add
2d8f0 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72 65  ress the require
2d900 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72  ments for concur
2d910 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61 63  rent database ac
2d920 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65  cess by multiple
2d930 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20  .** readers and 
2d940 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70  writers.** [http
2d950 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f  ://www.nabble.co
2d960 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d  m/SQLite-on-NFS-
2d970 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d  cache-coherency-
2d980 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d  td15655701.html]
2d990 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65  ..**.** To addre
2d9a0 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e  ss the performan
2d9b0 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68  ce and cache coh
2d9c0 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70  erency issues, p
2d9d0 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  roxy file lockin
2d9e0 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65  g.** changes the
2d9f0 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61 63   way database ac
2da00 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c  cess is controll
2da10 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61  ed by limiting a
2da20 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69  ccess to a.** si
2da30 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74  ngle host at a t
2da40 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66  ime and moving f
2da50 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66  ile locks off of
2da60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2da70 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61  le.** and onto a
2da80 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74   proxy file on t
2da90 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
2daa0 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a  stem.  .**.**.**
2dab0 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63   Using proxy loc
2dac0 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ks.** ----------
2dad0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20  -------.**.** C 
2dae0 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69  APIs.**.**  sqli
2daf0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
2db00 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c  (db, dbname, SQL
2db10 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
2db20 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20  YFILE,.**       
2db30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db40 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22  <proxy_path> | "
2db50 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71  :auto:");.**  sq
2db60 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
2db70 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
2db80 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
2db90 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78 79  OXYFILE, &<proxy
2dba0 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a  _path>);.**.**.*
2dbb0 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a  * SQL pragmas.**
2dbc0 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74  .**  PRAGMA [dat
2dbd0 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  abase.]lock_prox
2dbe0 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61  y_file=<proxy_pa
2dbf0 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20  th> | :auto:.** 
2dc00 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
2dc10 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
2dc20 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79  le.**.** Specify
2dc30 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61  ing ":auto:" mea
2dc40 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72 65  ns that if there
2dc50 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65   is a conch file
2dc60 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67   with a matching
2dc70 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69  .** host ID in i
2dc80 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61 74  t, the proxy pat
2dc90 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  h in the conch f
2dca0 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ile will be used
2dcb0 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61  , otherwise.** a
2dcc0 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73 65   proxy path base
2dcd0 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20  d on the user's 
2dce0 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61  temp dir.** (via
2dcf0 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52   confstr(_CS_DAR
2dd00 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
2dd10 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20  R,...)) will be 
2dd20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
2dd30 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c  actual proxy fil
2dd40 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61  e name is genera
2dd50 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d  ted from the nam
2dd60 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68  e and path of th
2dd70 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
2dd80 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  le.  For example
2dd90 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f  :.**.**       Fo
2dda0 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68 20  r database path 
2ddb0 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64  "/Users/me/foo.d
2ddc0 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65  b" .**       The
2ddd0 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20   lock path will 
2dde0 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c  be "<tmpdir>/sql
2ddf0 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73  iteplocks/_Users
2de00 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a  _me_foo.db:auto:
2de10 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20  ").**.** Once a 
2de20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f  lock proxy is co
2de30 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20 64  nfigured for a d
2de40 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2de50 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a  on, it can not.*
2de60 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f  * be removed, ho
2de70 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65 20  wever it may be 
2de80 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64 69  switched to a di
2de90 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61  fferent proxy pa
2dea0 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62  th via.** the ab
2deb0 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d 69  ove APIs (assumi
2dec0 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  ng the conch fil
2ded0 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68  e is not being h
2dee0 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a  eld by another.*
2def0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20  * connection or 
2df00 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a  process). .**.**
2df10 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f  .** How proxy lo
2df20 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d  cking works.** -
2df30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2df40 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f  ------.**.** Pro
2df50 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  xy file locking 
2df60 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79  relies primarily
2df70 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70   on two new supp
2df80 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a  orting files: .*
2df90 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20  *.**   *  conch 
2dfa0 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63  file to limit ac
2dfb0 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
2dfc0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73  base file to a s
2dfd0 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20  ingle host.**   
2dfe0 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a     at a time.**.
2dff0 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69  **   *  proxy fi
2e000 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20 70  le to act as a p
2e010 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64 76  roxy for the adv
2e020 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d  isory locks norm
2e030 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b  ally.**      tak
2e040 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
2e050 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  se.**.** The con
2e060 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65  ch file - to use
2e070 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73   a proxy file, s
2e080 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73 74  qlite must first
2e090 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68   "hold the conch
2e0a0 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61  ".** by taking a
2e0b0 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73  n sqlite-style s
2e0c0 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
2e0d0 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65  e conch file, re
2e0e0 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  ading the.** con
2e0f0 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72  tents and compar
2e100 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20 75  ing the host's u
2e110 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28 73  nique host ID (s
2e120 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f  ee below) and lo
2e130 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68  ck.** proxy path
2e140 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c   against the val
2e150 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
2e160 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f  e conch.  The co
2e170 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73  nch file is.** s
2e180 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d  tored in the sam
2e190 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74  e directory as t
2e1a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e1b0 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61   and the file na
2e1c0 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e  me.** is pattern
2e1d0 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61 74  ed after the dat
2e1e0 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2e1f0 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61  as ".<databasena
2e200 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49  me>-conch"..** I
2e210 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
2e220 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
2e230 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e 74   or it's content
2e240 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74  s do not match t
2e250 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e  he.** host ID an
2e260 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c  d/or proxy path,
2e270 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69   then the lock i
2e280 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61  s escalated to a
2e290 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c  n exclusive.** l
2e2a0 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63  ock and the conc
2e2b0 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20  h file contents 
2e2c0 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20  is updated with 
2e2d0 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20  the host ID and 
2e2e0 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e  proxy.** path an
2e2f0 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f  d the lock is do
2e300 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73 68  wngraded to a sh
2e310 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e  ared lock again.
2e320 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a    If the conch.*
2e330 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f  * is held by ano
2e340 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 77 69  ther process (wi
2e350 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  th a shared lock
2e360 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ), the exclusive
2e370 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61   lock.** will fa
2e380 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55  il and SQLITE_BU
2e390 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  SY is returned..
2e3a0 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  **.** The proxy 
2e3b0 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d  file - a single-
2e3c0 62 79 74 65 20 66 69 6c 65 20 75 73 65 64 20 66  byte file used f
2e3d0 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20  or all advisory 
2e3e0 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f  file locks.** no
2e3f0 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20  rmally taken on 
2e400 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e410 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  e.   This allows
2e420 20 66 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e   for safe sharin
2e430 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  g.** of the data
2e440 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75  base file for mu
2e450 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61  ltiple readers a
2e460 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68  nd writers on th
2e470 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28  e same.** host (
2e480 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65  the conch ensure
2e490 73 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20  s that they all 
2e4a0 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63  use the same loc
2e4b0 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a  al lock file)..*
2e4c0 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20  *.** Requesting 
2e4d0 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64  the lock proxy d
2e4e0 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74  oes not immediat
2e4f0 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e  ely take the con
2e500 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c  ch, it is.** onl
2e510 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65  y taken when the
2e520 20 66 69 72 73 74 20 72 65 71 75 65 73 74 20 74   first request t
2e530 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20  o lock database 
2e540 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a  file is made.  .
2e550 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  ** This matches 
2e560 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66  the semantics of
2e570 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c   the traditional
2e580 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   locking behavio
2e590 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e  r, where.** open
2e5a0 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ing a connection
2e5b0 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
2e5c0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b  ile does not tak
2e5d0 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a  e a lock on it..
2e5e0 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f  ** The shared lo
2e5f0 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66  ck and an open f
2e600 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
2e610 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e  re maintained un
2e620 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e  til .** the conn
2e630 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61  ection to the da
2e640 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64  tabase is closed
2e650 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  . .**.** The pro
2e660 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  xy file and the 
2e670 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65  lock file are ne
2e680 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74  ver deleted so t
2e690 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a  hey only need.**
2e6a0 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 74   to be created t
2e6b0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
2e6c0 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a  ey are used..**.
2e6d0 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ** Configuration
2e6e0 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d   options.** ----
2e6f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e700 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f  -.**.**  SQLITE_
2e710 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
2e720 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  KING.**.**      
2e730 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   Database files 
2e740 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d  accessed on non-
2e750 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
2e760 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20  ms are.**       
2e770 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f  automatically co
2e780 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f  nfigured for pro
2e790 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b  xy locking, lock
2e7a0 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20   files are.**   
2e7b0 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61      named automa
2e7c0 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68  tically using th
2e7d0 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a  e same logic as.
2e7e0 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41 20  **       PRAGMA 
2e7f0 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
2e800 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a  ":auto:".**    .
2e810 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59  **  SQLITE_PROXY
2e820 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20  _DEBUG.**.**    
2e830 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c     Enables the l
2e840 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20  ogging of error 
2e850 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67 20  messages during 
2e860 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20  host id file.** 
2e870 20 20 20 20 20 20 72 65 74 72 69 65 76 61 6c 20        retrieval 
2e880 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a  and creation.**.
2e890 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  **  LOCKPROXYDIR
2e8a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65  .**.**       Ove
2e8b0 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61 75  rrides the defau
2e8c0 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73 65  lt directory use
2e8d0 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79  d for lock proxy
2e8e0 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20   files that.**  
2e8f0 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61       are named a
2e900 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61  utomatically via
2e910 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65   the ":auto:" se
2e920 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c  tting.**.**  SQL
2e930 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
2e940 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
2e950 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72  .**.**       Per
2e960 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20  missions to use 
2e970 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20  when creating a 
2e980 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74  directory for st
2e990 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20  oring the.**    
2e9a0 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69     lock proxy fi
2e9b0 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77  les, only used w
2e9c0 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  hen LOCKPROXYDIR
2e9d0 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20   is not set..** 
2e9e0 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73     .**    .** As
2e9f0 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65   mentioned above
2ea00 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20  , when compiled 
2ea10 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46  with SQLITE_PREF
2ea20 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
2ea30 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65  ,.** setting the
2ea40 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
2ea50 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52  iable SQLITE_FOR
2ea60 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
2ea70 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f   to 1 will.** fo
2ea80 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  rce proxy lockin
2ea90 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  g to be used for
2eaa0 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
2eab0 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64  file opened, and
2eac0 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65   0.** will force
2ead0 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79   automatic proxy
2eae0 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64   locking to be d
2eaf0 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20  isabled for all 
2eb00 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
2eb10 73 20 28 65 78 70 6c 69 63 69 74 79 20 63 61 6c  s (explicity cal
2eb20 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f  ling the SQLITE_
2eb30 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
2eb40 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73  E pragma or.** s
2eb50 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72  qlite_file_contr
2eb60 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66  ol API is not af
2eb70 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54 45  fected by SQLITE
2eb80 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
2eb90 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  KING)..*/../*.**
2eba0 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
2ebb0 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
2ebc0 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23   on MacOSX .*/.#
2ebd0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2ebe0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2ebf0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2ec00 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  TYLE../*.** The 
2ec10 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2ec20 65 78 74 20 68 61 73 20 74 68 65 20 70 61 74 68  ext has the path
2ec30 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74   and file struct
2ec40 75 72 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d  ures for the rem
2ec50 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61  ote .** and loca
2ec60 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e  l proxy files in
2ec70 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73   it.*/.typedef s
2ec80 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69  truct proxyLocki
2ec90 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c  ngContext proxyL
2eca0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73  ockingContext;.s
2ecb0 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69  truct proxyLocki
2ecc0 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e  ngContext {.  un
2ecd0 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
2ece0 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  e;         /* Op
2ecf0 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  en conch file */
2ed00 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69  .  char *conchFi
2ed10 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  lePath;         
2ed20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
2ed30 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75  onch file */.  u
2ed40 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
2ed50 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  xy;         /* O
2ed60 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  pen proxy lock f
2ed70 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c  ile */.  char *l
2ed80 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20  ockProxyPath;   
2ed90 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2eda0 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
2edb0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2edc0 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  dbPath;         
2edd0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2ede0 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
2edf0 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65  */.  int conchHe
2ee00 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
2ee10 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f    /* 1 if the co
2ee20 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20  nch is held, -1 
2ee30 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20  if lockless */. 
2ee40 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e   void *oldLockin
2ee50 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a  gContext;     /*
2ee60 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e   Original lockin
2ee70 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74  gcontext to rest
2ee80 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a  ore on close */.
2ee90 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74    sqlite3_io_met
2eea0 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64  hods const *pOld
2eeb0 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f  Method;     /* O
2eec0 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68  riginal I/O meth
2eed0 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f  ods for close */
2eee0 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20  .};../* .** The 
2eef0 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
2ef00 70 61 74 68 20 66 6f 72 20 74 68 65 20 64 61 74  path for the dat
2ef10 61 62 61 73 65 20 61 74 20 64 62 50 61 74 68 20  abase at dbPath 
2ef20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2ef30 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68  lPath, .** which
2ef40 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76   must point to v
2ef50 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d  alid, writable m
2ef60 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75  emory large enou
2ef70 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20  gh for a maxLen 
2ef80 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70  length.** file p
2ef90 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ath. .*/.static 
2efa0 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b  int proxyGetLock
2efb0 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  Path(const char 
2efc0 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c  *dbPath, char *l
2efd0 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78  Path, size_t max
2efe0 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b  Len){.  int len;
2eff0 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20  .  int dbLen;.  
2f000 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c  int i;..#ifdef L
2f010 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65  OCKPROXYDIR.  le
2f020 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74  n = strlcpy(lPat
2f030 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c  h, LOCKPROXYDIR,
2f040 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a   maxLen);.#else.
2f050 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57  # ifdef _CS_DARW
2f060 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
2f070 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f  .  {.    if( !co
2f080 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e  nfstr(_CS_DARWIN
2f090 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20  _USER_TEMP_DIR, 
2f0a0 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29  lPath, maxLen) )
2f0b0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
2f0c0 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66  ("GETLOCKPATH  f
2f0d0 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25  ailed %s errno=%
2f0e0 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  d pid=%d\n",.   
2f0f0 20 20 20 20 20 20 20 20 20 20 20 20 6c 50 61 74              lPat
2f100 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69 64  h, errno, getpid
2f110 28 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ()));.      retu
2f120 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2f130 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LOCK;.    }.    
2f140 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50  len = strlcat(lP
2f150 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63  ath, "sqliteploc
2f160 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20  ks", maxLen);   
2f170 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c   .  }.# else.  l
2f180 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61  en = strlcpy(lPa
2f190 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78  th, "/tmp/", max
2f1a0 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65  Len);.# endif.#e
2f1b0 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74  ndif..  if( lPat
2f1c0 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b  h[len-1]!='/' ){
2f1d0 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  .    len = strlc
2f1e0 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d  at(lPath, "/", m
2f1f0 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20  axLen);.  }.  . 
2f200 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68   /* transform th
2f210 65 20 64 62 20 70 61 74 68 20 74 6f 20 61 20 75  e db path to a u
2f220 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65  nique cache name
2f230 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69   */.  dbLen = (i
2f240 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68  nt)strlen(dbPath
2f250 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69  );.  for( i=0; i
2f260 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e  <dbLen && (i+len
2f270 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b  +7)<(int)maxLen;
2f280 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
2f290 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20  c = dbPath[i];. 
2f2a0 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20     lPath[i+len] 
2f2b0 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63  = (c=='/')?'_':c
2f2c0 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b  ;.  }.  lPath[i+
2f2d0 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72  len]='\0';.  str
2f2e0 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75  lcat(lPath, ":au
2f2f0 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20  to:", maxLen);. 
2f300 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f   OSTRACE(("GETLO
2f310 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f  CKPATH  proxy lo
2f320 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
2f330 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74  d\n", lPath, get
2f340 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72  pid()));.  retur
2f350 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2f360 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20  /* . ** Creates 
2f370 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e  the lock file an
2f380 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69  d any missing di
2f390 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63  rectories in loc
2f3a0 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63  kPath. */.static
2f3b0 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65   int proxyCreate
2f3c0 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
2f3d0 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a  har *lockPath){.
2f3e0 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20    int i, len;.  
2f3f0 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48  char buf[MAXPATH
2f400 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72  LEN];.  int star
2f410 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65  t = 0;.  .  asse
2f420 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c  rt(lockPath!=NUL
2f430 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20  L);.  /* try to 
2f440 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69  create all the i
2f450 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72 65  ntermediate dire
2f460 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e  ctories */.  len
2f470 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c   = (int)strlen(l
2f480 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b  ockPath);.  buf[
2f490 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d  0] = lockPath[0]
2f4a0 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c  ;.  for( i=1; i<
2f4b0 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  len; i++ ){.    
2f4c0 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20  if( lockPath[i] 
2f4d0 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73  == '/' && (i - s
2f4e0 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20  tart > 0) ){.   
2f4f0 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72     /* only mkdir
2f500 20 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20   if leaf dir != 
2f510 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e  "." or "/" or ".
2f520 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ." */.      if( 
2f530 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d  i-start>2 || (i-
2f540 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b  start==1 && buf[
2f550 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26  start] != '.' &&
2f560 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
2f570 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  /') .         ||
2f580 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20   (i-start==2 && 
2f590 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e  buf[start] != '.
2f5a0 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31  ' && buf[start+1
2f5b0 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20  ] != '.') ){.   
2f5c0 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27       buf[i]='\0'
2f5d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 6b  ;.        if( mk
2f5e0 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f  dir(buf, SQLITE_
2f5f0 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
2f600 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b  _PERMISSIONS) ){
2f610 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65  .          int e
2f620 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rr=errno;.      
2f630 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58      if( err!=EEX
2f640 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20  IST ) {.        
2f650 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43 52      OSTRACE(("CR
2f660 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41  EATELOCKPATH  FA
2f670 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73  ILED creating %s
2f680 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
2f690 20 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70           "'%s' p
2f6a0 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
2f6b0 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  s pid=%d\n",.   
2f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6d0 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28    buf, strerror(
2f6e0 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  err), lockPath, 
2f6f0 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20  getpid()));.    
2f700 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 65          return e
2f710 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rr;.          }.
2f720 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f730 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69 2b  }.      start=i+
2f740 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75 66  1;.    }.    buf
2f750 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69  [i] = lockPath[i
2f760 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  ];.  }.  OSTRACE
2f770 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54  (("CREATELOCKPAT
2f780 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  H  proxy lock pa
2f790 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
2f7a0 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69   lockPath, getpi
2f7b0 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  d()));.  return 
2f7c0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
2f7d0 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c  te a new VFS fil
2f7e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73 74  e descriptor (st
2f7f0 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  ored in memory o
2f800 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
2f810 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
2f820 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c  and open the fil
2f830 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69  e named "path" i
2f840 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  n the file descr
2f850 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iptor..**.** The
2f860 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
2f870 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20  nsible not only 
2f880 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  for closing the 
2f890 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
2f8a0 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20  ** but also for 
2f8b0 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f  freeing the memo
2f8c0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
2f8d0 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  th the file desc
2f8e0 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  riptor..*/.stati
2f8f0 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
2f900 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20 63  eUnixFile(.    c
2f910 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
2f920 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68 20          /* path 
2f930 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
2f940 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78  File */.    unix
2f950 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20  File **ppFile,  
2f960 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65       /* unixFile
2f970 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 65 74   created and ret
2f980 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f 0a  urned by ref */.
2f990 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69      int islockfi
2f9a0 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le           /* 
2f9b0 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73  if non zero miss
2f9c0 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62 65  ing dirs will be
2f9d0 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a   created */.) {.
2f9e0 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
2f9f0 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b   int dirfd = -1;
2fa00 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
2fa10 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
2fa20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f  LITE_OK;.  int o
2fa30 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57  penFlags = O_RDW
2fa40 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73  R | O_CREAT;.  s
2fa50 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79  qlite3_vfs dummy
2fa60 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e  Vfs;.  int terrn
2fa70 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75  o = 0;.  UnixUnu
2fa80 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
2fa90 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20   NULL;..  /* 1. 
2faa0 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65  first try to ope
2fab0 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c  n/create the fil
2fac0 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61  e.  ** 2. if tha
2fad0 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69  t fails, and thi
2fae0 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65  s is a lock file
2faf0 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72   (not-conch), tr
2fb00 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20  y creating.  ** 
2fb10 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63  the parent direc
2fb20 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20  tories and then 
2fb30 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20  try again..  ** 
2fb40 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  3. if that fails
2fb50 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68  , try to open th
2fb60 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79  e file read-only
2fb70 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  .  ** otherwise 
2fb80 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66 20  return BUSY (if 
2fb90 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41  lock file) or CA
2fba0 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63  NTOPEN for the c
2fbb0 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20  onch file.  */. 
2fbc0 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52   pUnused = findR
2fbd0 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20  eusableFd(path, 
2fbe0 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66  openFlags);.  if
2fbf0 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
2fc00 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66   fd = pUnused->f
2fc10 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
2fc20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65  pUnused = sqlite
2fc30 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
2fc40 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20  *pUnused));.    
2fc50 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a  if( !pUnused ){.
2fc60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2fc70 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2fc80 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
2fc90 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  ){.    fd = robu
2fca0 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
2fcb0 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f  enFlags, SQLITE_
2fcc0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
2fcd0 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74  MISSIONS);.    t
2fce0 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  errno = errno;. 
2fcf0 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65     if( fd<0 && e
2fd00 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20  rrno==ENOENT && 
2fd10 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20  islockfile ){.  
2fd20 20 20 20 20 69 66 28 20 70 72 6f 78 79 43 72 65      if( proxyCre
2fd30 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68  ateLockPath(path
2fd40 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  ) == SQLITE_OK )
2fd50 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20 72  {.        fd = r
2fd60 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c  obust_open(path,
2fd70 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49   openFlags, SQLI
2fd80 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
2fd90 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
2fda0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2fdb0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
2fdc0 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f    openFlags = O_
2fdd0 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d  RDONLY;.    fd =
2fde0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
2fdf0 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51  h, openFlags, SQ
2fe00 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2fe10 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
2fe20 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72      terrno = err
2fe30 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64  no;.  }.  if( fd
2fe40 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  <0 ){.    if( is
2fe50 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20  lockfile ){.    
2fe60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fe70 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BUSY;.    }.    
2fe80 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20  switch (terrno) 
2fe90 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45 41 43  {.      case EAC
2fea0 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74  CES:.        ret
2feb0 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
2fec0 0a 20 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a  .      case EIO:
2fed0 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e   .        return
2fee0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
2fef0 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75  CK; /* even thou
2ff00 67 68 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e  gh it is the con
2ff10 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61  ch */.      defa
2ff20 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74  ult:.        ret
2ff30 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
2ff40 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
2ff50 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20    }.  .  pNew = 
2ff60 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69  (unixFile *)sqli
2ff70 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
2ff80 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28  f(*pNew));.  if(
2ff90 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20   pNew==NULL ){. 
2ffa0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2ffb0 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65  OMEM;.    goto e
2ffc0 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b  nd_create_proxy;
2ffd0 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e  .  }.  memset(pN
2ffe0 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  ew, 0, sizeof(un
2fff0 69 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77  ixFile));.  pNew
30000 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70  ->openFlags = op
30010 65 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65  enFlags;.  memse
30020 74 28 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20  t(&dummyVfs, 0, 
30030 73 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73 29  sizeof(dummyVfs)
30040 29 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41  );.  dummyVfs.pA
30050 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29  ppData = (void*)
30060 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  &autolockIoFinde
30070 72 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e  r;.  dummyVfs.zN
30080 61 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20  ame = "dummy";. 
30090 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66   pUnused->fd = f
300a0 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c  d;.  pUnused->fl
300b0 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b  ags = openFlags;
300c0 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64  .  pNew->pUnused
300d0 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20   = pUnused;.  . 
300e0 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78   rc = fillInUnix
300f0 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20  File(&dummyVfs, 
30100 66 64 2c 20 64 69 72 66 64 2c 20 28 73 71 6c 69  fd, dirfd, (sqli
30110 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20  te3_file*)pNew, 
30120 70 61 74 68 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  path, 0, 0, 0);.
30130 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30140 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69  _OK ){.    *ppFi
30150 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72  le = pNew;.    r
30160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30170 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f  .  }.end_create_
30180 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62  proxy:    .  rob
30190 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
301a0 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
301b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
301c0 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ew);.  sqlite3_f
301d0 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  ree(pUnused);.  
301e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
301f0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
30200 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c  ./* simulate mul
30210 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63  tiple hosts by c
30220 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68  reating unique h
30230 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73  ostid file paths
30240 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
30250 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a  hostid_num = 0;.
30260 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
30270 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
30280 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20     16  /* conch 
30290 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e  file host id len
302a0 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61  gth */../* Not a
302b0 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e  lways defined in
302c0 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73 20   the headers as 
302d0 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a  it ought to be *
302e0 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74  /.extern int get
302f0 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74 20  hostuuid(uuid_t 
30300 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74  id, const struct
30310 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29   timespec *wait)
30320 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f  ;../* get the ho
30330 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f 73  st ID via gethos
30340 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44  tuuid(), pHostID
30350 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50   must point to P
30360 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a  ROXY_HOSTIDLEN .
30370 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69 74  ** bytes of writ
30380 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  able memory..*/.
30390 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
303a0 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e  GetHostID(unsign
303b0 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44  ed char *pHostID
303c0 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a  , int *pError){.
303d0 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48    assert(PROXY_H
303e0 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65  OSTIDLEN == size
303f0 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d  of(uuid_t));.  m
30400 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30  emset(pHostID, 0
30410 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
30420 4e 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  N);.#if defined(
30430 5f 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53 49  __MAX_OS_X_VERSI
30440 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 29  ON_MIN_REQUIRED)
30450 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
30460 20 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56   && __MAC_OS_X_V
30470 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49  ERSION_MIN_REQUI
30480 52 45 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20 20  RED<1050.  {.   
30490 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
304a0 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 74 69  ruct timespec ti
304b0 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20  meout = {1, 0}; 
304c0 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74  /* 1 sec timeout
304d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68   */.    if( geth
304e0 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c  ostuuid(pHostID,
304f0 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20   &timeout) ){.  
30500 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72      int err = er
30510 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rno;.      if( p
30520 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Error ){.       
30530 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a   *pError = err;.
30540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
30550 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
30560 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  R;.    }.  }.#en
30570 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
30580 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75  E_TEST.  /* simu
30590 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f  late multiple ho
305a0 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  sts by creating 
305b0 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69  unique hostid fi
305c0 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66  le paths */.  if
305d0 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  ( sqlite3_hostid
305e0 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20  _num != 0){.    
305f0 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68  pHostID[0] = (ch
30600 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b  ar)(pHostID[0] +
30610 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f   (char)(sqlite3_
30620 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46  hostid_num & 0xF
30630 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  F));.  }.#endif.
30640 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
30650 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  TE_OK;.}../* The
30660 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
30670 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c  ains the header,
30680 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63   host id and loc
30690 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a  k file path. */.
306a0 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f  #define PROXY_CO
306b0 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f  NCHVERSION 2   /
306c0 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c  * 1-byte header,
306d0 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64   16-byte host id
306e0 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e  , path */.#defin
306f0 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  e PROXY_HEADERLE
30700 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63  N    1   /* conc
30710 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65  h file header le
30720 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ngth */.#define 
30730 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
30740 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52     (PROXY_HEADER
30750 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
30760 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f  LEN).#define PRO
30770 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20  XY_MAXCONCHLEN  
30780 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
30790 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
307a0 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a  +MAXPATHLEN)../*
307b0 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70   .** Takes an op
307c0 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63  en conch file, c
307d0 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  opies the conten
307e0 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68  ts to a new path
307f0 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20   and then moves 
30800 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68  .** it back.  Th
30810 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  e newly created 
30820 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63  file's file desc
30830 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e  riptor is assign
30840 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ed to the.** con
30850 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  ch file structur
30860 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68  e and finally th
30870 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68  e original conch
30880 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
30890 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20   is .** closed. 
308a0 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   Returns zero if
308b0 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a   successful..*/.
308c0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
308d0 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75  BreakConchLock(u
308e0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
308f0 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29  uuid_t myHostID)
30900 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
30910 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
30920 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
30930 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
30940 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
30950 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
30960 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
30970 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74  chFile;.  char t
30980 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
30990 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f  ;.  char buf[PRO
309a0 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
309b0 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d  .  char *cPath =
309c0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
309d0 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72  Path;.  size_t r
309e0 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69  eadLen = 0;.  si
309f0 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30  ze_t pathLen = 0
30a00 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b  ;.  char errmsg[
30a10 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20  64] = "";.  int 
30a20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72  fd = -1;.  int r
30a30 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44  c = -1;.  UNUSED
30a40 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73  _PARAMETER(myHos
30a50 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61  tID);..  /* crea
30a60 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62 79  te a new path by
30a70 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72 61   replace the tra
30a80 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77  iling '-conch' w
30a90 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a  ith '-break' */.
30aa0 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c    pathLen = strl
30ab0 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74 68  cpy(tPath, cPath
30ac0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
30ad0 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58   if( pathLen>MAX
30ae0 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c  PATHLEN || pathL
30af0 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73  en<6 || .     (s
30b00 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61  trlcpy(&tPath[pa
30b10 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b  thLen-5], "break
30b20 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20  ", 6) != 5) ){. 
30b30 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
30b40 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
30b50 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20  g),errmsg,"path 
30b60 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
30b70 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20  (int)pathLen);. 
30b80 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
30b90 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20  klock;.  }.  /* 
30ba0 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63  read the conch c
30bb0 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64  ontent */.  read
30bc0 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f  Len = osPread(co
30bd0 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c  nchFile->h, buf,
30be0 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
30bf0 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65  EN, 0);.  if( re
30c00 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48  adLen<PROXY_PATH
30c10 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c  INDEX ){.    sql
30c20 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
30c30 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72  zeof(errmsg),err
30c40 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20  msg,"read error 
30c50 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72  (len %d)",(int)r
30c60 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74  eadLen);.    got
30c70 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
30c80 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20  .  }.  /* write 
30c90 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65  it out to the te
30ca0 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69  mporary break fi
30cb0 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62  le */.  fd = rob
30cc0 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20  ust_open(tPath, 
30cd0 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c  (O_RDWR|O_CREAT|
30ce0 4f 5f 45 58 43 4c 29 2c 0a 20 20 20 20 20 20 20  O_EXCL),.       
30cf0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
30d00 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
30d10 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
30d20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
30d30 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
30d40 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
30d50 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65   errmsg, "create
30d60 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
30d70 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
30d80 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
30d90 20 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74   }.  if( osPwrit
30da0 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c  e(fd, buf, readL
30db0 65 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65  en, 0) != (ssize
30dc0 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20  _t)readLen ){.  
30dd0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
30de0 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
30df0 29 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74  ), errmsg, "writ
30e00 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
30e10 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
30e20 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
30e30 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65    }.  if( rename
30e40 28 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29  (tPath, cPath) )
30e50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
30e60 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
30e70 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22  rmsg), errmsg, "
30e80 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25  rename failed (%
30e90 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
30ea0 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
30eb0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ock;.  }.  rc = 
30ec0 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  0;.  fprintf(std
30ed0 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c  err, "broke stal
30ee0 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c  e lock on %s\n",
30ef0 20 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73   cPath);.  robus
30f00 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63  t_close(pFile, c
30f10 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  onchFile->h, __L
30f20 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46  INE__);.  conchF
30f30 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63  ile->h = fd;.  c
30f40 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  onchFile->openFl
30f50 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
30f60 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65  _CREAT;..end_bre
30f70 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63  aklock:.  if( rc
30f80 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d   ){.    if( fd>=
30f90 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 69 6e  0 ){.      unlin
30fa0 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20  k(tPath);.      
30fb0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
30fc0 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  le, fd, __LINE__
30fd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  );.    }.    fpr
30fe0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 61  intf(stderr, "fa
30ff0 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74  iled to break st
31000 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20  ale lock on %s, 
31010 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72  %s\n", cPath, er
31020 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  rmsg);.  }.  ret
31030 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61  urn rc;.}../* Ta
31040 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ke the requested
31050 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e   lock on the con
31060 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61  ch file and brea
31070 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69  k a stale lock i
31080 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69  f the .** host i
31090 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74  d matches..*/.st
310a0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f  atic int proxyCo
310b0 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  nchLock(unixFile
310c0 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20   *pFile, uuid_t 
310d0 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f  myHostID, int lo
310e0 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79  ckType){.  proxy
310f0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
31100 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
31110 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
31120 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
31130 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65  ext; .  unixFile
31140 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
31150 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
31160 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
31170 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65  _OK;.  int nTrie
31180 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  s = 0;.  struct 
31190 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f  timespec conchMo
311a0 64 54 69 6d 65 3b 0a 20 20 0a 20 20 64 6f 20 7b  dTime;.  .  do {
311b0 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46  .    rc = conchF
311c0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
311d0 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
311e0 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f  e*)conchFile, lo
311f0 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72  ckType);.    nTr
31200 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20  ies ++;.    if( 
31210 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
31220 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
31230 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28  he lock failed (
31240 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20  busy):.       * 
31250 31 73 74 20 74 72 79 3a 20 67 65 74 20 74 68 65  1st try: get the
31260 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65   mod time of the
31270 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35   conch, wait 0.5
31280 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e  s and try again.
31290 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74   .       * 2nd t
312a0 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20  ry: fail if the 
312b0 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64  mod time changed
312c0 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20 64   or host id is d
312d0 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a  ifferent, wait .
312e0 20 20 20 20 20 20 20 2a 20 20 20 20 20 20 20 20         *        
312f0 20 20 20 31 30 20 73 65 63 20 61 6e 64 20 74 72     10 sec and tr
31300 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a  y again.       *
31310 20 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20   3rd try: break 
31320 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20  the lock unless 
31330 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73  the mod time has
31340 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20   changed..      
31350 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
31360 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20   stat buf;.     
31370 20 69 66 28 20 6f 73 46 73 74 61 74 28 63 6f 6e   if( osFstat(con
31380 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  chFile->h, &buf)
31390 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
313a0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
313b0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  rrno;.        re
313c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
313d0 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  R_LOCK;.      }.
313e0 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
313f0 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20   nTries==1 ){.  
31400 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69        conchModTi
31410 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d  me = buf.st_mtim
31420 65 73 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75  espec;.        u
31430 73 6c 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f  sleep(500000); /
31440 2a 20 77 61 69 74 20 30 2e 35 20 73 65 63 20 61  * wait 0.5 sec a
31450 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20  nd try the lock 
31460 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20  again*/.        
31470 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20  continue;  .    
31480 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
31490 74 28 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20  t( nTries>1 );. 
314a0 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f       if( conchMo
314b0 64 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20  dTime.tv_sec != 
314c0 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
314d0 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20  .tv_sec || .    
314e0 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d       conchModTim
314f0 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66  e.tv_nsec != buf
31500 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76  .st_mtimespec.tv
31510 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20  _nsec ){.       
31520 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
31530 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  USY;.      }.   
31540 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54     .      if( nT
31550 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20  ries==2 ){  .   
31560 20 20 20 20 20 63 68 61 72 20 74 42 75 66 5b 50       char tBuf[P
31570 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
31580 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  ];.        int l
31590 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e  en = osPread(con
315a0 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c  chFile->h, tBuf,
315b0 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
315c0 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  EN, 0);.        
315d0 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20  if( len<0 ){.   
315e0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
315f0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
31600 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
31610 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
31620 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  OCK;.        }. 
31630 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50         if( len>P
31640 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26  ROXY_PATHINDEX &
31650 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72  & tBuf[0]==(char
31660 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53  )PROXY_CONCHVERS
31670 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ION){.          
31680 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74  /* don't break t
31690 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68  he lock if the h
316a0 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d  ost id doesn't m
316b0 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
316c0 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28    if( 0!=memcmp(
316d0 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44  &tBuf[PROXY_HEAD
316e0 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44  ERLEN], myHostID
316f0 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
31700 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  N) ){.          
31710 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31720 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
31730 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
31740 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f  .          /* do
31750 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  n't break the lo
31760 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64  ck on short read
31770 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69   or a version mi
31780 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20  smatch */.      
31790 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
317a0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
317b0 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70  }.        usleep
317c0 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77  (10000000); /* w
317d0 61 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74  ait 10 sec and t
317e0 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69  ry the lock agai
317f0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  n */.        con
31800 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a  tinue; .      }.
31810 20 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73        .      ass
31820 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29  ert( nTries==3 )
31830 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
31840 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f  roxyBreakConchLo
31850 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
31860 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ID) ){.        r
31870 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
31880 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54         if( lockT
31890 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
318a0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OCK ){.         
318b0 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
318c0 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
318d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
318e0 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44  onchFile, SHARED
318f0 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20 20 20  _LOCK);         
31900 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
31910 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20      if( !rc ){. 
31920 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
31930 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
31940 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
31950 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
31960 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20  , lockType);.   
31970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
31980 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20     }.  } while( 
31990 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
319a0 26 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20  && nTries<3 );. 
319b0 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d   .  return rc;.}
319c0 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63  ../* Takes the c
319d0 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61  onch by taking a
319e0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
319f0 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
31a00 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a  ts conch, if .**
31a10 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e   lockPath is non
31a20 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20  -NULL, the host 
31a30 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ID and lock file
31a40 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68   path must match
31a50 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f  .  A NULL .** lo
31a60 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61  ckPath means tha
31a70 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69  t the lockPath i
31a80 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
31a90 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66   will be used if
31aa0 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44   the .** host ID
31ab0 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65  s match, or a ne
31ac0 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  w lock path will
31ad0 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61 75   be generated au
31ae0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
31af0 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74  and written to t
31b00 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a  he conch file..*
31b10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
31b20 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78  xyTakeConch(unix
31b30 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
31b40 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
31b50 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
31b60 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
31b70 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
31b80 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20  gContext; .  .  
31b90 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
31ba0 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  eld!=0 ){.    re
31bb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31bc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
31bd0 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
31be0 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
31bf0 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d  le;.    uuid_t m
31c00 79 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74  yHostID;.    int
31c10 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20   pError = 0;.   
31c20 20 63 68 61 72 20 72 65 61 64 42 75 66 5b 50 52   char readBuf[PR
31c30 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
31c40 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50  ;.    char lockP
31c50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  ath[MAXPATHLEN];
31c60 0a 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c  .    char *tempL
31c70 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a  ockPath = NULL;.
31c80 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
31c90 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20  ITE_OK;.    int 
31ca0 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b  createConch = 0;
31cb0 0a 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d  .    int hostIdM
31cc0 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e  atch = 0;.    in
31cd0 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20  t readLen = 0;. 
31ce0 20 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63     int tryOldLoc
31cf0 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69  kPath = 0;.    i
31d00 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50  nt forceNewLockP
31d10 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20  ath = 0;.    .  
31d20 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45    OSTRACE(("TAKE
31d30 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
31d40 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
31d50 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
31d60 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f         (pCtx->lo
31d70 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43  ckProxyPath ? pC
31d80 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
31d90 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67  h : ":auto:"), g
31da0 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 20 20  etpid()));..    
31db0 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73  rc = proxyGetHos
31dc0 74 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70  tID(myHostID, &p
31dd0 45 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  Error);.    if( 
31de0 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
31df0 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20  E_IOERR ){.     
31e00 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
31e10 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20  o = pError;.    
31e20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
31e30 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
31e40 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c  rc = proxyConchL
31e50 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
31e60 74 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  tID, SHARED_LOCK
31e70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
31e80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31e90 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
31ea0 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
31eb0 2f 2a 20 72 65 61 64 20 74 68 65 20 65 78 69 73  /* read the exis
31ec0 74 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65 20  ting conch file 
31ed0 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20 3d  */.    readLen =
31ee0 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e   seekAndRead((un
31ef0 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  ixFile*)conchFil
31f00 65 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20 50  e, 0, readBuf, P
31f10 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
31f20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64 4c  );.    if( readL
31f30 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  en<0 ){.      /*
31f40 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74   I/O error: last
31f50 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
31f60 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
31f70 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
31f80 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  no = conchFile->
31f90 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
31fa0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
31fb0 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67  RR_READ;.      g
31fc0 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
31fd0 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  h;.    }else if(
31fe0 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59   readLen<=(PROXY
31ff0 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
32000 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a  _HOSTIDLEN) || .
32010 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
32020 64 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50  dBuf[0]!=(char)P
32030 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
32040 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20  N ){.      /* a 
32050 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65  short read or ve
32060 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73  rsion format mis
32070 6d 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e  match means we n
32080 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  eed to create a 
32090 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  new .      ** co
320a0 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nch file. .     
320b0 20 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65   */.      create
320c0 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d  Conch = 1;.    }
320d0 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68  .    /* if the h
320e0 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 20 61  ost id matches a
320f0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68  nd the lock path
32100 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
32110 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20  in the conch.   
32120 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f   ** we'll try to
32130 20 75 73 65 20 74 68 65 20 70 61 74 68 20 74 68   use the path th
32140 65 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74  ere, if we can't
32150 20 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c   open that path,
32160 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72   we'll .    ** r
32170 65 74 72 79 20 77 69 74 68 20 61 20 6e 65 77 20  etry with a new 
32180 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70  auto-generated p
32190 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ath .    */.    
321a0 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20  do { /* in case 
321b0 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61  we need to try a
321c0 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74  gain for an :aut
321d0 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69  o: named lock fi
321e0 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  le */..      if(
321f0 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26   !createConch &&
32200 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61   !forceNewLockPa
32210 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f  th ){.        ho
32220 73 74 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d  stIdMatch = !mem
32230 63 6d 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f  cmp(&readBuf[PRO
32240 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
32250 79 48 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20  yHostID, .      
32260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32270 20 20 20 20 20 20 20 20 20 20 20 20 50 52 4f 58              PROX
32280 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20  Y_HOSTIDLEN);.  
32290 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20        /* if the 
322a0 63 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20 63  conch has data c
322b0 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65  ompare the conte
322c0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  nts */.        i
322d0 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  f( !pCtx->lockPr
322e0 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
322f0 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f       /* for auto
32300 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63  -named local loc
32310 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65  k file, just che
32320 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  ck the host ID a
32330 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20  nd we'll.       
32340 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c      ** use the l
32350 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70  ocal lock file p
32360 61 74 68 20 74 68 61 74 27 73 20 61 6c 72 65 61  ath that's alrea
32370 64 79 20 69 6e 20 74 68 65 72 65 0a 20 20 20 20  dy in there.    
32380 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32390 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61      if( hostIdMa
323a0 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tch ){.         
323b0 20 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65     size_t pathLe
323c0 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20 50  n = (readLen - P
323d0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 3b  ROXY_PATHINDEX);
323e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  .            .  
323f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
32400 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45  thLen>=MAXPATHLE
32410 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
32420 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41     pathLen=MAXPA
32430 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20  THLEN-1;.       
32440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32450 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61     memcpy(lockPa
32460 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f  th, &readBuf[PRO
32470 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70  XY_PATHINDEX], p
32480 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20  athLen);.       
32490 20 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61       lockPath[pa
324a0 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  thLen] = 0;.    
324b0 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b          tempLock
324c0 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b  Path = lockPath;
324d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
324e0 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b  OldLockPath = 1;
324f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
32500 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
32510 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 69   the lock path i
32520 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74  f the conch is t
32530 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  aken */.        
32540 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
32550 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20  econch;.        
32560 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
32570 65 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63  e if( hostIdMatc
32580 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h.              
32590 20 26 26 20 21 73 74 72 6e 63 6d 70 28 70 43 74   && !strncmp(pCt
325a0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
325b0 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59  , &readBuf[PROXY
325c0 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20  _PATHINDEX],.   
325d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
325e0 20 20 20 20 20 20 20 20 72 65 61 64 4c 65 6e 2d          readLen-
325f0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29  PROXY_PATHINDEX)
32600 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
32610 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68        /* conch h
32620 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74  ost and lock pat
32630 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  h match */.     
32640 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
32650 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20  keconch; .      
32660 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
32670 20 20 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74    .      /* if t
32680 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 77  he conch isn't w
32690 72 69 74 61 62 6c 65 20 61 6e 64 20 64 6f 65 73  ritable and does
326a0 6e 27 74 20 6d 61 74 63 68 2c 20 77 65 20 63 61  n't match, we ca
326b0 6e 27 74 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20  n't take it */. 
326c0 20 20 20 20 20 69 66 28 20 28 63 6f 6e 63 68 46       if( (conchF
326d0 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f  ile->openFlags&O
326e0 5f 52 44 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20  _RDWR) == 0 ){. 
326f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
32700 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
32710 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
32720 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nch;.      }.   
32730 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 65 69 74     .      /* eit
32740 68 65 72 20 74 68 65 20 63 6f 6e 63 68 20 64 69  her the conch di
32750 64 6e 27 74 20 6d 61 74 63 68 20 6f 72 20 77 65  dn't match or we
32760 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
32770 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20  a new one */.   
32780 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
32790 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
327a0 20 20 20 20 20 20 20 70 72 6f 78 79 47 65 74 4c         proxyGetL
327b0 6f 63 6b 50 61 74 68 28 70 43 74 78 2d 3e 64 62  ockPath(pCtx->db
327c0 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  Path, lockPath, 
327d0 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
327e0 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74       tempLockPat
327f0 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20  h = lockPath;.  
32800 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20        /* create 
32810 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f  a copy of the lo
32820 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69  ck path _only_ i
32830 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74  f the conch is t
32840 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  aken */.      }.
32850 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
32860 75 70 64 61 74 65 20 63 6f 6e 63 68 20 77 69 74  update conch wit
32870 68 20 68 6f 73 74 20 61 6e 64 20 70 61 74 68 20  h host and path 
32880 28 74 68 69 73 20 77 69 6c 6c 20 66 61 69 6c 20  (this will fail 
32890 69 66 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  if other process
328a0 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 20  .      ** has a 
328b0 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65  shared lock alre
328c0 61 64 79 29 2c 20 69 66 20 74 68 65 20 68 6f 73  ady), if the hos
328d0 74 20 69 64 20 6d 61 74 63 68 65 73 2c 20 75 73  t id matches, us
328e0 65 20 74 68 65 20 62 69 67 0a 20 20 20 20 20 20  e the big.      
328f0 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20 20 20 20  ** stick..      
32900 2a 2f 0a 20 20 20 20 20 20 66 75 74 69 6d 65 73  */.      futimes
32910 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e  (conchFile->h, N
32920 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ULL);.      if( 
32930 68 6f 73 74 49 64 4d 61 74 63 68 20 26 26 20 21  hostIdMatch && !
32940 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20  createConch ){. 
32950 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68         if( conch
32960 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20  File->pInode && 
32970 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64  conchFile->pInod
32980 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
32990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
329a0 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
329b0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
329c0 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
329d0 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
329e0 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70         ** same p
329f0 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
32a00 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
32a10 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   lock. */.      
32a20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32a30 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20  BUSY;.        } 
32a40 65 6c 73 65 20 7b 20 20 20 20 20 20 20 20 20 20  else {          
32a50 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32a60 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70  proxyConchLock(p
32a70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20  File, myHostID, 
32a80 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
32a90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32ab0 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
32ac0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
32ad0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
32ae0 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49  nchFile, EXCLUSI
32af0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
32b00 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
32b10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32b20 20 20 20 20 20 63 68 61 72 20 77 72 69 74 65 42       char writeB
32b30 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43  uffer[PROXY_MAXC
32b40 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  ONCHLEN];.      
32b50 20 20 69 6e 74 20 77 72 69 74 65 53 69 7a 65 20    int writeSize 
32b60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  = 0;.        .  
32b70 20 20 20 20 20 20 77 72 69 74 65 42 75 66 66 65        writeBuffe
32b80 72 5b 30 5d 20 3d 20 28 63 68 61 72 29 50 52 4f  r[0] = (char)PRO
32b90 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b  XY_CONCHVERSION;
32ba0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
32bb0 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
32bc0 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
32bd0 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48  yHostID, PROXY_H
32be0 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20  OSTIDLEN);.     
32bf0 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
32c00 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c  kProxyPath!=NULL
32c10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
32c20 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66  rlcpy(&writeBuff
32c30 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  er[PROXY_PATHIND
32c40 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  EX], pCtx->lockP
32c50 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54  roxyPath, MAXPAT
32c60 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d  HLEN);.        }
32c70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
32c80 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42 75  strlcpy(&writeBu
32c90 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49  ffer[PROXY_PATHI
32ca0 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50  NDEX], tempLockP
32cb0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
32cc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32cd0 20 20 20 20 77 72 69 74 65 53 69 7a 65 20 3d 20      writeSize = 
32ce0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
32cf0 2b 20 73 74 72 6c 65 6e 28 26 77 72 69 74 65 42  + strlen(&writeB
32d00 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48  uffer[PROXY_PATH
32d10 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20 20 20 20  INDEX]);.       
32d20 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
32d30 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  e(conchFile->h, 
32d40 77 72 69 74 65 53 69 7a 65 29 3b 0a 20 20 20 20  writeSize);.    
32d50 20 20 20 20 72 63 20 3d 20 75 6e 69 78 57 72 69      rc = unixWri
32d60 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
32d70 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72   *)conchFile, wr
32d80 69 74 65 42 75 66 66 65 72 2c 20 77 72 69 74 65  iteBuffer, write
32d90 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Size, 0);.      
32da0 20 20 66 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c    fsync(conchFil
32db0 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 20 20 2f  e->h);.        /
32dc0 2a 20 49 66 20 77 65 20 63 72 65 61 74 65 64 20  * If we created 
32dd0 61 20 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c 65  a new conch file
32de0 20 28 6e 6f 74 20 6a 75 73 74 20 75 70 64 61 74   (not just updat
32df0 65 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ed the contents 
32e00 6f 66 20 61 20 0a 20 20 20 20 20 20 20 20 20 2a  of a .         *
32e10 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68 20 66 69  * valid conch fi
32e20 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d 61 74 63  le), try to matc
32e30 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  h the permission
32e40 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
32e50 65 20 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  e .         */. 
32e60 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
32e70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 72 65 61  QLITE_OK && crea
32e80 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20  teConch ){.     
32e90 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
32ea0 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20   buf;.          
32eb0 69 6e 74 20 65 72 72 20 3d 20 6f 73 46 73 74 61  int err = osFsta
32ec0 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  t(pFile->h, &buf
32ed0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
32ee0 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20   err==0 ){.     
32ef0 20 20 20 20 20 20 20 6d 6f 64 65 5f 74 20 63 6d         mode_t cm
32f00 6f 64 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f 64  ode = buf.st_mod
32f10 65 26 28 53 5f 49 52 55 53 52 7c 53 5f 49 57 55  e&(S_IRUSR|S_IWU
32f20 53 52 20 7c 20 53 5f 49 52 47 52 50 7c 53 5f 49  SR | S_IRGRP|S_I
32f30 57 47 52 50 20 7c 0a 20 20 20 20 20 20 20 20 20  WGRP |.         
32f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
32f60 5f 49 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29 3b  _IROTH|S_IWOTH);
32f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
32f80 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65  try to match the
32f90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 52   database file R
32fa0 2f 57 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20  /W permissions, 
32fb0 69 67 6e 6f 72 65 20 66 61 69 6c 75 72 65 20 2a  ignore failure *
32fc0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
32fd0 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 20 20 20  _PROXY_DEBUG.   
32fe0 20 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f           osFchmo
32ff0 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
33000 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20  cmode);.#else.  
33010 20 20 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20            do{.  
33020 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
33030 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46   osFchmod(conchF
33040 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a  ile->h, cmode);.
33050 20 20 20 20 20 20 20 20 20 20 20 20 7d 77 68 69              }whi
33060 6c 65 28 20 72 63 3d 3d 28 2d 31 29 20 26 26 20  le( rc==(-1) && 
33070 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
33080 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
33090 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
330a0 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20         int code 
330b0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
330c0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
330d0 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25  tderr, "fchmod %
330e0 6f 20 46 41 49 4c 45 44 20 77 69 74 68 20 25 64  o FAILED with %d
330f0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
33100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d                cm
33110 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74 72 65 72  ode, code, strer
33120 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20 20 20  ror(code));.    
33130 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
33140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
33150 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
33160 66 63 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44  fchmod %o SUCCED
33170 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20 20  ED\n",cmode);.  
33180 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33190 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
331a0 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64           int cod
331b0 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  e = errno;.     
331c0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
331d0 74 64 65 72 72 2c 20 22 53 54 41 54 20 46 41 49  tderr, "STAT FAI
331e0 4c 45 44 5b 25 64 5d 20 77 69 74 68 20 25 64 20  LED[%d] with %d 
331f0 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  %s\n", .        
33200 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 2c              err,
33210 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28   code, strerror(
33220 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20  code));.#endif. 
33230 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33240 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33250 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d     conchFile->pM
33260 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
33270 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
33280 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  nchFile, SHARED_
33290 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20 20  LOCK);.      .  
332a0 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a    end_takeconch:
332b0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
332c0 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f  "TRANSPROXY: CLO
332d0 53 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  SE  %d\n", pFile
332e0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ->h));.      if(
332f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
33300 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  & pFile->openFla
33310 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  gs ){.        if
33320 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
33330 0a 20 20 20 20 20 20 20 20 20 20 72 6f 62 75 73  .          robus
33340 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
33350 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  File->h, __LINE_
33360 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  _);.        }.  
33370 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
33380 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74   -1;.        int
33390 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
333a0 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20  n(pCtx->dbPath, 
333b0 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  pFile->openFlags
333c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
333d0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
333e0 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
333f0 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20  ISSIONS);.      
33400 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e    OSTRACE(("TRAN
33410 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64  SPROXY: OPEN  %d
33420 5c 6e 22 2c 20 66 64 29 29 3b 0a 20 20 20 20 20  \n", fd));.     
33430 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
33440 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
33450 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 20  >h = fd;.       
33460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33470 20 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54    rc=SQLITE_CANT
33480 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 51  OPEN_BKPT; /* SQ
33490 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f 78 79  LITE_BUSY? proxy
334a0 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64  TakeConch called
334b0 0a 20 20 20 20 20 20 20 20 20 20 20 64 75 72 69  .           duri
334c0 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  ng locking */.  
334d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
334e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
334f0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43 74 78  LITE_OK && !pCtx
33500 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20  ->lockProxy ){. 
33510 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 61 74         char *pat
33520 68 20 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  h = tempLockPath
33530 20 3f 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20   ? tempLockPath 
33540 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  : pCtx->lockProx
33550 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 72  yPath;.        r
33560 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55  c = proxyCreateU
33570 6e 69 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70  nixFile(path, &p
33580 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20  Ctx->lockProxy, 
33590 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
335a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
335b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
335c0 4d 20 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50  M && tryOldLockP
335d0 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
335e0 20 2f 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74 20   /* we couldn't 
335f0 63 72 65 61 74 65 20 74 68 65 20 70 72 6f 78 79  create the proxy
33600 20 6c 6f 63 6b 20 66 69 6c 65 20 77 69 74 68 20   lock file with 
33610 74 68 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c  the old lock fil
33620 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20  e path.         
33630 20 20 2a 2a 20 73 6f 20 74 72 79 20 61 67 61 69    ** so try agai
33640 6e 20 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e  n via auto-namin
33650 67 20 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f  g .           */
33660 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 63 65  .          force
33670 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b  NewLockPath = 1;
33680 0a 20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c  .          tryOl
33690 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  dLockPath = 0;. 
336a0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
336b0 65 3b 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f  e; /* go back to
336c0 20 74 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65   the do {} while
336d0 20 73 74 61 72 74 20 70 6f 69 6e 74 2c 20 74 72   start point, tr
336e0 79 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20  y again */.     
336f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33700 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
33710 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
33720 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
33730 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68 20 69  a copy of path i
33740 66 20 77 65 20 65 78 74 72 61 63 74 65 64 20 74  f we extracted t
33750 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  he value.       
33760 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f    ** from the co
33770 6e 63 68 20 66 69 6c 65 20 6f 72 20 74 68 65 20  nch file or the 
33780 70 61 74 68 20 77 61 73 20 61 6c 6c 6f 63 61 74  path was allocat
33790 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 0a  ed on the stack.
337a0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
337b0 20 20 20 20 69 66 28 20 74 65 6d 70 4c 6f 63 6b      if( tempLock
337c0 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
337d0 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
337e0 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44  yPath = sqlite3D
337f0 62 53 74 72 44 75 70 28 30 2c 20 74 65 6d 70 4c  bStrDup(0, tempL
33800 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ockPath);.      
33810 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c      if( !pCtx->l
33820 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
33830 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
33840 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
33850 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33860 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33870 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
33880 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
33890 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
338a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  = 1;.        .  
338b0 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
338c0 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
338d0 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68  od == &afpIoMeth
338e0 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ods ){.         
338f0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
33900 78 74 20 2a 61 66 70 43 74 78 3b 0a 20 20 20 20  xt *afpCtx;.    
33910 20 20 20 20 20 20 61 66 70 43 74 78 20 3d 20 28        afpCtx = (
33920 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
33930 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  t *)pCtx->lockPr
33940 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oxy->lockingCont
33950 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ext;.          a
33960 66 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20  fpCtx->dbPath = 
33970 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
33980 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ath;.        }. 
33990 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
339a0 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d        conchFile-
339b0 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
339c0 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
339d0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c  )conchFile, NO_L
339e0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
339f0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 41      OSTRACE(("TA
33a00 4b 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e  KECONCH  %d %s\n
33a10 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
33a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33a30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f  rc==SQLITE_OK?"o
33a40 6b 22 3a 22 66 61 69 6c 65 64 22 29 29 3b 0a 20  k":"failed"));. 
33a50 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
33a60 20 20 20 20 7d 20 77 68 69 6c 65 20 28 31 29 3b      } while (1);
33a70 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e   /* in case we n
33a80 65 65 64 20 74 6f 20 72 65 74 72 79 20 74 68 65  eed to retry the
33a90 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c   :auto: lock fil
33aa0 65 20 2d 20 0a 20 20 20 20 20 20 20 20 20 20 20  e - .           
33ab0 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75        ** we shou
33ac0 6c 64 20 6e 65 76 65 72 20 67 65 74 20 68 65 72  ld never get her
33ad0 65 20 65 78 63 65 70 74 20 76 69 61 20 74 68 65  e except via the
33ae0 20 27 63 6f 6e 74 69 6e 75 65 27 20 63 61 6c 6c   'continue' call
33af0 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  . */.  }.}../*.*
33b00 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c 64 73  * If pFile holds
33b10 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e   a lock on a con
33b20 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65  ch file, then re
33b30 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e  lease that lock.
33b40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
33b50 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68  roxyReleaseConch
33b60 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
33b70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
33b80 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
33b90 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72   /* Subroutine r
33ba0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
33bb0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
33bc0 65 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54  ext *pCtx;  /* T
33bd0 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
33be0 78 74 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79  xt for the proxy
33bf0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46   lock */.  unixF
33c00 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20  ile *conchFile; 
33c10 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
33c20 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
33c30 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20 28 70   */..  pCtx = (p
33c40 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
33c50 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
33c60 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f  ingContext;.  co
33c70 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
33c80 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54  conchFile;.  OST
33c90 52 41 43 45 28 28 22 52 45 4c 45 41 53 45 43 4f  RACE(("RELEASECO
33ca0 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70  NCH  %d for %s p
33cb0 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46  id=%d\n", conchF
33cc0 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
33cd0 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72     (pCtx->lockPr
33ce0 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e  oxyPath ? pCtx->
33cf0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20  lockProxyPath : 
33d00 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20  ":auto:"), .    
33d10 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29         getpid())
33d20 29 3b 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63  );.  if( pCtx->c
33d30 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20  onchHeld>0 ){.  
33d40 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
33d50 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
33d60 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
33d70 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f  *)conchFile, NO_
33d80 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 70 43 74  LOCK);.  }.  pCt
33d90 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30  x->conchHeld = 0
33da0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
33db0 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 25  LEASECONCH  %d %
33dc0 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  s\n", conchFile-
33dd0 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
33de0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
33df0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
33e00 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
33e10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
33e20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
33e30 74 61 62 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d  tabase file, com
33e40 70 75 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  pute the name of
33e50 20 69 74 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e   its conch file.
33e60 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 63 6f  .** Store the co
33e70 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  nch filename in 
33e80 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
33e90 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
33ea0 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a  loc()..** Make *
33eb0 70 43 6f 6e 63 68 50 61 74 68 20 70 6f 69 6e 74  pConchPath point
33ec0 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 61 6d 65   to the new name
33ed0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
33ee0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
33ef0 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * or SQLITE_NOME
33f00 4d 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f  M if unable to o
33f10 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a  btain memory..**
33f20 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69  .** The caller i
33f30 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
33f40 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  r ensuring that 
33f50 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  the allocated me
33f60 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20 69 73  mory.** space is
33f70 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
33f80 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68  d..**.** *pConch
33f90 50 61 74 68 20 69 73 20 73 65 74 20 74 6f 20 4e  Path is set to N
33fa0 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f 72 79 20  ULL if a memory 
33fb0 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
33fc0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
33fd0 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
33fe0 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28  teConchPathname(
33ff0 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68  char *dbPath, ch
34000 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29  ar **pConchPath)
34010 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
34020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34030 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
34040 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d  r */.  int len =
34050 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50   (int)strlen(dbP
34060 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20  ath); /* Length 
34070 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
34080 6e 61 6d 65 20 2d 20 64 62 50 61 74 68 20 2a 2f  name - dbPath */
34090 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 50 61  .  char *conchPa
340a0 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
340b0 20 2f 2a 20 62 75 66 66 65 72 20 69 6e 20 77 68   /* buffer in wh
340c0 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ich to construct
340d0 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a   conch name */..
340e0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
340f0 61 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ace for the conc
34100 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69  h filename and i
34110 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 61  nitialize the na
34120 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e  me to.  ** the n
34130 61 6d 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ame of the origi
34140 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
34150 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63  e. */  .  *pConc
34160 68 50 61 74 68 20 3d 20 63 6f 6e 63 68 50 61 74  hPath = conchPat
34170 68 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  h = (char *)sqli
34180 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b  te3_malloc(len +
34190 20 38 29 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68   8);.  if( conch
341a0 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Path==0 ){.    r
341b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
341c0 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  EM;.  }.  memcpy
341d0 28 63 6f 6e 63 68 50 61 74 68 2c 20 64 62 50 61  (conchPath, dbPa
341e0 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20  th, len+1);.  . 
341f0 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72 74 20 61   /* now insert a
34200 20 22 2e 22 20 62 65 66 6f 72 65 20 74 68 65 20   "." before the 
34210 6c 61 73 74 20 2f 20 63 68 61 72 61 63 74 65 72  last / character
34220 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65   */.  for( i=(le
34230 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20  n-1); i>=0; i-- 
34240 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68  ){.    if( conch
34250 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  Path[i]=='/' ){.
34260 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
34270 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
34280 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d  }.  conchPath[i]
34290 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65 20 28 20  ='.';.  while ( 
342a0 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e  i<len ){.    con
342b0 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61  chPath[i+1]=dbPa
342c0 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a  th[i];.    i++;.
342d0 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64    }..  /* append
342e0 20 74 68 65 20 22 2d 63 6f 6e 63 68 22 20 73 75   the "-conch" su
342f0 66 66 69 78 20 74 6f 20 74 68 65 20 66 69 6c 65  ffix to the file
34300 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f   */.  memcpy(&co
34310 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d  nchPath[i+1], "-
34320 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20 20 61 73  conch", 7);.  as
34330 73 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65  sert( (int)strle
34340 6e 28 63 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20  n(conchPath) == 
34350 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75  len+7 );..  retu
34360 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
34370 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20 66 75 6c  ../* Takes a ful
34380 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 70 72  ly configured pr
34390 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c  oxy locking-styl
343a0 65 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20  e unix file and 
343b0 73 77 69 74 63 68 65 73 0a 2a 2a 20 74 68 65 20  switches.** the 
343c0 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20  local lock file 
343d0 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20  path .*/.static 
343e0 69 6e 74 20 73 77 69 74 63 68 4c 6f 63 6b 50 72  int switchLockPr
343f0 6f 78 79 50 61 74 68 28 75 6e 69 78 46 69 6c 65  oxyPath(unixFile
34400 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63   *pFile, const c
34410 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70  har *path) {.  p
34420 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
34430 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
34440 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
34450 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34460 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61 72 20 2a  ontext;.  char *
34470 6f 6c 64 50 61 74 68 20 3d 20 70 43 74 78 2d 3e  oldPath = pCtx->
34480 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
34490 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
344a0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c  _OK;..  if( pFil
344b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
344c0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
344d0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
344e0 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74  .  }  ..  /* not
344f0 68 69 6e 67 20 74 6f 20 64 6f 20 69 66 20 74 68  hing to do if th
34500 65 20 70 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20  e path is NULL, 
34510 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65  :auto: or matche
34520 73 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 70  s the existing p
34530 61 74 68 20 2a 2f 0a 20 20 69 66 28 20 21 70 61  ath */.  if( !pa
34540 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27  th || path[0]=='
34550 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70  \0' || !strcmp(p
34560 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c  ath, ":auto:") |
34570 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74 68 20 26  |.    (oldPath &
34580 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61  & !strncmp(oldPa
34590 74 68 2c 20 70 61 74 68 2c 20 4d 41 58 50 41 54  th, path, MAXPAT
345a0 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20 20 72 65  HLEN)) ){.    re
345b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
345c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
345d0 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
345e0 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
345f0 78 79 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f  xy;.    pCtx->lo
34600 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20  ckProxy=NULL;.  
34610 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c    pCtx->conchHel
34620 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c  d = 0;.    if( l
34630 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29  ockProxy!=NULL )
34640 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f 63 6b 50  {.      rc=lockP
34650 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  roxy->pMethod->x
34660 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
34670 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29  ile *)lockProxy)
34680 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
34690 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
346a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c    sqlite3_free(l
346b0 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d  ockProxy);.    }
346c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
346d0 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20 20 20 20  e(oldPath);.    
346e0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
346f0 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
34700 74 72 44 75 70 28 30 2c 20 70 61 74 68 29 3b 0a  trDup(0, path);.
34710 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
34720 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69  rc;.}../*.** pFi
34730 6c 65 20 69 73 20 61 20 66 69 6c 65 20 74 68 61  le is a file tha
34740 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65  t has been opene
34750 64 20 62 79 20 61 20 70 72 69 6f 72 20 78 4f 70  d by a prior xOp
34760 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50 61 74 68  en call.  dbPath
34770 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20  .** is a string 
34780 62 75 66 66 65 72 20 61 74 20 6c 65 61 73 74 20  buffer at least 
34790 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20 63 68 61  MAXPATHLEN+1 cha
347a0 72 61 63 74 65 72 73 20 69 6e 20 73 69 7a 65 2e  racters in size.
347b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
347c0 69 6e 65 20 66 69 6e 64 20 74 68 65 20 66 69 6c  ine find the fil
347d0 65 6e 61 6d 65 20 61 73 73 6f 63 69 61 74 65 64  ename associated
347e0 20 77 69 74 68 20 70 46 69 6c 65 20 61 6e 64 20   with pFile and 
347f0 77 72 69 74 65 73 20 69 74 0a 2a 2a 20 69 6e 74  writes it.** int
34800 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74   dbPath..*/.stat
34810 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 44  ic int proxyGetD
34820 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
34830 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
34840 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68 29 7b  , char *dbPath){
34850 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
34860 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28 20 70 46  PPLE__).  if( pF
34870 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
34880 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
34890 0a 20 20 20 20 2f 2a 20 61 66 70 20 73 74 79 6c  .    /* afp styl
348a0 65 20 6b 65 65 70 73 20 61 20 72 65 66 65 72 65  e keeps a refere
348b0 6e 63 65 20 74 6f 20 74 68 65 20 64 62 20 70 61  nce to the db pa
348c0 74 68 20 69 6e 20 74 68 65 20 66 69 6c 65 50 61  th in the filePa
348d0 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a  th field .    **
348e0 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 20 2a   of the struct *
348f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 69  /.    assert( (i
34900 6e 74 29 73 74 72 6c 65 6e 28 28 63 68 61 72 2a  nt)strlen((char*
34910 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34920 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48  ontext)<=MAXPATH
34930 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63  LEN );.    strlc
34940 70 79 28 64 62 50 61 74 68 2c 20 28 28 61 66 70  py(dbPath, ((afp
34950 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
34960 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34970 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74 68 2c  ontext)->dbPath,
34980 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
34990 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20  } else.#endif.  
349a0 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  if( pFile->pMeth
349b0 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f  od == &dotlockIo
349c0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
349d0 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65  * dot lock style
349e0 20 75 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e   uses the lockin
349f0 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f  g context to sto
34a00 72 65 20 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a  re the dot lock.
34a10 20 20 20 20 2a 2a 20 66 69 6c 65 20 70 61 74 68      ** file path
34a20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20   */.    int len 
34a30 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a  = strlen((char *
34a40 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34a50 6f 6e 74 65 78 74 29 20 2d 20 73 74 72 6c 65 6e  ontext) - strlen
34a60 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29  (DOTLOCK_SUFFIX)
34a70 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 50  ;.    memcpy(dbP
34a80 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69  ath, (char *)pFi
34a90 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
34aa0 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20  xt, len + 1);.  
34ab0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c  }else{.    /* al
34ac0 6c 20 6f 74 68 65 72 20 73 74 79 6c 65 73 20 75  l other styles u
34ad0 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  se the locking c
34ae0 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20  ontext to store 
34af0 74 68 65 20 64 62 20 66 69 6c 65 20 70 61 74 68  the db file path
34b00 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
34b10 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46  strlen((char*)pF
34b20 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
34b30 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e  ext)<=MAXPATHLEN
34b40 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28   );.    strlcpy(
34b50 64 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29  dbPath, (char *)
34b60 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
34b70 6e 74 65 78 74 2c 20 4d 41 58 50 41 54 48 4c 45  ntext, MAXPATHLE
34b80 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  N);.  }.  return
34b90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
34ba0 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c  *.** Takes an al
34bb0 72 65 61 64 79 20 66 69 6c 6c 65 64 20 69 6e 20  ready filled in 
34bc0 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 61 6c  unix file and al
34bd0 74 65 72 73 20 69 74 20 73 6f 20 61 6c 6c 20 66  ters it so all f
34be0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20  ile locking .** 
34bf0 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d 65  will be performe
34c00 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  d on the local p
34c10 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20  roxy lock file. 
34c20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
34c30 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70 72 65  ields.** are pre
34c40 73 65 72 76 65 64 20 69 6e 20 74 68 65 20 6c 6f  served in the lo
34c50 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f  cking context so
34c60 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62   that they can b
34c70 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 0a  e restored and .
34c80 2a 2a 20 74 68 65 20 75 6e 69 78 20 73 74 72 75  ** the unix stru
34c90 63 74 75 72 65 20 70 72 6f 70 65 72 6c 79 20 63  cture properly c
34ca0 6c 65 61 6e 65 64 20 75 70 20 61 74 20 63 6c 6f  leaned up at clo
34cb0 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c  se time:.**  ->l
34cc0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a  ockingContext.**
34cd0 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73    ->pMethod.*/.s
34ce0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
34cf0 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
34d00 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
34d10 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  , const char *pa
34d20 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  th) {.  proxyLoc
34d30 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
34d40 78 3b 0a 20 20 63 68 61 72 20 64 62 50 61 74 68  x;.  char dbPath
34d50 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20  [MAXPATHLEN+1]; 
34d60 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
34d70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34d80 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f  le */.  char *lo
34d90 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69  ckPath=NULL;.  i
34da0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
34db0 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46 69 6c  K;.  .  if( pFil
34dc0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
34dd0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
34de0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
34df0 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47 65 74 44  .  }.  proxyGetD
34e00 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
34e10 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68 29 3b  (pFile, dbPath);
34e20 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20  .  if( !path || 
34e30 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c  path[0]=='\0' ||
34e40 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22   !strcmp(path, "
34e50 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20  :auto:") ){.    
34e60 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20  lockPath=NULL;. 
34e70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b   }else{.    lock
34e80 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70 61 74  Path=(char *)pat
34e90 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52  h;.  }.  .  OSTR
34ea0 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE(("TRANSPROXY
34eb0 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
34ec0 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
34ed0 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c 6f 63  .           (loc
34ee0 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68  kPath ? lockPath
34ef0 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65   : ":auto:"), ge
34f00 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 70 43 74  tpid()));..  pCt
34f10 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
34f20 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78  oc( sizeof(*pCtx
34f30 29 20 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d  ) );.  if( pCtx=
34f40 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
34f50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
34f60 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 74 78   }.  memset(pCtx
34f70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74  , 0, sizeof(*pCt
34f80 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f  x));..  rc = pro
34f90 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74  xyCreateConchPat
34fa0 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20 26 70  hname(dbPath, &p
34fb0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
34fc0 74 68 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  th);.  if( rc==S
34fd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34fe0 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65  rc = proxyCreate
34ff0 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d 3e 63  UnixFile(pCtx->c
35000 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26 70  onchFilePath, &p
35010 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c 20  Ctx->conchFile, 
35020 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
35030 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
35040 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f 70 65 6e  && ((pFile->open
35050 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d  Flags&O_RDWR) ==
35060 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   0) ){.      /* 
35070 69 66 20 28 61 29 20 74 68 65 20 6f 70 65 6e 20  if (a) the open 
35080 66 6c 61 67 73 20 61 72 65 20 6e 6f 74 20 4f 5f  flags are not O_
35090 52 44 57 52 2c 20 28 62 29 20 74 68 65 20 63 6f  RDWR, (b) the co
350a0 6e 63 68 20 69 73 6e 27 74 20 74 68 65 72 65 2c  nch isn't there,
350b0 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 63   and.      ** (c
350c0 29 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  ) the file syste
350d0 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  m is read-only, 
350e0 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c  then enable no-l
350f0 6f 63 6b 69 6e 67 20 61 63 63 65 73 73 2e 0a 20  ocking access.. 
35100 20 20 20 20 20 2a 2a 20 55 67 68 2c 20 73 69 6e       ** Ugh, sin
35110 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30  ce O_RDONLY==0x0
35120 30 30 30 20 77 65 20 74 65 73 74 20 66 6f 72 20  000 we test for 
35130 21 4f 5f 52 44 57 52 20 73 69 6e 63 65 20 75 6e  !O_RDWR since un
35140 69 78 4f 70 65 6e 20 61 73 73 65 72 74 73 0a 20  ixOpen asserts. 
35150 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70 65       ** that ope
35160 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68 61 76 65  nFlags will have
35170 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f 52   only one of O_R
35180 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44 57 52 2e  DONLY or O_RDWR.
35190 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
351a0 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
351b0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
351c0 63 74 20 73 74 61 74 20 63 6f 6e 63 68 49 6e 66  ct stat conchInf
351d0 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 67 6f 4c  o;.      int goL
351e0 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a 20 20  ockless = 0;..  
351f0 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 70      if( osStat(p
35200 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
35210 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20  th, &conchInfo) 
35220 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20  == -1 ) {.      
35230 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
35240 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  o;.        if( (
35250 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20  err==ENOENT) && 
35260 28 73 74 61 74 66 73 28 64 62 50 61 74 68 2c 20  (statfs(dbPath, 
35270 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20  &fsInfo) != -1) 
35280 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 4c  ){.          goL
35290 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e 66  ockless = (fsInf
352a0 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44  o.f_flags&MNT_RD
352b0 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f  ONLY) == MNT_RDO
352c0 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  NLY;.        }. 
352d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
352e0 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20   goLockless ){. 
352f0 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e         pCtx->con
35300 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20  chHeld = -1; /* 
35310 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f  read only FS/ lo
35320 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20  ckless */.      
35330 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
35340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
35350 20 20 7d 20 20 0a 20 20 69 66 28 20 72 63 3d 3d    }  .  if( rc==
35360 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63  SQLITE_OK && loc
35370 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74  kPath ){.    pCt
35380 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35390 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
353a0 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b  up(0, lockPath);
353b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
353c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
353d0 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20   pCtx->dbPath = 
353e0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
353f0 30 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 20 20  0, dbPath);.    
35400 69 66 28 20 70 43 74 78 2d 3e 64 62 50 61 74 68  if( pCtx->dbPath
35410 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ==NULL ){.      
35420 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
35430 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  M;.    }.  }.  i
35440 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35450 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d   ){.    /* all m
35460 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
35470 65 64 2c 20 70 72 6f 78 79 73 20 61 72 65 20 63  ed, proxys are c
35480 72 65 61 74 65 64 20 61 6e 64 20 61 73 73 69 67  reated and assig
35490 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69  ned, .    ** swi
354a0 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  tch the locking 
354b0 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74  context and pMet
354c0 68 6f 64 20 74 68 65 6e 20 72 65 74 75 72 6e 2e  hod then return.
354d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 74 78  .    */.    pCtx
354e0 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ->oldLockingCont
354f0 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ext = pFile->loc
35500 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
35510 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
35520 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20  ontext = pCtx;. 
35530 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74     pCtx->pOldMet
35540 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65  hod = pFile->pMe
35550 74 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d  thod;.    pFile-
35560 3e 70 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78  >pMethod = &prox
35570 79 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  yIoMethods;.  }e
35580 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74  lse{.    if( pCt
35590 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20  x->conchFile ){ 
355a0 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e  .      pCtx->con
355b0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
355c0 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
355d0 5f 66 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f  _file *)pCtx->co
355e0 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  nchFile);.      
355f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
35600 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  x->conchFile);. 
35610 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
35620 44 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e  DbFree(0, pCtx->
35630 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a  lockProxyPath);.
35640 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
35650 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
35660 50 61 74 68 29 3b 20 0a 20 20 20 20 73 71 6c 69  Path); .    sqli
35670 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a  te3_free(pCtx);.
35680 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
35690 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64 20 25  TRANSPROXY  %d %
356a0 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  s\n", pFile->h,.
356b0 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d             (rc==
356c0 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
356d0 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a   : "failed")));.
356e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
356f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
35700 69 6e 65 20 68 61 6e 64 6c 65 73 20 73 71 6c 69  ine handles sqli
35710 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
35720 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 61 72  () calls that ar
35730 65 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  e specific.** to
35740 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a   proxy locking..
35750 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
35760 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  oxyFileControl(s
35770 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
35780 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
35790 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20  Arg){.  switch( 
357a0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
357b0 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
357c0 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
357d0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
357e0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
357f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c  ;.      if( pFil
35800 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70  e->pMethod == &p
35810 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b  roxyIoMethods ){
35820 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f  .        proxyLo
35830 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
35840 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
35850 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65  ngContext*)pFile
35860 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
35870 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 54  ;.        proxyT
35880 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  akeConch(pFile);
35890 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74  .        if( pCt
358a0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
358b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28   ){.          *(
358c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41  const char **)pA
358d0 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  rg = pCtx->lockP
358e0 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20  roxyPath;.      
358f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35900 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20     *(const char 
35910 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61 75 74 6f  **)pArg = ":auto
35920 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20  : (not held)";. 
35930 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35940 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
35950 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
35960 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  pArg = NULL;.   
35970 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
35980 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
35990 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
359a0 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
359b0 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  FILE: {.      un
359c0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
359d0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
359e0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
359f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
35a00 6e 74 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20  nt isProxyStyle 
35a10 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  = (pFile->pMetho
35a20 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74  d == &proxyIoMet
35a30 68 6f 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28  hods);.      if(
35a40 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28   pArg==NULL || (
35a50 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72  const char *)pAr
35a60 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
35a70 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65  if( isProxyStyle
35a80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
35a90 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20   turn off proxy 
35aa0 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75  locking - not su
35ab0 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 20  pported */.     
35ac0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
35ad0 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f  _ERROR /*SQLITE_
35ae0 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45  PROTOCOL? SQLITE
35af0 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20  _MISUSE?*/;.    
35b00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35b10 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66       /* turn off
35b20 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d   proxy locking -
35b30 20 61 6c 72 65 61 64 79 20 6f 66 66 20 2d 20 4e   already off - N
35b40 4f 4f 50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  OOP */.         
35b50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
35b60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35b80 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78  const char *prox
35b90 79 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63  yPath = (const c
35ba0 68 61 72 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  har *)pArg;.    
35bb0 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53      if( isProxyS
35bc0 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tyle ){.        
35bd0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
35be0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 0a 20  ntext *pCtx = . 
35bf0 20 20 20 20 20 20 20 20 20 20 20 28 70 72 6f 78             (prox
35c00 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
35c10 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
35c20 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  ontext;.        
35c30 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 70 41    if( !strcmp(pA
35c40 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20  rg, ":auto:") . 
35c50 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 43            || (pC
35c60 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
35c70 68 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  h &&.           
35c80 20 20 20 20 21 73 74 72 6e 63 6d 70 28 70 43 74      !strncmp(pCt
35c90 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35ca0 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 4d 41 58  , proxyPath, MAX
35cb0 50 41 54 48 4c 45 4e 29 29 0a 20 20 20 20 20 20  PATHLEN)).      
35cc0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
35cd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
35ce0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  K;.          }el
35cf0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
35d00 72 63 20 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50  rc = switchLockP
35d10 72 6f 78 79 50 61 74 68 28 70 46 69 6c 65 2c 20  roxyPath(pFile, 
35d20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  proxyPath);.    
35d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35d40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
35d50 20 2f 2a 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78   /* turn on prox
35d60 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a  y file locking *
35d70 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
35d80 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
35d90 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 70  nixFile(pFile, p
35da0 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20  roxyPath);.     
35db0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35dc0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
35dd0 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
35de0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
35df0 20 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 63 61   0 );  /* The ca
35e00 6c 6c 20 61 73 73 75 72 65 73 20 74 68 61 74 20  ll assures that 
35e10 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70 63 6f 64  only valid opcod
35e20 65 73 20 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20  es are sent */. 
35e30 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
35e40 52 45 41 43 48 45 44 2a 2f 0a 20 20 72 65 74 75  REACHED*/.  retu
35e50 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
35e60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e  .}../*.** Within
35e70 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 20 28   this division (
35e80 74 68 65 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63  the proxying loc
35e90 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
35ea0 69 6f 6e 29 20 74 68 65 20 70 72 6f 63 65 64 75  ion) the procedu
35eb0 72 65 73 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69  res.** above thi
35ec0 73 20 70 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20  s point are all 
35ed0 75 74 69 6c 69 74 69 65 73 2e 20 20 54 68 65 20  utilities.  The 
35ee0 6c 6f 63 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74  lock-related met
35ef0 68 6f 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70  hods of the.** p
35f00 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c  roxy-locking sql
35f10 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f  ite3_io_method o
35f20 62 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f  bject follow..*/
35f30 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
35f40 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
35f50 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
35f60 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
35f70 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
35f80 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
35f90 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
35fa0 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
35fb0 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
35fc0 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
35fd0 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
35fe0 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
35ff0 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
36000 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
36010 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
36020 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
36030 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
36040 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
36050 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
36060 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
36070 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
36080 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
36090 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
360a0 74 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  t) {.  unixFile 
360b0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
360c0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
360d0 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63   = proxyTakeConc
360e0 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  h(pFile);.  if( 
360f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36100 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
36110 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
36120 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
36130 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
36140 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
36150 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
36160 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20  chHeld>0 ){.    
36170 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78    unixFile *prox
36180 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
36190 6f 78 79 3b 0a 20 20 20 20 20 20 72 65 74 75 72  oxy;.      retur
361a0 6e 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  n proxy->pMethod
361b0 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  ->xCheckReserved
361c0 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
361d0 6c 65 2a 29 70 72 6f 78 79 2c 20 70 52 65 73 4f  le*)proxy, pResO
361e0 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20  ut);.    }else{ 
361f0 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30  /* conchHeld < 0
36200 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   is lockless */.
36210 20 20 20 20 20 20 70 52 65 73 4f 75 74 3d 30 3b        pResOut=0;
36220 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
36230 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
36240 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
36250 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
36260 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
36270 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
36280 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
36290 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
362a0 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
362b0 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
362c0 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
362d0 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
362e0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
362f0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
36300 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
36310 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
36320 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
36330 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
36340 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
36350 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
36360 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
36370 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
36380 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
36390 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
363a0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
363b0 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
363c0 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
363d0 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
363e0 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
363f0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
36400 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
36410 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
36420 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
36430 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
36440 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
36450 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
36460 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
36470 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
36480 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
36490 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
364a0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
364b0 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
364c0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
364d0 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
364e0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
364f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
36500 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
36510 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
36520 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
36530 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
36540 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
36550 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
36560 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c  tatic int proxyL
36570 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
36580 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
36590 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
365a0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
365b0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
365c0 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f  rc = proxyTakeCo
365d0 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  nch(pFile);.  if
365e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
365f0 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  ){.    proxyLock
36600 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
36610 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
36620 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
36630 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
36640 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63  .    if( pCtx->c
36650 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20  onchHeld>0 ){.  
36660 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72      unixFile *pr
36670 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
36680 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20  Proxy;.      rc 
36690 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  = proxy->pMethod
366a0 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
366b0 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46  _file*)proxy, eF
366c0 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  ileLock);.      
366d0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
366e0 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c   = proxy->eFileL
366f0 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
36700 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65        /* conchHe
36710 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65  ld < 0 is lockle
36720 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  ss */.    }.  }.
36730 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
36740 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
36750 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
36760 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
36770 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
36780 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
36790 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
367a0 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
367b0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
367c0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
367d0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
367e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
367f0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
36800 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
36810 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
36820 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
36830 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
36840 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
36850 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
36860 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
36870 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
36880 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
36890 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
368a0 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b  nt rc = proxyTak
368b0 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
368c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
368d0 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c  OK ){.    proxyL
368e0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
368f0 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
36900 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
36910 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
36920 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78  xt;.    if( pCtx
36930 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b  ->conchHeld>0 ){
36940 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
36950 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  *proxy = pCtx->l
36960 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20  ockProxy;.      
36970 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74  rc = proxy->pMet
36980 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
36990 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78  lite3_file*)prox
369a0 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  y, eFileLock);. 
369b0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
369c0 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65  eLock = proxy->e
369d0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65  FileLock;.    }e
369e0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f  lse{.      /* co
369f0 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c  nchHeld < 0 is l
36a00 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d  ockless */.    }
36a10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
36a20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
36a30 20 61 20 66 69 6c 65 20 74 68 61 74 20 75 73 65   a file that use
36a40 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a  s proxy locks..*
36a50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
36a60 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
36a70 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
36a80 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
36a90 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
36aa0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
36ab0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
36ac0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
36ad0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
36ae0 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
36af0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75  ngContext;.    u
36b00 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
36b10 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
36b20 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69  roxy;.    unixFi
36b30 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
36b40 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
36b50 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
36b60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20  LITE_OK;.    .  
36b70 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20    if( lockProxy 
36b80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  ){.      rc = lo
36b90 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
36ba0 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
36bb0 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f  e3_file*)lockPro
36bc0 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  xy, NO_LOCK);.  
36bd0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
36be0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63  urn rc;.      rc
36bf0 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d   = lockProxy->pM
36c00 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73  ethod->xClose((s
36c10 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63  qlite3_file*)loc
36c20 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69  kProxy);.      i
36c30 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
36c40 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
36c50 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29  _free(lockProxy)
36c60 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f  ;.      pCtx->lo
36c70 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20  ckProxy = 0;.   
36c80 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68   }.    if( conch
36c90 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  File ){.      if
36ca0 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
36cb0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  d ){.        rc 
36cc0 3d 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f  = proxyReleaseCo
36cd0 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nch(pFile);.    
36ce0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
36cf0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
36d00 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
36d10 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
36d20 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
36d30 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b  ile*)conchFile);
36d40 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
36d50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
36d60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f   sqlite3_free(co
36d70 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  nchFile);.    }.
36d80 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
36d90 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  e(0, pCtx->lockP
36da0 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73  roxyPath);.    s
36db0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
36dc0 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29  ->conchFilePath)
36dd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
36de0 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 64 62 50  ree(0, pCtx->dbP
36df0 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73  ath);.    /* res
36e00 74 6f 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61  tore the origina
36e10 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  l locking contex
36e20 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68  t and pMethod th
36e30 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20  en close it */. 
36e40 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e     pFile->lockin
36e50 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 2d  gContext = pCtx-
36e60 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  >oldLockingConte
36e70 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  xt;.    pFile->p
36e80 4d 65 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70  Method = pCtx->p
36e90 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73  OldMethod;.    s
36ea0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
36eb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 46  );.    return pF
36ec0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  ile->pMethod->xC
36ed0 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  lose(id);.  }.  
36ee0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
36ef0 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a  ;.}....#endif /*
36f00 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
36f10 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
36f20 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
36f30 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
36f40 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74  proxy locking st
36f50 79 6c 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  yle is intended 
36f60 66 6f 72 20 75 73 65 20 77 69 74 68 20 41 46 50  for use with AFP
36f70 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a   filesystems..**
36f80 20 41 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69   And since AFP i
36f90 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64  s only supported
36fa0 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20   on MacOSX, the 
36fb0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
36fc0 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63   also.** restric
36fd0 74 65 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a  ted to MacOSX..*
36fe0 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  * .**.**********
36ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
37000 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
37010 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
37020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37030 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
37040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37080 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ****/../*.** Ini
37090 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72  tialize the oper
370a0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
370b0 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  erface..**.** Th
370c0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73  is routine regis
370d0 74 65 72 73 20 61 6c 6c 20 56 46 53 20 69 6d 70  ters all VFS imp
370e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72  lementations for
370f0 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61   unix-like opera
37100 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e  ting.** systems.
37110 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 2c 20    This routine, 
37120 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f  and the sqlite3_
37130 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e 65  os_end() routine
37140 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a   that follows,.*
37150 2a 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  * should be the 
37160 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73 20 69 6e  only routines in
37170 20 74 68 69 73 20 66 69 6c 65 20 74 68 61 74 20   this file that 
37180 61 72 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d  are visible from
37190 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e   other.** files.
371a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
371b0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
371c0 63 65 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65  ce during SQLite
371d0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
371e0 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67  and by a.** sing
371f0 6c 65 20 74 68 72 65 61 64 2e 20 20 54 68 65 20  le thread.  The 
37200 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
37210 6e 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73  n and mutex subs
37220 79 73 74 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a  ystems have not.
37230 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62  ** necessarily b
37240 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
37250 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
37260 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64  e is called, and
37270 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75   so they.** shou
37280 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a  ld not be used..
37290 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
372a0 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20  s_init(void){ . 
372b0 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f   /* .  ** The fo
372c0 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64 65  llowing macro de
372d0 66 69 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c  fines an initial
372e0 69 7a 65 72 20 66 6f 72 20 61 6e 20 73 71 6c 69  izer for an sqli
372f0 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
37300 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66    ** The name of
37310 20 74 68 65 20 56 46 53 20 69 73 20 4e 41 4d 45   the VFS is NAME
37320 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 20  .  The pAppData 
37330 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
37340 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74  a pointer.  ** t
37350 6f 20 74 68 65 20 22 66 69 6e 64 65 72 22 20 66  o the "finder" f
37360 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41 70 70 44  unction.  (pAppD
37370 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ata is a pointer
37380 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 62 65   to a pointer be
37390 63 61 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c 79  cause.  ** silly
373a0 20 43 39 30 20 72 75 6c 65 73 20 70 72 6f 68 69   C90 rules prohi
373b0 62 69 74 20 61 20 76 6f 69 64 2a 20 66 72 6f 6d  bit a void* from
373c0 20 62 65 69 6e 67 20 63 61 73 74 20 74 6f 20 61   being cast to a
373d0 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
373e0 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77 65  r.  ** and so we
373f0 20 68 61 76 65 20 74 6f 20 67 6f 20 74 68 72 6f   have to go thro
37400 75 67 68 20 74 68 65 20 69 6e 74 65 72 6d 65 64  ugh the intermed
37410 69 61 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  iate pointer to 
37420 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20  avoid problems. 
37430 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
37440 6e 67 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  ng with -pedanti
37450 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47 43 43 2e  c-errors on GCC.
37460 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
37470 46 49 4e 44 45 52 20 70 61 72 61 6d 65 74 65 72  FINDER parameter
37480 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69   to this macro i
37490 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
374a0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
374b0 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e  .  ** finder-fun
374c0 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64  ction.  The find
374d0 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  er-function retu
374e0 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
374f0 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
37500 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
37510 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
37520 74 73 20 74 68 65 20 64 65 73 69 72 65 64 20 6c  ts the desired l
37530 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61  ocking.  ** beha
37540 76 69 6f 72 73 2e 20 20 53 65 65 20 74 68 65 20  viors.  See the 
37550 64 69 76 69 73 69 6f 6e 20 61 62 6f 76 65 20 74  division above t
37560 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
37570 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20   IOMETHODS.  ** 
37580 6d 61 63 72 6f 20 66 6f 72 20 61 64 64 69 74 69  macro for additi
37590 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  on information o
375a0 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  n finder-functio
375b0 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ns..  **.  ** Mo
375c0 73 74 20 66 69 6e 64 65 72 73 20 73 69 6d 70 6c  st finders simpl
375d0 79 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  y return a point
375e0 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
375f0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
37600 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42  .  ** object.  B
37610 75 74 20 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b  ut the "autolock
37620 49 6f 46 69 6e 64 65 72 22 20 61 76 61 69 6c 61  IoFinder" availa
37630 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f  ble on MacOSX do
37640 65 73 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a  es a little.  **
37650 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 61 74 3b   more than that;
37660 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65   it looks at the
37670 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   filesystem type
37680 20 74 68 61 74 20 68 6f 73 74 73 20 74 68 65 20   that hosts the 
37690 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
376a0 69 6c 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f  ile and tries to
376b0 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69   choose an locki
376c0 6e 67 20 6d 65 74 68 6f 64 20 61 70 70 72 6f 70  ng method approp
376d0 72 69 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74  riate for.  ** t
376e0 68 61 74 20 66 69 6c 65 73 79 73 74 65 6d 20 74  hat filesystem t
376f0 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66  ime..  */.  #def
37700 69 6e 65 20 55 4e 49 58 56 46 53 28 56 46 53 4e  ine UNIXVFS(VFSN
37710 41 4d 45 2c 20 46 49 4e 44 45 52 29 20 7b 20 20  AME, FINDER) {  
37720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37730 20 20 20 20 20 20 5c 0a 20 20 20 20 33 2c 20 20        \.    3,  
37740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37750 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
37760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37770 20 20 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66      \.    sizeof
37780 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20  (unixFile),     
37790 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20  /* szOsFile */  
377a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
377b0 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48    \.    MAX_PATH
377c0 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a  NAME,         /*
377d0 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20   mxPathname */  
377e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
377f0 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  \.    0,        
37800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
37810 4e 65 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20  Next */         
37820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
37830 20 20 20 20 56 46 53 4e 41 4d 45 2c 20 20 20 20      VFSNAME,    
37840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
37850 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
37860 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37870 20 20 28 76 6f 69 64 2a 29 26 46 49 4e 44 45 52    (void*)&FINDER
37880 2c 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44  ,       /* pAppD
37890 61 74 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ata */          
378a0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
378b0 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20  unixOpen,       
378c0 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
378d0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
378e0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
378f0 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  ixDelete,       
37900 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
37910 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
37920 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
37930 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
37940 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20    /* xAccess */ 
37950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37960 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75      \.    unixFu
37970 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
37980 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
37990 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
379a0 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70    \.    unixDlOp
379b0 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  en,           /*
379c0 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20   xDlOpen */     
379d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
379e0 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f  \.    unixDlErro
379f0 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  r,          /* x
37a00 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20  DlError */      
37a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
37a20 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20      unixDlSym,  
37a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
37a40 53 79 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20  Sym */          
37a50 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37a60 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20    unixDlClose,  
37a70 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
37a80 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
37a90 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
37aa0 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20  unixRandomness, 
37ab0 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
37ac0 6e 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ness */         
37ad0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
37ae0 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  ixSleep,        
37af0 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
37b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b10 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
37b20 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
37b30 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
37b40 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
37b50 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65      \.    unixGe
37b60 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
37b70 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
37b80 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37b90 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75 72 72    \.    unixCurr
37ba0 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a  entTimeInt64, /*
37bb0 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
37bc0 36 34 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  64 */           
37bd0 5c 0a 20 20 20 20 75 6e 69 78 53 65 74 53 79 73  \.    unixSetSys
37be0 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
37bf0 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  SetSystemCall */
37c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
37c10 20 20 20 20 75 6e 69 78 47 65 74 53 79 73 74 65      unixGetSyste
37c20 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65  mCall,    /* xGe
37c30 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20  tSystemCall */  
37c40 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37c50 20 20 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d    unixNextSystem
37c60 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74  Call,   /* xNext
37c70 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20 20  SystemCall */   
37c80 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
37c90 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64  .  /*.  ** All d
37ca0 65 66 61 75 6c 74 20 56 46 53 65 73 20 66 6f 72  efault VFSes for
37cb0 20 75 6e 69 78 20 61 72 65 20 63 6f 6e 74 61 69   unix are contai
37cc0 6e 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ned in the follo
37cd0 77 69 6e 67 20 61 72 72 61 79 2e 0a 20 20 2a 2a  wing array..  **
37ce0 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
37cf0 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  the sqlite3_vfs.
37d00 70 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 74  pNext field of t
37d10 68 65 20 56 46 53 20 6f 62 6a 65 63 74 20 69 73  he VFS object is
37d20 20 6d 6f 64 69 66 69 65 64 0a 20 20 2a 2a 20 62   modified.  ** b
37d30 79 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  y the SQLite cor
37d40 65 20 77 68 65 6e 20 74 68 65 20 56 46 53 20 69  e when the VFS i
37d50 73 20 72 65 67 69 73 74 65 72 65 64 2e 20 20 53  s registered.  S
37d60 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
37d70 20 20 2a 2a 20 61 72 72 61 79 20 63 61 6e 6e 6f    ** array canno
37d80 74 20 62 65 20 63 6f 6e 73 74 2e 0a 20 20 2a 2f  t be const..  */
37d90 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
37da0 33 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d 20 7b  3_vfs aVfs[] = {
37db0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
37dc0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
37dd0 20 26 26 20 28 4f 53 5f 56 58 57 4f 52 4b 53 20   && (OS_VXWORKS 
37de0 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  || defined(__APP
37df0 4c 45 5f 5f 29 29 0a 20 20 20 20 55 4e 49 58 56  LE__)).    UNIXV
37e00 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20  FS("unix",      
37e10 20 20 20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69      autolockIoFi
37e20 6e 64 65 72 20 29 2c 0a 23 65 6c 73 65 0a 20 20  nder ),.#else.  
37e30 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22    UNIXVFS("unix"
37e40 2c 20 20 20 20 20 20 20 20 20 20 70 6f 73 69 78  ,          posix
37e50 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64  IoFinder ),.#end
37e60 69 66 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  if.    UNIXVFS("
37e70 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 20  unix-none",     
37e80 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  nolockIoFinder )
37e90 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
37ea0 6e 69 78 2d 64 6f 74 66 69 6c 65 22 2c 20 20 64  nix-dotfile",  d
37eb0 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  otlockIoFinder )
37ec0 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
37ed0 6e 69 78 2d 65 78 63 6c 22 2c 20 20 20 20 20 70  nix-excl",     p
37ee0 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a  osixIoFinder ),.
37ef0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
37f00 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
37f10 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49  -namedsem", semI
37f20 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
37f30 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
37f40 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
37f50 45 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  E.    UNIXVFS("u
37f60 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20 20 20 70  nix-posix",    p
37f70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a  osixIoFinder ),.
37f80 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a  #if !OS_VXWORKS.
37f90 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
37fa0 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f  x-flock",    flo
37fb0 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  ckIoFinder ),.#e
37fc0 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20  ndif.#endif.#if 
37fd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
37fe0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
37ff0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
38000 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ).    UNIXVFS("u
38010 6e 69 78 2d 61 66 70 22 2c 20 20 20 20 20 20 61  nix-afp",      a
38020 66 70 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20  fpIoFinder ),.  
38030 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
38040 6e 66 73 22 2c 20 20 20 20 20 20 6e 66 73 49 6f  nfs",      nfsIo
38050 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e  Finder ),.    UN
38060 49 58 56 46 53 28 22 75 6e 69 78 2d 70 72 6f 78  IXVFS("unix-prox
38070 79 22 2c 20 20 20 20 70 72 6f 78 79 49 6f 46 69  y",    proxyIoFi
38080 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20  nder ),.#endif. 
38090 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
380a0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
380b0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
380c0 2f 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63  /..  /* Double-c
380d0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 53  heck that the aS
380e0 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68  yscall[] array h
380f0 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63  as been construc
38100 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74  ted.  ** correct
38110 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  ly.  See ticket 
38120 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39 36  [bb3a86e890c8e96
38130 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ab] */.  assert(
38140 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63   ArraySize(aSysc
38150 61 6c 6c 29 3d 3d 31 36 20 29 3b 0a 0a 20 20 2f  all)==16 );..  /
38160 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 56  * Register all V
38170 46 53 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20  FSes defined in 
38180 74 68 65 20 61 56 66 73 5b 5d 20 61 72 72 61 79  the aVfs[] array
38190 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
381a0 3c 28 73 69 7a 65 6f 66 28 61 56 66 73 29 2f 73  <(sizeof(aVfs)/s
381b0 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 66  izeof(sqlite3_vf
381c0 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  s)); i++){.    s
381d0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
381e0 74 65 72 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d  ter(&aVfs[i], i=
381f0 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  =0);.  }.  retur
38200 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a  n SQLITE_OK; .}.
38210 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
38220 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
38230 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a  stem interface..
38240 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70 65 72 61  **.** Some opera
38250 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6d 69 67  ting systems mig
38260 68 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 73 6f  ht need to do so
38270 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e 20 74 68  me cleanup in th
38280 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74  is routine,.** t
38290 6f 20 72 65 6c 65 61 73 65 20 64 79 6e 61 6d 69  o release dynami
382a0 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
382b0 6f 62 6a 65 63 74 73 2e 20 20 42 75 74 20 6e 6f  objects.  But no
382c0 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54 68  t on unix..** Th
382d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
382e0 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69 78 2e 0a  no-op for unix..
382f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
38300 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20  s_end(void){ .  
38310 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
38320 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a  ; .}. .#endif /*
38330 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20   SQLITE_OS_UNIX 
38340 2a 2f 0a                                         */.