/ Hex Artifact Content
Login

Artifact dfe0ce8b089b2285bef0d6a987ec7d0d2ea9c825:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 6e 64 65 66 20 53 51  no.h>.#ifndef SQ
1140: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 69  LITE_OMIT_WAL.#i
1150: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1160: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  .h>.#endif..#if 
1170: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1180: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e  CKING_STYLE.# in
1190: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
11a0: 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f  .h>.# if OS_VXWO
11b0: 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  RKS.#  include <
11c0: 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20  semaphore.h>.#  
11d0: 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e  include <limits.
11e0: 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63  h>.# else.#  inc
11f0: 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68  lude <sys/file.h
1200: 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79  >.#  include <sy
1210: 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64  s/param.h>.# end
1220: 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  if.#endif /* SQL
1230: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1240: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
1250: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1260: 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45  __) || (SQLITE_E
1270: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1280: 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
1290: 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  KS).# include <s
12a0: 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64  ys/mount.h>.#end
12b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  if../*.** Allowe
12c0: 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78  d values of unix
12d0: 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a  File.fsFlags.*/.
12e0: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46  #define SQLITE_F
12f0: 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20  SFLAGS_IS_MSDOS 
1300: 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49      0x1../*.** I
1310: 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74  f we are to be t
1320: 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c  hread-safe, incl
1330: 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73  ude the pthreads
1340: 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69   header and defi
1350: 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  ne.** the SQLITE
1360: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61  _UNIX_THREADS ma
1370: 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  cro..*/.#if SQLI
1380: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20  TE_THREADSAFE.# 
1390: 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64  include <pthread
13a0: 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  .h>.# define SQL
13b0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
13c0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
13d0: 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   Default permiss
13e0: 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69  ions when creati
13f0: 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f  ng a new file.*/
1400: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1410: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
1420: 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e  MISSIONS.# defin
1430: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
1440: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1450: 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f  S 0644.#endif../
1460: 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  *. ** Default pe
1470: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
1480: 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f  reating auto pro
1490: 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64  xy dir. */.#ifnd
14a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
14b0: 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
14c0: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
14d0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
14e0: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
14f0: 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a  ONS 0755.#endif.
1500: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73  ./*.** Maximum s
1510: 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65  upported path-le
1520: 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ngth..*/.#define
1530: 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31   MAX_PATHNAME 51
1540: 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65  2../*.** Only se
1550: 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  t the lastErrno 
1560: 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  if the error cod
1570: 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f  e is a real erro
1580: 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20  r and not .** a 
1590: 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20  normal expected 
15a0: 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53  return code of S
15b0: 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51  QLITE_BUSY or SQ
15c0: 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69  LITE_OK.*/.#defi
15d0: 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  ne IS_LOCK_ERROR
15e0: 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49  (x)  ((x != SQLI
15f0: 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20  TE_OK) && (x != 
1600: 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f  SQLITE_BUSY))../
1610: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
1620: 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20  nces */.typedef 
1630: 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75  struct unixShm u
1640: 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20  nixShm;         
1650: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1660: 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ion shared memor
1670: 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  y */.typedef str
1680: 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1690: 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20  unixShmNode;    
16a0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
16b0: 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a  ory instance */.
16c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
16d0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69  nixInodeInfo uni
16e0: 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a  xInodeInfo;   /*
16f0: 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79   An i-node */.ty
1700: 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69  pedef struct Uni
1710: 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e  xUnusedFd UnixUn
1720: 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41  usedFd;     /* A
1730: 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
1740: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a  scriptor */../*.
1750: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66  ** Sometimes, af
1760: 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c  ter a file handl
1770: 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53  e is closed by S
1780: 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20  QLite, the file 
1790: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61  descriptor.** ca
17a0: 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69  nnot be closed i
17b0: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74  mmediately. In t
17c0: 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74  hese cases, inst
17d0: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c  ances of the fol
17e0: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
17f0: 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20  ure are used to 
1800: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64  store the file d
1810: 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20  escriptor while 
1820: 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a  waiting for an.*
1830: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
1840: 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72   either close or
1850: 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74   reuse it..*/.st
1860: 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46  ruct UnixUnusedF
1870: 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20  d {.  int fd;   
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
18a0: 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  or to close */. 
18b0: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
18c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
18d0: 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65  ags this file de
18e0: 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65  scriptor was ope
18f0: 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e  ned with */.  Un
1900: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
1910: 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  t;      /* Next 
1920: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1930: 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66  riptor on same f
1940: 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ile */.};../*.**
1950: 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   The unixFile st
1960: 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c  ructure is subcl
1970: 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66  ass of sqlite3_f
1980: 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20  ile specific to 
1990: 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20  the unix.** VFS 
19a0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e  implementations.
19b0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
19c0: 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78  ct unixFile unix
19d0: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69  File;.struct uni
19e0: 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65  xFile {.  sqlite
19f0: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
1a00: 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a  st *pMethod;  /*
1a10: 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   Always the firs
1a20: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e 69  t entry */.  uni
1a30: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
1a40: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
1a50: 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c   /* Info about l
1a60: 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f  ocks on this ino
1a70: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  de */.  int h;  
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1aa0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1ab0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  or */.  int dirf
1ac0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ae0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
1af0: 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  or the directory
1b00: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1b10: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b30: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b40: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1b60: 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20   ctrlFlags;     
1b70: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1b80: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1b90: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1ba0: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1bd0: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1be0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1bf0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1c00: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1c10: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1c20: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1c30: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1c40: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c60: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1c70: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1c80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c90: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1ca0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1cb0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1cc0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1cf0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1d00: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1d10: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d40: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d50: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d60: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d70: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1d80: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1da0: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1db0: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1dc0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1dd0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1de0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1df0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1e00: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e30: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e40: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e50: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1e60: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1e90: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1ea0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1eb0: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1ec0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
1ed0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
1ee0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ef0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1f00: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1f10: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1f20: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1f30: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1f40: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1f50: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1f60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1f70: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1f80: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1f90: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1fa0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1fb0: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1fc0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1fd0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1fe0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1ff0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
2000: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
2010: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2020: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2030: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2040: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2050: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2060: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2070: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
2080: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
2090: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
20a0: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
20b0: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
20c0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
20d0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
20e0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
20f0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
2100: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2110: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2120: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2130: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2140: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2150: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2160: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
2170: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2180: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2190: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
21a0: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
21b0: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
21c0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
21d0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
21e0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
21f0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
2200: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
2210: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2220: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2230: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
2240: 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65  for the unixFile
2250: 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61  .ctrlFlags bitma
2260: 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  sk:.*/.#define U
2270: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 30  NIXFILE_EXCL   0
2280: 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  x01     /* Conne
2290: 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20  ctions from one 
22a0: 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a  process only */.
22b0: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
22c0: 5f 52 44 4f 4e 4c 59 20 30 78 30 32 20 20 20 20  _RDONLY 0x02    
22d0: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
22e0: 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 0a  s read only */..
22f0: 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f  /*.** Include co
2300: 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f  de that is commo
2310: 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20  n to all os_*.c 
2320: 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64  files.*/.#includ
2330: 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a  e "os_common.h".
2340: 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61  ./*.** Define va
2350: 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61  rious macros tha
2360: 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72  t are missing fr
2370: 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e  om some systems.
2380: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41  .*/.#ifndef O_LA
2390: 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65  RGEFILE.# define
23a0: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23   O_LARGEFILE 0.#
23b0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
23c0: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a  ITE_DISABLE_LFS.
23d0: 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46  # undef O_LARGEF
23e0: 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c  ILE.# define O_L
23f0: 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69  ARGEFILE 0.#endi
2400: 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f  f.#ifndef O_NOFO
2410: 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f  LLOW.# define O_
2420: 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69  NOFOLLOW 0.#endi
2430: 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41  f.#ifndef O_BINA
2440: 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49  RY.# define O_BI
2450: 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  NARY 0.#endif../
2460: 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69  *.** The threadi
2470: 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73  d macro resolves
2480: 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69   to the thread-i
2490: 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64  d or to 0.  Used
24a0: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
24b0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
24c0: 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ly..*/.#if SQLIT
24d0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65  E_THREADSAFE.#de
24e0: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74  fine threadid pt
24f0: 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c  hread_self().#el
2500: 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61  se.#define threa
2510: 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  did 0.#endif../*
2520: 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20  .** Many system 
2530: 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73  calls are access
2540: 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74  ed through point
2550: 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20  er-to-functions 
2560: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20  so that.** they 
2570: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
2580: 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20  n at runtime to 
2590: 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74  facilitate fault
25a0: 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e   injection durin
25b0: 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  g.** testing and
25c0: 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68   sandboxing.  Th
25d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
25e0: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  y holds the name
25f0: 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a  s and pointers.*
2600: 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64  * to all overrid
2610: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
2620: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  ls..*/.static st
2630: 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c  ruct unix_syscal
2640: 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  l {.  const char
2650: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
2660: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2670: 68 65 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f  he sytem call */
2680: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
2690: 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b  ll_ptr pCurrent;
26a0: 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75   /* Current valu
26b0: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
26c0: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
26d0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44  3_syscall_ptr pD
26e0: 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75  efault; /* Defau
26f0: 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53  lt value */.} aS
2700: 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b  yscall[] = {.  {
2710: 20 22 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20   "open",        
2720: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
2730: 6c 5f 70 74 72 29 6f 70 65 6e 2c 20 20 20 20 20  l_ptr)open,     
2740: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
2750: 6f 73 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e  osOpen      ((in
2760: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
2770: 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61  ,int,int))aSysca
2780: 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[0].pCurrent).
2790: 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20  .  { "close",   
27a0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
27b0: 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c  scall_ptr)close,
27c0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
27d0: 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20  ine osClose     
27e0: 28 28 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53  ((int(*)(int))aS
27f0: 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65  yscall[1].pCurre
2800: 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73  nt)..  { "access
2810: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
2820: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63  3_syscall_ptr)ac
2830: 63 65 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a  cess,     0  },.
2840: 23 64 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73  #define osAccess
2850: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
2860: 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53  st char*,int))aS
2870: 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65  yscall[2].pCurre
2880: 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64  nt)..  { "getcwd
2890: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
28a0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65  3_syscall_ptr)ge
28b0: 74 63 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a  tcwd,     0  },.
28c0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64  #define osGetcwd
28d0: 20 20 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63      ((char*(*)(c
28e0: 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  har*,size_t))aSy
28f0: 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e  scall[3].pCurren
2900: 74 29 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20  t)..  { "stat", 
2910: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2920: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61  _syscall_ptr)sta
2930: 74 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  t,       0  },.#
2940: 64 65 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20  define osStat   
2950: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
2960: 74 20 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73  t char*,struct s
2970: 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34  tat*))aSyscall[4
2980: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a  ].pCurrent)../*.
2990: 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d  ** The DJGPP com
29a0: 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e  piler environmen
29b0: 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c  t looks mostly l
29c0: 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74  ike Unix, but it
29d0: 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63  .** lacks the fc
29e0: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
29f0: 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20  l.  So redefine 
2a00: 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f  fcntl() to be so
2a10: 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20  mething.** that 
2a20: 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
2a30: 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
2a40: 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e  t locking does n
2a50: 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a  ot occur under.*
2a60: 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74  * DJGPP.  But it
2a70: 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64   is DOS - what d
2a80: 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a  id you expect?.*
2a90: 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50  /.#ifdef __DJGPP
2aa0: 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20  __.  { "fstat", 
2ab0: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
2ac0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
2ad0: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28  #define osFstat(
2ae0: 61 2c 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73  a,b,c)    0.#els
2af0: 65 20 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61  e     .  { "fsta
2b00: 74 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  t",        (sqli
2b10: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2b20: 66 73 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d  fstat,      0  }
2b30: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61  ,.#define osFsta
2b40: 74 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  t     ((int(*)(i
2b50: 6e 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29  nt,struct stat*)
2b60: 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75  )aSyscall[5].pCu
2b70: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20  rrent).#endif.. 
2b80: 20 7b 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20   { "ftruncate", 
2b90: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2ba0: 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74  all_ptr)ftruncat
2bb0: 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e  e,  0  },.#defin
2bc0: 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28  e osFtruncate ((
2bd0: 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74  int(*)(int,off_t
2be0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43  ))aSyscall[6].pC
2bf0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63  urrent)..  { "fc
2c00: 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71  ntl",        (sq
2c10: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2c20: 72 29 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20  r)fcntl,      0 
2c30: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63   },.#define osFc
2c40: 6e 74 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29  ntl     ((int(*)
2c50: 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53  (int,int,...))aS
2c60: 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65  yscall[7].pCurre
2c70: 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c  nt)..  { "read",
2c80: 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
2c90: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65  3_syscall_ptr)re
2ca0: 61 64 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a  ad,       0  },.
2cb0: 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20  #define osRead  
2cc0: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
2cd0: 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f  (int,void*,size_
2ce0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70  t))aSyscall[8].p
2cf0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
2d00: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
2d10: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
2d20: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2d30: 47 5f 53 54 59 4c 45 29 0a 20 20 7b 20 22 70 72  G_STYLE).  { "pr
2d40: 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71  ead",        (sq
2d50: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2d60: 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30 20  r)pread,      0 
2d70: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
2d80: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
2d90: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2da0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
2db0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
2dc0: 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20 20  ine osPread     
2dd0: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
2de0: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66  ,void*,size_t,of
2df0: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d  f_t))aSyscall[9]
2e00: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
2e10: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
2e20: 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36  D64).  { "pread6
2e30: 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  4",      (sqlite
2e40: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
2e50: 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a  ead64,    0  },.
2e60: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
2e70: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
2e80: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
2e90: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
2ea0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
2eb0: 6f 73 50 72 65 61 64 36 34 20 20 20 28 28 73 73  osPread64   ((ss
2ec0: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
2ed0: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
2ee0: 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43  )aSyscall[10].pC
2ef0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72  urrent)..  { "wr
2f00: 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73 71  ite",        (sq
2f10: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2f20: 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20  r)write,      0 
2f30: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72   },.#define osWr
2f40: 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ite     ((ssize_
2f50: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
2f60: 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  oid*,size_t))aSy
2f70: 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65  scall[11].pCurre
2f80: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
2f90: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 64  (USE_PREAD) || d
2fa0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
2fb0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2fc0: 4c 45 29 0a 20 20 7b 20 22 70 77 72 69 74 65 22  LE).  { "pwrite"
2fd0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
2fe0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
2ff0: 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  ite,     0  },.#
3000: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
3010: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3020: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3030: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3040: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3050: 73 50 77 72 69 74 65 20 20 20 20 28 28 73 73 69  sPwrite    ((ssi
3060: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
3070: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
3080: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
3090: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
30a0: 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e  call[12].pCurren
30b0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
30c0: 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b  USE_PREAD64).  {
30d0: 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20   "pwrite64",    
30e0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
30f0: 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34 2c 20  l_ptr)pwrite64, 
3100: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
3110: 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20  { "pwrite64",   
3120: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3130: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3140: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
3150: 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65  #define osPwrite
3160: 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29  64  ((ssize_t(*)
3170: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
3180: 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c  ,size_t,off_t))\
3190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31a0: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 33       aSyscall[13
31b0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
31c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
31d0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b  OCKING_STYLE.  {
31e0: 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20   "fchmod",      
31f0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3200: 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20 20 20  l_ptr)fchmod,   
3210: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
3220: 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20 20  { "fchmod",     
3230: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3240: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3250: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
3260: 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64  #define osFchmod
3270: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
3280: 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c  ,mode_t))aSyscal
3290: 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[14].pCurrent).
32a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
32b0: 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
32c0: 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58  E) && HAVE_POSIX
32d0: 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22  _FALLOCATE.  { "
32e0: 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28  fallocate",    (
32f0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3300: 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ptr)posix_falloc
3310: 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ate,  0 },.#else
3320: 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22  .  { "fallocate"
3330: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
3340: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3350: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3360: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3370: 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e  osFallocate ((in
3380: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f  t(*)(int,off_t,o
3390: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
33a0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b  5].pCurrent)..};
33b0: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f   /* End of the o
33c0: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
33d0: 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a  em calls */../*.
33e0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
33f0: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20  SetSystemCall() 
3400: 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65  method of sqlite
3410: 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66  3_vfs for all of
3420: 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56   the.** "unix" V
3430: 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  FSes.  Return SQ
3440: 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63  LITE_OK opon suc
3450: 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69  cessfully updati
3460: 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d  ng the.** system
3470: 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f   call pointer, o
3480: 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  r SQLITE_NOTFOUN
3490: 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  D if there is no
34a0: 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a   configurable.**
34b0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
34c0: 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ed zName..*/.sta
34d0: 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53  tic int unixSetS
34e0: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
34f0: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
3500: 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ed,        /* Th
3510: 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20  e VFS pointer.  
3520: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f  Not used */.  co
3530: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
3540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3550: 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61  ame of system ca
3560: 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a  ll to override *
3570: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
3580: 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63  all_ptr pNewFunc
3590: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
35a0: 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  new system call 
35b0: 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e  value */.){.  un
35c0: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
35d0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
35e0: 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55  NOTFOUND;..  UNU
35f0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
3600: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a  otUsed);.  if( z
3610: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
3620: 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73  * If no zName is
3630: 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20   given, restore 
3640: 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  all system calls
3650: 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c   to their defaul
3660: 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67  t.    ** setting
3670: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
3680: 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  L.    */.    rc 
3690: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
36a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
36b0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
36c0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
36d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
36e0: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
36f0: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
3700: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
3710: 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c  urrent = aSyscal
3720: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
3730: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3740: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
3750: 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69  zName is specifi
3760: 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f  ed, operate on o
3770: 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74  nly the one syst
3780: 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  em call.    ** s
3790: 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f  pecified..    */
37a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
37b0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
37c0: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
37d0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
37e0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
37f0: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
3800: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
3810: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
3820: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30  l[i].pDefault==0
3830: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53   ){.          aS
3840: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
3850: 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  lt = aSyscall[i]
3860: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20  .pCurrent;.     
3870: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
3880: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
3890: 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e       if( pNewFun
38a0: 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20  c==0 ) pNewFunc 
38b0: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
38c0: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20  efault;.        
38d0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
38e0: 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b  rent = pNewFunc;
38f0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3900: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3910: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
3920: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
3930: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79  he value of a sy
3940: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
3950: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
3960: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63   is not a.** rec
3970: 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63  ognized system c
3980: 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20  all name.  NULL 
3990: 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
39a0: 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   if the system c
39b0: 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  all.** is curren
39c0: 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  tly undefined..*
39d0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
39e0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69  _syscall_ptr uni
39f0: 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  xGetSystemCall(.
3a00: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
3a10: 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74  NotUsed,.  const
3a20: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
3a30: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
3a40: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
3a50: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
3a60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
3a70: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
3a80: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
3a90: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
3aa0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
3ab0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
3ac0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  e)==0 ) return a
3ad0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
3ae0: 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
3af0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
3b00: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
3b10: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
3b20: 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61  m call after zNa
3b30: 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e  me.  If zName==N
3b40: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ULL.** then retu
3b50: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
3b60: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
3b70: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
3b80: 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69  LL if zName.** i
3b90: 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65  s the last syste
3ba0: 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61  m call or if zNa
3bb0: 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  me is not the na
3bc0: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a  me of a valid.**
3bd0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f   system call..*/
3be0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3bf0: 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74  ar *unixNextSyst
3c00: 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76  emCall(sqlite3_v
3c10: 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  fs *p, const cha
3c20: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
3c30: 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53   i = -1;..  UNUS
3c40: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
3c50: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
3c60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
3c70: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
3c80: 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l)-1; i++){.    
3c90: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
3ca0: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
3cb0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
3cc0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  k;.    }.  }.  f
3cd0: 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53  or(i++; i<ArrayS
3ce0: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69  ize(aSyscall); i
3cf0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79  ++){.    if( aSy
3d00: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
3d10: 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  t!=0 ) return aS
3d20: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b  yscall[i].zName;
3d30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3d40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20  .}../*.** Retry 
3d50: 6f 70 65 6e 28 29 20 63 61 6c 6c 73 20 74 68 61  open() calls tha
3d60: 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49  t fail due to EI
3d70: 4e 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NTR.*/.static in
3d80: 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f  t robust_open(co
3d90: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
3da0: 20 66 2c 20 69 6e 74 20 6d 29 7b 0a 20 20 69 6e   f, int m){.  in
3db0: 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d  t rc;.  do{ rc =
3dc0: 20 6f 73 4f 70 65 6e 28 7a 2c 66 2c 6d 29 3b 20   osOpen(z,f,m); 
3dd0: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
3de0: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
3df0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
3e00: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
3e10: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
3e20: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
3e30: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
3e40: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
3e50: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
3e60: 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69   protect the uni
3e70: 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a  xInodeInfo and.*
3e80: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
3e90: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
3ea0: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
3eb0: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
3ec0: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
3ed0: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
3ee0: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
3ef0: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
3f00: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
3f10: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
3f20: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
3f30: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
3f40: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
3f50: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
3f60: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
3f70: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
3f80: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
3f90: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
3fa0: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
3fb0: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
3fc0: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
3fd0: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
3fe0: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
3ff0: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
4000: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
4010: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
4020: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
4030: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
4040: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
4050: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
4060: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
4070: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
4080: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
4090: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
40a0: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
40b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
40c0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  UG.static int un
40d0: 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  ixMutexHeld(void
40e0: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
40f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
4100: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
4110: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
4120: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
4130: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65  }.#endif...#ifde
4140: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
4150: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
4160: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
4170: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
4180: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
4190: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
41a0: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
41b0: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
41c0: 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  esetation of the
41d0: 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74   supplied.** int
41e0: 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a  eger lock-type..
41f0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
4200: 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b  char *azFileLock
4210: 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b  (int eFileLock){
4220: 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65  .  switch( eFile
4230: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65  Lock ){.    case
4240: 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e   NO_LOCK: return
4250: 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73   "NONE";.    cas
4260: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
4270: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
4280: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
4290: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
42a0: 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63  RESERVED";.    c
42b0: 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ase PENDING_LOCK
42c0: 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e  : return "PENDIN
42d0: 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43  G";.    case EXC
42e0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74  LUSIVE_LOCK: ret
42f0: 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b  urn "EXCLUSIVE";
4300: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45  .  }.  return "E
4310: 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RROR";.}.#endif.
4320: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c  .#ifdef SQLITE_L
4330: 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  OCK_TRACE./*.** 
4340: 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d  Print out inform
4350: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20  ation about all 
4360: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
4370: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
4380: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
4390: 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69  or troubleshooti
43a0: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74  ng locks on mult
43b0: 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61  ithreaded.** pla
43c0: 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20  tforms.  Enable 
43d0: 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74  by compiling wit
43e0: 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c  h the -DSQLITE_L
43f0: 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d  OCK_TRACE.** com
4400: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
4410: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
4420: 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  .  This code is 
4430: 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e  normally.** turn
4440: 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  ed off..*/.stati
4450: 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28  c int lockTrace(
4460: 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20  int fd, int op, 
4470: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29  struct flock *p)
4480: 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  {.  char *zOpNam
4490: 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74  e, *zType;.  int
44a0: 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45   s;.  int savedE
44b0: 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  rrno;.  if( op==
44c0: 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_GETLK ){.    z
44d0: 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22  OpName = "GETLK"
44e0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
44f0: 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_SETLK ){.   
4500: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c   zOpName = "SETL
4510: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
4520: 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c   s = osFcntl(fd,
4530: 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c   op, p);.    sql
4540: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4550: 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25  "fcntl unknown %
4560: 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20  d %d %d\n", fd, 
4570: 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75  op, s);.    retu
4580: 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn s;.  }.  if( 
4590: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  p->l_type==F_RDL
45a0: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
45b0: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "RDLCK";.  }el
45c0: 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  se if( p->l_type
45d0: 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20  ==F_WRLCK ){.   
45e0: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
45f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
4600: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  >l_type==F_UNLCK
4610: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
4620: 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "UNLCK";.  }else
4630: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20  {.    assert( 0 
4640: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
4650: 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45   p->l_whence==SE
4660: 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20  EK_SET );.  s = 
4670: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  osFcntl(fd, op, 
4680: 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f  p);.  savedErrno
4690: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69   = errno;.  sqli
46a0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
46b0: 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25  fcntl %d %d %s %
46c0: 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22  s %d %d %d %d\n"
46d0: 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64 2c  ,.     threadid,
46e0: 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54   fd, zOpName, zT
46f0: 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73  ype, (int)p->l_s
4700: 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  tart, (int)p->l_
4710: 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70  len,.     (int)p
4720: 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69  ->l_pid, s);.  i
4730: 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70  f( s==(-1) && op
4740: 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d  ==F_SETLK && (p-
4750: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
4760: 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46   || p->l_type==F
4770: 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73  _WRLCK) ){.    s
4780: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a  truct flock l2;.
4790: 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20      l2 = *p;.   
47a0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
47b0: 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20  ETLK, &l2);.    
47c0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
47d0: 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
47e0: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
47f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
4800: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  2.l_type==F_WRLC
4810: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
4820: 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20   = "WRLCK";.    
4830: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
4840: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
4850: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55        zType = "U
4860: 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  NLCK";.    }else
4870: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
4880: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
4890: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
48a0: 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65  f("fcntl-failure
48b0: 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25  -reason: %s %d %
48c0: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %d\n",.       
48d0: 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c  zType, (int)l2.l
48e0: 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e  _start, (int)l2.
48f0: 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c  l_len, (int)l2.l
4900: 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72  _pid);.  }.  err
4910: 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b  no = savedErrno;
4920: 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23  .  return s;.}.#
4930: 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64  undef osFcntl.#d
4940: 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f  efine osFcntl lo
4950: 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f  ckTrace.#endif /
4960: 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  * SQLITE_LOCK_TR
4970: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ACE */../*.** Re
4980: 74 72 79 20 66 74 72 75 6e 63 61 74 65 28 29 20  try ftruncate() 
4990: 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20  calls that fail 
49a0: 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a  due to EINTR.*/.
49b0: 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
49c0: 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20  t_ftruncate(int 
49d0: 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  h, sqlite3_int64
49e0: 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   sz){.  int rc;.
49f0: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72    do{ rc = osFtr
4a00: 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77  uncate(h,sz); }w
4a10: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
4a20: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
4a30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4a40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4a50: 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74   translates a st
4a60: 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72  andard POSIX err
4a70: 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d  no code into som
4a80: 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c  ething.** useful
4a90: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20   to the clients 
4aa0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66  of the sqlite3 f
4ab0: 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69  unctions.  Speci
4ac0: 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a  fically, it is.*
4ad0: 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72  * intended to tr
4ae0: 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74  anslate a variet
4af0: 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22  y of "try again"
4b00: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c   errors into SQL
4b10: 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20  ITE_BUSY.** and 
4b20: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c  a variety of "pl
4b30: 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66  ease close the f
4b40: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e  ile descriptor N
4b50: 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20  OW" errors into 
4b60: 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
4b70: 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64  .** .** Errors d
4b80: 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61  uring initializa
4b90: 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f  tion of locks, o
4ba0: 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  r file system su
4bb0: 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c  pport for locks,
4bc0: 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c  .** should handl
4bd0: 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55  e ENOLCK, ENOTSU
4be0: 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65  P, EOPNOTSUPP se
4bf0: 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  parately..*/.sta
4c00: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72  tic int sqliteEr
4c10: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
4c20: 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72  r(int posixError
4c30: 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72  , int sqliteIOEr
4c40: 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70  r) {.  switch (p
4c50: 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69 66  osixError) {.#if
4c60: 20 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70   0.  /* At one p
4c70: 6f 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20 77  oint this code w
4c80: 61 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64  as not commented
4c90: 20 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c   out. In theory,
4ca0: 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a   this branch.  *
4cb0: 2a 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  * should never b
4cc0: 65 20 68 69 74 2c 20 61 73 20 74 68 69 73 20 66  e hit, as this f
4cd0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
4ce0: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
4cf0: 74 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69  ter.  ** a locki
4d00: 6e 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ng-related funct
4d10: 69 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28  ion (i.e. fcntl(
4d20: 29 29 20 68 61 73 20 72 65 74 75 72 6e 65 64 20  )) has returned 
4d30: 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20  non-zero with.  
4d40: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
4d50: 65 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69 72  errno as the fir
4d60: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e  st argument. Sin
4d70: 63 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c  ce a system call
4d80: 20 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a   has failed,.  *
4d90: 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62  * errno should b
4da0: 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a  e non-zero..  **
4db0: 0a 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74 68  .  ** Despite th
4dc0: 69 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65 61  is, if errno rea
4dd0: 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65 20  lly is zero, we 
4de0: 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74  still don't want
4df0: 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20   to return.  ** 
4e00: 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73  SQLITE_OK. The s
4e10: 79 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65  ystem call faile
4e20: 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51  d, and *some* SQ
4e30: 4c 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75 6c  Lite error shoul
4e40: 64 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67  d be.  ** propag
4e50: 61 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  ated back to the
4e60: 20 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74   caller. Comment
4e70: 69 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68 20  ing this branch 
4e80: 6f 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d  out means errno=
4e90: 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  =0.  ** will be 
4ea0: 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 22  handled by the "
4eb0: 64 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20 62  default:" case b
4ec0: 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  elow..  */.  cas
4ed0: 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  e 0: .    return
4ee0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
4ef0: 69 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41 49  if..  case EAGAI
4f00: 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44  N:.  case ETIMED
4f10: 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53  OUT:.  case EBUS
4f20: 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a  Y:.  case EINTR:
4f30: 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20  .  case ENOLCK: 
4f40: 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20   .    /* random 
4f50: 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c  NFS retry error,
4f60: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
4f70: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
4f80: 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f  rt .     * intro
4f90: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
4fa0: 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d  ch it actually m
4fb0: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
4fc0: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
4fd0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
4fe0: 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a   .  case EACCES:
4ff0: 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20   .    /* EACCES 
5000: 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64  is like EAGAIN d
5010: 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70  uring locking op
5020: 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f  erations, but no
5030: 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65  t any other time
5040: 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69  */.    if( (sqli
5050: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
5060: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c  E_IOERR_LOCK) ||
5070: 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20   ..(sqliteIOErr 
5080: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
5090: 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71  UNLOCK) || ..(sq
50a0: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
50b0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
50c0: 29 20 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f 45  ) ||..(sqliteIOE
50d0: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
50e0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
50f0: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72  LOCK) ){.      r
5100: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
5110: 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  Y;.    }.    /* 
5120: 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  else fall throug
5130: 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52  h */.  case EPER
5140: 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53  M: .    return S
5150: 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
5160: 0a 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20 69 73  .  /* EDEADLK is
5170: 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
5180: 66 20 61 20 63 61 6c 6c 20 74 6f 20 66 63 6e 74  f a call to fcnt
5190: 6c 28 46 5f 53 45 54 4c 4b 57 29 20 69 73 20 6d  l(F_SETLKW) is m
51a0: 61 64 65 2e 20 41 6e 64 0a 20 20 2a 2a 20 74 68  ade. And.  ** th
51b0: 69 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72 20  is module never 
51c0: 6d 61 6b 65 73 20 73 75 63 68 20 61 20 63 61 6c  makes such a cal
51d0: 6c 2e 20 41 6e 64 20 74 68 65 20 63 6f 64 65 20  l. And the code 
51e0: 69 6e 20 53 51 4c 69 74 65 20 69 74 73 65 6c 66  in SQLite itself
51f0: 20 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 20 74   .  ** asserts t
5200: 68 61 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  hat SQLITE_IOERR
5210: 5f 42 4c 4f 43 4b 45 44 20 69 73 20 6e 65 76 65  _BLOCKED is neve
5220: 72 20 72 65 74 75 72 6e 65 64 2e 20 46 6f 72 20  r returned. For 
5230: 74 68 65 73 65 20 72 65 61 73 6f 6e 73 0a 20 20  these reasons.  
5240: 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69 73 20  ** this case is 
5250: 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f  also commented o
5260: 75 74 2e 20 49 66 20 74 68 65 20 73 79 73 74 65  ut. If the syste
5270: 6d 20 64 6f 65 73 20 73 65 74 20 65 72 72 6e 6f  m does set errno
5280: 20 74 6f 20 45 44 45 41 44 4c 4b 2c 0a 20 20 2a   to EDEADLK,.  *
5290: 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 53 51  * the default SQ
52a0: 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 63  LITE_IOERR_XXX c
52b0: 6f 64 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ode will be retu
52c0: 72 6e 65 64 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  rned. */.#if 0. 
52d0: 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20   case EDEADLK:. 
52e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
52f0: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a  _IOERR_BLOCKED;.
5300: 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66 20  #endif.    .#if 
5310: 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54  EOPNOTSUPP!=ENOT
5320: 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f  SUP.  case EOPNO
5330: 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73  TSUPP: .    /* s
5340: 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65  omething went te
5350: 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c  rribly awry, unl
5360: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
5370: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
5380: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
5390: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
53a0: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
53b0: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
53c0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45  .#endif.#ifdef E
53d0: 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e  NOTSUP.  case EN
53e0: 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69  OTSUP: .    /* i
53f0: 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73  nvalid fd, unles
5400: 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79  s during file sy
5410: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74  stem support int
5420: 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77  rospection, in w
5430: 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20  hich .     * it 
5440: 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77  actually means w
5450: 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23  hat it says */.#
5460: 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f  endif.  case EIO
5470: 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a  :.  case EBADF:.
5480: 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20    case EINVAL:. 
5490: 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a   case ENOTCONN:.
54a0: 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20    case ENODEV:. 
54b0: 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63   case ENXIO:.  c
54c0: 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 20 20 63 61  ase ENOENT:.  ca
54d0: 73 65 20 45 53 54 41 4c 45 3a 0a 20 20 63 61 73  se ESTALE:.  cas
54e0: 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a  e ENOSYS:.    /*
54f0: 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f   these should fo
5500: 72 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74  rce the client t
5510: 6f 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  o close the file
5520: 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a   and reconnect *
5530: 2f 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74  /.    .  default
5540: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  : .    return sq
5550: 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d  liteIOErr;.  }.}
5560: 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..../***********
5570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55b0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
55c0: 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69  ****** Begin Uni
55d0: 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c  que File ID Util
55e0: 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f  ity Used By VxWo
55f0: 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rks ************
5600: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73  ***.**.** On mos
5610: 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e  t versions of un
5620: 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61  ix, we can get a
5630: 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61   unique ID for a
5640: 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65   file by concate
5650: 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65  nating.** the de
5660: 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  vice number and 
5670: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
5680: 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73  .  But this does
5690: 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57   not work on VxW
56a0: 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f  orks..** On VxWo
56b0: 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69  rks, a unique fi
56c0: 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61  le id must be ba
56d0: 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e  sed on the canon
56e0: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a  ical filename..*
56f0: 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74  *.** A pointer t
5700: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
5710: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
5720: 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20  tructure can be 
5730: 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69  used as a.** uni
5740: 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56  que file ID in V
5750: 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e  xWorks.  Each in
5760: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
5770: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
5780: 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74  s.** a copy of t
5790: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  he canonical fil
57a0: 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73  ename.  There is
57b0: 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63   also a referenc
57c0: 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68  e count.  .** Th
57d0: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72  e structure is r
57e0: 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68  eclaimed when th
57f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e  e number of poin
5800: 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73  ters to it drops
5810: 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a   to.** zero..**.
5820: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76  ** There are nev
5830: 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c  er very many fil
5840: 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74  es open at one t
5850: 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20  ime and lookups 
5860: 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72  are not.** a per
5870: 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61  formance-critica
5880: 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73  l path, so it is
5890: 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70   sufficient to p
58a0: 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75  ut these.** stru
58b0: 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b  ctures on a link
58c0: 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75  ed list..*/.stru
58d0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
58e0: 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f   {.  struct vxwo
58f0: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74  rksFileId *pNext
5900: 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20  ;  /* Next in a 
5910: 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c  list of them all
5920: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5950: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
5960: 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74  his one */.  int
5970: 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
5980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
5990: 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e  ngth of the zCan
59a0: 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72  onicalName[] str
59b0: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ing */.  char *z
59c0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20  CanonicalName;  
59d0: 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69         /* Canoni
59e0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a  cal filename */.
59f0: 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  };..#if OS_VXWOR
5a00: 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e  KS./* .** All un
5a10: 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61  ique filenames a
5a20: 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e  re held on a lin
5a30: 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20  ked list headed 
5a40: 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61  by this.** varia
5a50: 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ble:.*/.static s
5a60: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
5a70: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65  eId *vxworksFile
5a80: 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
5a90: 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65   Simplify a file
5aa0: 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61  name into its ca
5ab0: 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20  nonical form.** 
5ac0: 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f  by making the fo
5ad0: 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a  llowing changes:
5ae0: 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69  .**.**  * removi
5af0: 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20  ng any trailing 
5b00: 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a  and duplicate /.
5b10: 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e  **  * convert /.
5b20: 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a  / into just /.**
5b30: 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e    * convert /A/.
5b40: 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e  ./ where A is an
5b50: 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e  y simple name in
5b60: 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20  to just /.**.** 
5b70: 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  Changes are made
5b80: 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75   in-place.  Retu
5b90: 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20  rn the new name 
5ba0: 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68  length..**.** Th
5bb0: 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e  e original filen
5bc0: 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e  ame is in z[0..n
5bd0: 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  -1].  Return the
5be0: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68   number of.** ch
5bf0: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
5c00: 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e  simplified name.
5c10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
5c20: 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61  xworksSimplifyNa
5c30: 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  me(char *z, int 
5c40: 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  n){.  int i, j;.
5c50: 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20    while( n>1 && 
5c60: 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e  z[n-1]=='/' ){ n
5c70: 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d  --; }.  for(i=j=
5c80: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
5c90: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20    if( z[i]=='/' 
5ca0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  ){.      if( z[i
5cb0: 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69  +1]=='/' ) conti
5cc0: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  nue;.      if( z
5cd0: 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b  [i+1]=='.' && i+
5ce0: 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27  2<n && z[i+2]=='
5cf0: 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20  /' ){.        i 
5d00: 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f  += 1;.        co
5d10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
5d20: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
5d30: 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26  =='.' && i+3<n &
5d40: 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26  & z[i+2]=='.' &&
5d50: 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a   z[i+3]=='/' ){.
5d60: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a          while( j
5d70: 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f  >0 && z[j-1]!='/
5d80: 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20  ' ){ j--; }.    
5d90: 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a      if( j>0 ){ j
5da0: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20  --; }.        i 
5db0: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f  += 2;.        co
5dc0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
5dd0: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d      }.    z[j++]
5de0: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a   = z[i];.  }.  z
5df0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  [j] = 0;.  retur
5e00: 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  n j;.}../*.** Fi
5e10: 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65  nd a unique file
5e20: 20 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65   ID for the give
5e30: 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e  n absolute pathn
5e40: 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ame.  Return.** 
5e50: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
5e60: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
5e70: 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69  bject.  This poi
5e80: 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71  nter is the uniq
5e90: 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a  ue.** file ID..*
5ea0: 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69  *.** The nRef fi
5eb0: 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72  eld of the vxwor
5ec0: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20  ksFileId object 
5ed0: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62  is incremented b
5ee0: 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a  efore.** the obj
5ef0: 65 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ect is returned.
5f00: 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46    A new vxworksF
5f10: 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20  ileId object is 
5f20: 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61  created.** and a
5f30: 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62  dded to the glob
5f40: 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73  al list if neces
5f50: 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sary..**.** If a
5f60: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
5f70: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
5f80: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
5f90: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
5fa0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
5fb0: 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28  worksFindFileId(
5fc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73  const char *zAbs
5fd0: 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74  oluteName){.  st
5fe0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
5ff0: 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  Id *pNew;       
6000: 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20    /* search key 
6010: 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20  and new file ID 
6020: 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  */.  struct vxwo
6030: 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64  rksFileId *pCand
6040: 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20  idate;   /* For 
6050: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69  looping over exi
6060: 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a  sting file IDs *
6070: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6090: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
60a0: 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61  h of zAbsoluteNa
60b0: 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20  me string */..  
60c0: 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74  assert( zAbsolut
60d0: 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b  eName[0]=='/' );
60e0: 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  .  n = (int)strl
60f0: 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  en(zAbsoluteName
6100: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
6110: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
6120: 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31  of(*pNew) + (n+1
6130: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
6140: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
6150: 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61   pNew->zCanonica
6160: 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  lName = (char*)&
6170: 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70  pNew[1];.  memcp
6180: 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  y(pNew->zCanonic
6190: 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74  alName, zAbsolut
61a0: 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e  eName, n+1);.  n
61b0: 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69   = vxworksSimpli
61c0: 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61  fyName(pNew->zCa
61d0: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b  nonicalName, n);
61e0: 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f  ..  /* Search fo
61f0: 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  r an existing en
6200: 74 72 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e  try that matchin
6210: 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  g the canonical 
6220: 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f  name..  ** If fo
6230: 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74  und, increment t
6240: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
6250: 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  nt and return a 
6260: 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20  pointer to.  ** 
6270: 74 68 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c  the existing fil
6280: 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69  e ID..  */.  uni
6290: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
62a0: 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d   for(pCandidate=
62b0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
62c0: 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61   pCandidate; pCa
62d0: 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61  ndidate=pCandida
62e0: 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  te->pNext){.    
62f0: 69 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e  if( pCandidate->
6300: 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26  nName==n .     &
6310: 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64  & memcmp(pCandid
6320: 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  ate->zCanonicalN
6330: 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f  ame, pNew->zCano
6340: 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30  nicalName, n)==0
6350: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73  .    ){.       s
6360: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
6370: 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69  );.       pCandi
6380: 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  date->nRef++;.  
6390: 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75       unixLeaveMu
63a0: 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65  tex();.       re
63b0: 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b  turn pCandidate;
63c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
63d0: 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f   No match was fo
63e0: 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61  und.  We will ma
63f0: 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44  ke a new file ID
6400: 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66   */.  pNew->nRef
6410: 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e   = 1;.  pNew->nN
6420: 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d  ame = n;.  pNew-
6430: 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73  >pNext = vxworks
6440: 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f  FileList;.  vxwo
6450: 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e  rksFileList = pN
6460: 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ew;.  unixLeaveM
6470: 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
6480: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
6490: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Decrement the re
64a0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
64b0: 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64   a vxworksFileId
64c0: 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a   object.  Free.*
64d0: 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65  * the object whe
64e0: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  n the reference 
64f0: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
6500: 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ro..*/.static vo
6510: 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  id vxworksReleas
6520: 65 46 69 6c 65 49 64 28 73 74 72 75 63 74 20 76  eFileId(struct v
6530: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49  xworksFileId *pI
6540: 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  d){.  unixEnterM
6550: 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
6560: 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pId->nRef>0 );
6570: 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pId->nRef--;.
6580: 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d    if( pId->nRef=
6590: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
65a0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
65b0: 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d  *pp;.    for(pp=
65c0: 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  &vxworksFileList
65d0: 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49  ; *pp && *pp!=pI
65e0: 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d  d; pp = &((*pp)-
65f0: 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61  >pNext)){}.    a
6600: 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20  ssert( *pp==pId 
6610: 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64  );.    *pp = pId
6620: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
6630: 69 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a  ite3_free(pId);.
6640: 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
6650: 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66  utex();.}.#endif
6660: 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
6670: 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /./*************
6680: 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65  ** End of Unique
6690: 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79   File ID Utility
66a0: 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73   Used By VxWorks
66b0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
66c0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
66d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6710: 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /.../***********
6720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6760: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
6770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
6780: 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c  Posix Advisory L
6790: 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
67a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
67b0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20  ***.**.** POSIX 
67c0: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61  advisory locks a
67d0: 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73  re broken by des
67e0: 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31  ign.  ANSI STD 1
67f0: 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20  003.1 (1996).** 
6800: 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20  section 6.5.2.2 
6810: 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67  lines 483 throug
6820: 68 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68  h 490 specify th
6830: 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73  at when a proces
6840: 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65  s.** sets or cle
6850: 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74  ars a lock, that
6860: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72   operation overr
6870: 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c  ides any prior l
6880: 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74  ocks set.** by t
6890: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
68a0: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78    It does not ex
68b0: 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c  plicitly say so,
68c0: 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65   but this implie
68d0: 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65  s.** that it ove
68e0: 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74  rrides locks set
68f0: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f   by the same pro
6900: 63 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66  cess using a dif
6910: 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64  ferent.** file d
6920: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73  escriptor.  Cons
6930: 69 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63  ider this test c
6940: 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ase:.**.**      
6950: 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28   int fd1 = open(
6960: 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57  "./file1", O_RDW
6970: 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29  R|O_CREAT, 0644)
6980: 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66  ;.**       int f
6990: 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c  d2 = open("./fil
69a0: 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  e2", O_RDWR|O_CR
69b0: 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a  EAT, 0644);.**.*
69c0: 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65  * Suppose ./file
69d0: 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72  1 and ./file2 ar
69e0: 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d  e really the sam
69f0: 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a  e file (because.
6a00: 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64  ** one is a hard
6a10: 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e   or symbolic lin
6a20: 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20  k to the other) 
6a30: 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a  then if you set.
6a40: 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ** an exclusive 
6a50: 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65  lock on fd1, the
6a60: 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20  n try to get an 
6a70: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a  exclusive lock.*
6a80: 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72  * on fd2, it wor
6a90: 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76  ks.  I would hav
6aa0: 65 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73  e expected the s
6ab0: 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a  econd lock to.**
6ac0: 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72   fail since ther
6ad0: 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20  e was already a 
6ae0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
6af0: 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20   due to fd1..** 
6b00: 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e  But not so.  Sin
6b10: 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61  ce both locks ca
6b20: 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  me from the same
6b30: 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a   process, the.**
6b40: 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65   second override
6b50: 73 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65  s the first, eve
6b60: 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65  n though they we
6b70: 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a  re on different.
6b80: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
6b90: 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69  ors opened on di
6ba0: 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d  fferent file nam
6bb0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  es..**.** This m
6bc0: 65 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e  eans that we can
6bd0: 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f  not use POSIX lo
6be0: 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69  cks to synchroni
6bf0: 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a  ze file access.*
6c00: 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e  * among competin
6c10: 67 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 65  g threads of the
6c20: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20   same process.  
6c30: 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c  POSIX locks will
6c40: 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f   work fine.** to
6c50: 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63   synchronize acc
6c60: 65 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 20  ess for threads 
6c70: 69 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  in separate proc
6c80: 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a  esses, but not.*
6c90: 2a 20 74 68 72 65 61 64 73 20 77 69 74 68 69 6e  * threads within
6ca0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
6cb0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  s..**.** To work
6cc0: 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62   around the prob
6cd0: 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20  lem, SQLite has 
6ce0: 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c  to manage file l
6cf0: 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  ocks internally.
6d00: 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20  ** on its own.  
6d10: 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64  Whenever a new d
6d20: 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
6d30: 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 69  d, we have to fi
6d40: 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66  nd the.** specif
6d50: 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20  ic inode of the 
6d60: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74  database file (t
6d70: 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65  he inode is dete
6d80: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  rmined by the.**
6d90: 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69   st_dev and st_i
6da0: 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  no fields of the
6db0: 20 73 74 61 74 20 73 74 72 75 63 74 75 72 65 20   stat structure 
6dc0: 74 68 61 74 20 66 73 74 61 74 28 29 20 66 69 6c  that fstat() fil
6dd0: 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68  ls in).** and ch
6de0: 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c  eck for locks al
6df0: 72 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f  ready existing o
6e00: 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57  n that inode.  W
6e10: 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a  hen locks are.**
6e20: 20 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f   created or remo
6e30: 76 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ved, we have to 
6e40: 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20  look at our own 
6e50: 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20  internal record 
6e60: 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20  of the.** locks 
6e70: 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65  to see if anothe
6e80: 72 20 74 68 72 65 61 64 20 68 61 73 20 70 72 65  r thread has pre
6e90: 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f  viously set a lo
6ea0: 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a  ck on that same.
6eb0: 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ** inode..**.** 
6ec0: 28 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20  (Aside: The use 
6ed0: 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73  of inode numbers
6ee0: 20 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64   as unique IDs d
6ef0: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
6f00: 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20  VxWorks..** For 
6f10: 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65  VxWorks, we have
6f20: 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65   to use the alte
6f30: 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49  rnative unique I
6f40: 44 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f  D system based o
6f50: 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66  n.** canonical f
6f60: 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c  ilename and impl
6f70: 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70  emented in the p
6f80: 72 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e  revious division
6f90: 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  .).**.** The sql
6fa0: 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74  ite3_file struct
6fb0: 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73  ure for POSIX is
6fc0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20   no longer just 
6fd0: 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a  an integer file.
6fe0: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  ** descriptor.  
6ff0: 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75  It is now a stru
7000: 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73  cture that holds
7010: 20 74 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c   the integer fil
7020: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20  e.** descriptor 
7030: 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  and a pointer to
7040: 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61   a structure tha
7050: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
7060: 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b  internal.** lock
7070: 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70  s on the corresp
7080: 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54  onding inode.  T
7090: 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b  here is one lock
70a0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  ing structure.**
70b0: 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69   per inode, so i
70c0: 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65  f the same inode
70d0: 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65   is opened twice
70e0: 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20  , both unixFile 
70f0: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f  structures.** po
7100: 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20  int to the same 
7110: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
7120: 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  e.  The locking 
7130: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a  structure keeps.
7140: 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63  ** a reference c
7150: 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c  ount (so we will
7160: 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65   know when to de
7170: 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22  lete it) and a "
7180: 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68  cnt".** field th
7190: 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20  at tells us its 
71a0: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74  internal lock st
71b0: 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65  atus.  cnt==0 me
71c0: 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  ans the.** file 
71d0: 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e  is unlocked.  cn
71e0: 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20  t==-1 means the 
71f0: 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c  file has an excl
7200: 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63  usive lock..** c
7210: 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65  nt>0 means there
7220: 20 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20   are cnt shared 
7230: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c  locks on the fil
7240: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74  e..**.** Any att
7250: 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20  empt to lock or 
7260: 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69  unlock a file fi
7270: 72 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c  rst checks the l
7280: 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  ocking.** struct
7290: 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28  ure.  The fcntl(
72a0: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73  ) system call is
72b0: 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f   only invoked to
72c0: 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58   set a .** POSIX
72d0: 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74   lock if the int
72e0: 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63  ernal lock struc
72f0: 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73  ture transitions
7300: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f   between.** a lo
7310: 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f  cked and an unlo
7320: 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  cked state..**.*
7330: 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74 68 65  * But wait:  the
7340: 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20  re are yet more 
7350: 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f  problems with PO
7360: 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  SIX advisory loc
7370: 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75  ks..**.** If you
7380: 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65   close a file de
7390: 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f  scriptor that po
73a0: 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74  ints to a file t
73b0: 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a  hat has locks,.*
73c0: 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74  * all locks on t
73d0: 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72  hat file that ar
73e0: 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63  e owned by the c
73f0: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61  urrent process a
7400: 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20  re.** released. 
7410: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
7420: 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61  this problem, ea
7430: 63 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ch unixInodeInfo
7440: 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74   object.** maint
7450: 61 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20  ains a count of 
7460: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65  the number of pe
7470: 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74  nding locks on t
7480: 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65  ha inode..** Whe
7490: 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
74a0: 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e  made to close an
74b0: 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68   unixFile, if th
74c0: 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72  ere are.** other
74d0: 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f   unixFile open o
74e0: 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65  n the same inode
74f0: 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e   that are holdin
7500: 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c  g locks, the cal
7510: 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20  l.** to close() 
7520: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
7530: 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20  tor is deferred 
7540: 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65  until all of the
7550: 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a   locks clear..**
7560: 20 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   The unixInodeIn
7570: 66 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  fo structure kee
7580: 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c  ps a list of fil
7590: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68  e descriptors th
75a0: 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65  at need to.** be
75b0: 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74   closed and that
75c0: 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20   list is walked 
75d0: 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68  (and cleared) wh
75e0: 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  en the last lock
75f0: 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a  .** clears..**.*
7600: 2a 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72  * Yet another pr
7610: 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72  oblem:  LinuxThr
7620: 65 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79  eads do not play
7630: 20 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78   well with posix
7640: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61   locks..**.** Ma
7650: 6e 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  ny older version
7660: 73 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74  s of linux use t
7670: 68 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  he LinuxThreads 
7680: 6c 69 62 72 61 72 79 20 77 68 69 63 68 20 69 73  library which is
7690: 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f  .** not posix co
76a0: 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20  mpliant.  Under 
76b0: 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20  LinuxThreads, a 
76c0: 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20  lock created by 
76d0: 74 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e  thread.** A cann
76e0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f  ot be modified o
76f0: 72 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  r overridden by 
7700: 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65  a different thre
7710: 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68  ad B..** Only th
7720: 72 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66  read A can modif
7730: 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63  y the lock.  Loc
7740: 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73  king behavior is
7750: 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74   correct.** if t
7760: 68 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73  he appliation us
7770: 65 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74  es the newer Nat
7780: 69 76 65 20 50 6f 73 69 78 20 54 68 72 65 61 64  ive Posix Thread
7790: 20 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a   Library (NPTL).
77a0: 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69  ** on linux - wi
77b0: 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63  th NPTL a lock c
77c0: 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64  reated by thread
77d0: 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20   A can override 
77e0: 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65  locks.** in thre
77f0: 61 64 20 42 2e 20 20 42 75 74 20 74 68 65 72 65  ad B.  But there
7800: 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e   is no way to kn
7810: 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ow at compile-ti
7820: 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65  me which.** thre
7830: 61 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73  ading library is
7840: 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f   being used.  So
7850: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
7860: 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63   to know at.** c
7870: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74  ompile-time whet
7880: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61  her or not threa
7890: 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65  d A can override
78a0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64   locks on thread
78b0: 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74   B..** One has t
78c0: 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20  o do a run-time 
78d0: 63 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65  check to discove
78e0: 72 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  r the behavior o
78f0: 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  f the.** current
7900: 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
7910: 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73  SQLite used to s
7920: 75 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65  upport LinuxThre
7930: 61 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72  ads.  But suppor
7940: 74 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61  t for LinuxThrea
7950: 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65  ds.** was droppe
7960: 64 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  d beginning with
7970: 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20   version 3.7.0. 
7980: 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69   SQLite will sti
7990: 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20  ll work with.** 
79a0: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f  LinuxThreads pro
79b0: 76 69 64 65 64 20 74 68 61 74 20 28 31 29 20 74  vided that (1) t
79c0: 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20  here is no more 
79d0: 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74  than one connect
79e0: 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61  ion .** per data
79f0: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
7a00: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e   same process an
7a10: 64 20 28 32 29 20 64 61 74 61 62 61 73 65 20 63  d (2) database c
7a20: 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f  onnections.** do
7a30: 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73   not move across
7a40: 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a   threads..*/../*
7a50: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
7a60: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
7a70: 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65   structure serve
7a80: 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65  s as the key use
7a90: 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61  d.** to locate a
7aa0: 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78   particular unix
7ab0: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
7ac0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
7ad0: 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74  FileId {.  dev_t
7ae0: 20 64 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   dev;           
7af0: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
7b00: 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f   number */.#if O
7b10: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
7b20: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7b30: 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75   *pId;  /* Uniqu
7b40: 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78  e file ID for vx
7b50: 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a  works. */.#else.
7b60: 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20    ino_t ino;    
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7b80: 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f   Inode number */
7b90: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
7ba0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
7bb0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
7bc0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
7bd0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f  cated for each o
7be0: 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f  pen.** inode.  O
7bf0: 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61  r, on LinuxThrea
7c00: 64 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65  ds, there is one
7c10: 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74   of these struct
7c20: 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68  ures for.** each
7c30: 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79   inode opened by
7c40: 20 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a   each thread..**
7c50: 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f  .** A single ino
7c60: 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74  de can have mult
7c70: 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  iple file descri
7c80: 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75  ptors, so each u
7c90: 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
7ca0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ture contains a 
7cb0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
7cc0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
7cd0: 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a  bject and this.*
7ce0: 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61  * object keeps a
7cf0: 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   count of the nu
7d00: 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65  mber of unixFile
7d10: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e   pointing to it.
7d20: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49  .*/.struct unixI
7d30: 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72  nodeInfo {.  str
7d40: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66  uct unixFileId f
7d50: 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20  ileId;       /* 
7d60: 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a  The lookup key *
7d70: 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b  /.  int nShared;
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7da0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65   SHARED locks he
7db0: 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ld */.  unsigned
7dc0: 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b   char eFileLock;
7dd0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
7de0: 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  f SHARED_LOCK, R
7df0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63  ESERVED_LOCK etc
7e00: 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  . */.  unsigned 
7e10: 63 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63  char bProcessLoc
7e20: 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63  k;     /* An exc
7e30: 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c  lusive process l
7e40: 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20  ock is held */. 
7e50: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f   /* Number of po
7e80: 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73  inters to this s
7e90: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e  tructure */.  un
7ea0: 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
7eb0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
7ec0: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   Shared memory a
7ed0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
7ee0: 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69  his inode */.  i
7ef0: 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20  nt nLock;       
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7f10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  * Number of outs
7f20: 74 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63  tanding file loc
7f30: 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  ks */.  UnixUnus
7f40: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
7f50: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
7f60: 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
7f70: 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  rs to close */. 
7f80: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
7f90: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
7fa0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
7fb0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
7fc0: 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49  jects */.  unixI
7fd0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b  nodeInfo *pPrev;
7fe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
7ff0: 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e   .... doubly lin
8000: 6b 65 64 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ked */.#if defin
8010: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
8020: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a  _LOCKING_STYLE).
8030: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
8040: 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b  long sharedByte;
8050: 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d    /* for AFP sim
8060: 75 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f  ulated shared lo
8070: 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ck */.#endif.#if
8080: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65   OS_VXWORKS.  se
8090: 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20  m_t *pSem;      
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
80b0: 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d   Named POSIX sem
80c0: 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72  aphore */.  char
80d0: 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41   aSemName[MAX_PA
80e0: 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e  THNAME+2];  /* N
80f0: 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61  ame of that sema
8100: 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  phore */.#endif.
8110: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  };../*.** A list
8120: 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f  s of all unixIno
8130: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a  deInfo objects..
8140: 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e  */.static unixIn
8150: 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69  odeInfo *inodeLi
8160: 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a  st = 0;../*.**.*
8170: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8180: 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78  - unixLogError_x
8190: 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  (), is only ever
81a0: 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20   called via the 
81b0: 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67  macro.** unixLog
81c0: 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Error()..**.** I
81d0: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74  t is invoked aft
81e0: 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  er an error occu
81f0: 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63  rs in an OS func
8200: 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68  tion and errno h
8210: 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20  as been.** set. 
8220: 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67  It logs a messag
8230: 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  e using sqlite3_
8240: 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67  log() containing
8250: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
8260: 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61  ue of.** errno a
8270: 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c  nd, if possible,
8280: 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61   the human-reada
8290: 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  ble equivalent f
82a0: 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f  rom strerror() o
82b0: 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28  r.** strerror_r(
82c0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  )..**.** The fir
82d0: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
82e0: 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  ed to the macro 
82f0: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72  should be the er
8300: 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  ror code that.**
8310: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
8320: 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67  d to SQLite (e.g
8330: 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  . SQLITE_IOERR_D
8340: 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41  ELETE, SQLITE_CA
8350: 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65  NTOPEN). .** The
8360: 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20   two subsequent 
8370: 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64  arguments should
8380: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
8390: 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20  the OS function 
83a0: 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28  that.** failed (
83b0: 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22  e.g. "unlink", "
83c0: 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20 74  open") and the t
83d0: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  he associated fi
83e0: 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a  le-system path,.
83f0: 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64  ** if any..*/.#d
8400: 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72  efine unixLogErr
8410: 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e  or(a,b,c)     un
8420: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
8430: 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29  (a,b,c,__LINE__)
8440: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
8450: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a  LogErrorAtLine(.
8460: 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20    int errcode,  
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8480: 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f    /* SQLite erro
8490: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  r code */.  cons
84a0: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20  t char *zFunc,  
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
84c0: 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69  ame of OS functi
84d0: 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a  on that failed *
84e0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
84f0: 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
8500: 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68      /* File path
8510: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
8520: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20   error */.  int 
8530: 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20  iLine           
8540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8550: 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65  ource line numbe
8560: 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63  r where error oc
8570: 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  curred */.){.  c
8580: 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20  har *zErr;      
8590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
85a0: 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73  * Message from s
85b0: 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75  trerror() or equ
85c0: 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  ivalent */.  int
85d0: 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   iErrno = errno;
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
85f0: 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72  Saved syscall er
8600: 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20  ror number */.. 
8610: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   /* If this is n
8620: 6f 74 20 61 20 74 68 72 65 61 64 73 61 66 65 20  ot a threadsafe 
8630: 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48  build (SQLITE_TH
8640: 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68  READSAFE==0), th
8650: 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20  en use.  ** the 
8660: 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74  strerror() funct
8670: 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  ion to obtain th
8680: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
8690: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
86a0: 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74   ** equivalent t
86b0: 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69  o errno. Otherwi
86c0: 73 65 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72  se, use strerror
86d0: 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20  _r()..  */ .#if 
86e0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
86f0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 48 41 56  E && defined(HAV
8700: 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20  E_STRERROR_R).  
8710: 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20  char aErr[80];. 
8720: 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c   memset(aErr, 0,
8730: 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a   sizeof(aErr));.
8740: 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a    zErr = aErr;..
8750: 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52    /* If STRERROR
8760: 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62  _R_CHAR_P (set b
8770: 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70  y autoconf scrip
8780: 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55  ts) or __USE_GNU
8790: 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a   is defined,.  *
87a0: 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
87b0: 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65  e system provide
87c0: 73 20 74 68 65 20 74 68 65 20 47 4e 55 20 76 65  s the the GNU ve
87d0: 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f  rsion of strerro
87e0: 72 5f 72 28 29 20 74 68 61 74 20 0a 20 20 2a 2a  r_r() that .  **
87f0: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
8800: 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  er to a buffer c
8810: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72  ontaining the er
8820: 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61  ror message. Tha
8830: 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20  t pointer .  ** 
8840: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72  may point to aEr
8850: 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70  r[], or it may p
8860: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61  oint to some sta
8870: 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65  tic storage some
8880: 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68  where. .  ** Oth
8890: 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74  erwise, assume t
88a0: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
88b0: 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53 49  rovides the POSI
88c0: 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20  X version of .  
88d0: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c  ** strerror_r(),
88e0: 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77 72   which always wr
88f0: 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ites an error me
8900: 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b  ssage into aErr[
8910: 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  ]..  **.  ** If 
8920: 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65  the code incorre
8930: 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61  ctly assumes tha
8940: 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53 49  t it is the POSI
8950: 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69  X version that i
8960: 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  s.  ** available
8970: 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  , the error mess
8980: 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62  age will often b
8990: 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  e an empty strin
89a0: 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75  g. Not a.  ** hu
89b0: 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f  ge problem. Inco
89c0: 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69  rrectly concludi
89d0: 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55 20  ng that the GNU 
89e0: 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
89f0: 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64  able .  ** could
8a00: 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66 61   lead to a segfa
8a10: 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f  ult though..  */
8a20: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54 52  .#if defined(STR
8a30: 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20  ERROR_R_CHAR_P) 
8a40: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45  || defined(__USE
8a50: 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a  _GNU).  zErr = .
8a60: 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72  # endif.  strerr
8a70: 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72  or_r(iErrno, aEr
8a80: 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d  r, sizeof(aErr)-
8a90: 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54  1);..#elif SQLIT
8aa0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f  E_THREADSAFE.  /
8ab0: 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72 65  * This is a thre
8ac0: 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75  adsafe build, bu
8ad0: 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69  t strerror_r() i
8ae0: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
8af0: 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b   */.  zErr = "";
8b00: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d  .#else.  /* Non-
8b10: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
8b20: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28 29  , use strerror()
8b30: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74  . */.  zErr = st
8b40: 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a  rerror(iErrno);.
8b50: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
8b60: 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54  ( errcode!=SQLIT
8b70: 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50  E_OK );.  if( zP
8b80: 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d  ath==0 ) zPath =
8b90: 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c   "";.  sqlite3_l
8ba0: 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20  og(errcode,.    
8bb0: 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a    "os_unix.c:%d:
8bc0: 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20 25   (%d) %s(%s) - %
8bd0: 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c  s",.      iLine,
8be0: 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20   iErrno, zFunc, 
8bf0: 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b  zPath, zErr.  );
8c00: 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f  ..  return errco
8c10: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  de;.}../*.** Clo
8c20: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
8c30: 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ptor..**.** We a
8c40: 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65  ssume that close
8c50: 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  () almost always
8c60: 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74   works, since it
8c70: 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a   is only in a.**
8c80: 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69   very sick appli
8c90: 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76  cation or on a v
8ca0: 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72  ery sick platfor
8cb0: 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  m that it might 
8cc0: 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64  fail..** If it d
8cd0: 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79  oes fail, simply
8ce0: 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64   leak the file d
8cf0: 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64  escriptor, but d
8d00: 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72  o log the.** err
8d10: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  or..**.** Note t
8d20: 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61  hat it is not sa
8d30: 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73  fe to retry clos
8d40: 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52 20  e() after EINTR 
8d50: 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c  since the.** fil
8d60: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67  e descriptor mig
8d70: 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ht have already 
8d80: 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20 61  been reused by a
8d90: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a  nother thread..*
8da0: 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76  * So we don't ev
8db0: 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65  en try to recove
8dc0: 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e  r from an EINTR.
8dd0: 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65    Just log the e
8de0: 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65  rror.** and move
8df0: 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   on..*/.static v
8e00: 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  oid robust_close
8e10: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
8e20: 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e  , int h, int lin
8e30: 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c  eno){.  if( osCl
8e40: 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e  ose(h) ){.    un
8e50: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
8e60: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
8e70: 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20  OSE, "close",.  
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69       pFile ? pFi
8ea0: 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c  le->zPath : 0, l
8eb0: 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ineno);.  }.}../
8ec0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66  *.** Close all f
8ed0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
8ee0: 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68  accumuated in th
8ef0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d  e unixInodeInfo-
8f00: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a  >pUnused list..*
8f10: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  / .static void c
8f20: 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75  losePendingFds(u
8f30: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
8f40: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
8f50: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
8f60: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
8f70: 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55  UnusedFd *p;.  U
8f80: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
8f90: 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f  xt;.  for(p=pIno
8fa0: 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20  de->pUnused; p; 
8fb0: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
8fc0: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
8fd0: 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
8fe0: 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f  (pFile, p->fd, _
8ff0: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71  _LINE__);.    sq
9000: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
9010: 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e   }.  pInode->pUn
9020: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
9030: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69  ** Release a uni
9040: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
9050: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
9060: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
9070: 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a  dInodeInfo()..**
9080: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e  .** The mutex en
9090: 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20  tered using the 
90a0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
90b0: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
90c0: 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74  e held.** when t
90d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
90e0: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
90f0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e  c void releaseIn
9100: 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65  odeInfo(unixFile
9110: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
9120: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
9130: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
9140: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
9150: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
9160: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
9170: 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f  ode) ){.    pIno
9180: 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  de->nRef--;.    
9190: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66  if( pInode->nRef
91a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
91b0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68  ert( pInode->pSh
91c0: 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20  mNode==0 );.    
91d0: 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
91e0: 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
91f0: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  if( pInode->pPre
9200: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  v ){.        ass
9210: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ert( pInode->pPr
9220: 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64  ev->pNext==pInod
9230: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  e );.        pIn
9240: 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ode->pPrev->pNex
9250: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
9260: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
9270: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9280: 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64  inodeList==pInod
9290: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f  e );.        ino
92a0: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d  deList = pInode-
92b0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
92c0: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
92d0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
92e0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
92f0: 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d  e->pNext->pPrev=
9300: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
9310: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
9320: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
9330: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  ->pPrev;.      }
9340: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
9350: 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ree(pInode);.   
9360: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9370: 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73  Given a file des
9380: 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20  criptor, locate 
9390: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
93a0: 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  o object that.**
93b0: 20 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20   describes that 
93c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
93d0: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
93e0: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
93f0: 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20    The.** return 
9400: 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75  value might be u
9410: 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20  ninitialized if 
9420: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
9430: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
9440: 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74   entered using t
9450: 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
9460: 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
9470: 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65  t be held.** whe
9480: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
9490: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
94a0: 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f   Return an appro
94b0: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
94c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
94d0: 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a   findInodeInfo(.
94e0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
94f0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
9500: 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69   /* Unix file wi
9510: 74 68 20 66 69 6c 65 20 64 65 73 63 20 75 73 65  th file desc use
9520: 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a  d in the key */.
9530: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
9540: 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20  **ppInode       
9550: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75   /* Return the u
9560: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
9570: 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ect here */.){. 
9580: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95a0: 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72  /* System call r
95b0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
95c0: 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
95e0: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
95f0: 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20  iptor for pFile 
9600: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
9610: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
9620: 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65      /* Lookup ke
9630: 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e  y for the unixIn
9640: 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72  odeInfo */.  str
9650: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
9660: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
9670: 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e  ow-level file in
9680: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  formation */.  u
9690: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
96a0: 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  node = 0;     /*
96b0: 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49   Candidate unixI
96c0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
96d0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e  */..  assert( un
96e0: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
96f0: 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c  ..  /* Get low-l
9700: 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  evel information
9710: 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20   about the file 
9720: 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65 64  that we can used
9730: 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20   to.  ** create 
9740: 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f  a unique name fo
9750: 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  r the file..  */
9760: 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68  .  fd = pFile->h
9770: 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  ;.  rc = osFstat
9780: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
9790: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
97a0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
97b0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66  rno = errno;.#if
97c0: 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20  def EOVERFLOW.  
97d0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73    if( pFile->las
97e0: 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f  tErrno==EOVERFLO
97f0: 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  W ) return SQLIT
9800: 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a  E_NOLFS;.#endif.
9810: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9820: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69  E_IOERR;.  }..#i
9830: 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20  fdef __APPLE__. 
9840: 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61   /* On OS X on a
9850: 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  n msdos filesyst
9860: 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  em, the inode nu
9870: 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64  mber is reported
9880: 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  .  ** incorrectl
9890: 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20  y for zero-size 
98a0: 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b  files.  See tick
98b0: 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f  et #3260.  To wo
98c0: 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74  rk.  ** around t
98d0: 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20  his problem (we 
98e0: 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75  consider it a bu
98f0: 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53  g in OS X, not S
9900: 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61  QLite).  ** we a
9910: 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74  lways increase t
9920: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20  he file size to 
9930: 31 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73  1 by writing a s
9940: 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20  ingle byte.  ** 
9950: 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69  prior to accessi
9960: 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  ng the inode num
9970: 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79  ber.  The one by
9980: 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20  te written is.  
9990: 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20  ** an ASCII 'S' 
99a0: 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20  character which 
99b0: 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20  also happens to 
99c0: 62 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74  be the first byt
99d0: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65  e.  ** in the he
99e0: 61 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51  ader of every SQ
99f0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
9a00: 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20  In this way, if 
9a10: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20  there.  ** is a 
9a20: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73  race condition s
9a30: 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72  uch that another
9a40: 20 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65   thread has alre
9a50: 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20  ady populated.  
9a60: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ** the first pag
9a70: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
9a80: 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20  e, no damage is 
9a90: 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  done..  */.  if(
9aa0: 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
9ab0: 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66  ==0 && (pFile->f
9ac0: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
9ad0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
9ae0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20  )!=0 ){.    do{ 
9af0: 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c  rc = osWrite(fd,
9b00: 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65   "S", 1); }while
9b10: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
9b20: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66  =EINTR );.    if
9b30: 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  ( rc!=1 ){.     
9b40: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
9b50: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
9b60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
9b70: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OERR;.    }.    
9b80: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
9b90: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20   &statbuf);.    
9ba0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
9bb0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
9bc0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
9bd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9be0: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
9bf0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73  }.#endif..  mems
9c00: 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73  et(&fileId, 0, s
9c10: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a  izeof(fileId));.
9c20: 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73    fileId.dev = s
9c30: 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23  tatbuf.st_dev;.#
9c40: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
9c50: 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69  fileId.pId = pFi
9c60: 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20  le->pId;.#else. 
9c70: 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74   fileId.ino = st
9c80: 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65  atbuf.st_ino;.#e
9c90: 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20  ndif.  pInode = 
9ca0: 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69  inodeList;.  whi
9cb0: 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65  le( pInode && me
9cc0: 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70  mcmp(&fileId, &p
9cd0: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73  Inode->fileId, s
9ce0: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29  izeof(fileId)) )
9cf0: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70  {.    pInode = p
9d00: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
9d10: 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d  }.  if( pInode==
9d20: 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20  0 ){.    pInode 
9d30: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
9d40: 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  ( sizeof(*pInode
9d50: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ) );.    if( pIn
9d60: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
9d70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
9d80: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  MEM;.    }.    m
9d90: 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c  emset(pInode, 0,
9da0: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
9db0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
9dc0: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26  Inode->fileId, &
9dd0: 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66  fileId, sizeof(f
9de0: 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e  ileId));.    pIn
9df0: 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ode->nRef = 1;. 
9e00: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
9e10: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
9e20: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20    pInode->pPrev 
9e30: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f  = 0;.    if( ino
9e40: 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69  deList ) inodeLi
9e50: 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  st->pPrev = pIno
9e60: 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73  de;.    inodeLis
9e70: 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65  t = pInode;.  }e
9e80: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  lse{.    pInode-
9e90: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a  >nRef++;.  }.  *
9ea0: 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65  ppInode = pInode
9eb0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
9ec0: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
9ed0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
9ee0: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
9ef0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
9f00: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
9f10: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
9f20: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
9f30: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
9f40: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
9f50: 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
9f60: 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
9f70: 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
9f80: 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
9f90: 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
9fa0: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
9fb0: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
9fc0: 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
9fd0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
9fe0: 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
9ff0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
a000: 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  nt unixCheckRese
a010: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
a020: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
a030: 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
a040: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a050: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
a060: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
a070: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
a080: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
a090: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
a0a0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
a0b0: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
a0c0: 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ; );..  assert( 
a0d0: 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45  pFile );.  unixE
a0e0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20  nterMutex(); /* 
a0f0: 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  Because pFile->p
a100: 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
a110: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a  across threads *
a120: 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  /..  /* Check if
a130: 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
a140: 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
a150: 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
a160: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
a170: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  de->eFileLock>SH
a180: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
a190: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
a1a0: 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69   }..  /* Otherwi
a1b0: 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
a1c0: 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
a1d0: 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ds it..  */.#ifn
a1e0: 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20  def __DJGPP__.  
a1f0: 69 66 28 20 21 72 65 73 65 72 76 65 64 20 26 26  if( !reserved &&
a200: 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d   !pFile->pInode-
a210: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b  >bProcessLock ){
a220: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
a230: 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b  k lock;.    lock
a240: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
a250: 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  _SET;.    lock.l
a260: 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45  _start = RESERVE
a270: 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  D_BYTE;.    lock
a280: 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20  .l_len = 1;.    
a290: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
a2a0: 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f  WRLCK;.    if( o
a2b0: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
a2c0: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_GETLK, &lock)
a2d0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
a2e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
a2f0: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20  KRESERVEDLOCK;. 
a300: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
a310: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
a320: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f     } else if( lo
a330: 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c  ck.l_type!=F_UNL
a340: 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65  CK ){.      rese
a350: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
a360: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
a370: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
a380: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
a390: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
a3a0: 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %d (unix)\n", p
a3b0: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
a3c0: 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
a3d0: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
a3e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a3f0: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
a400: 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c  o set a system-l
a410: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
a420: 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b  pFile.  The lock
a430: 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65   is .** describe
a440: 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a  d by pLock..**.*
a450: 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77  * If the pFile w
a460: 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77  as opened read/w
a470: 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65  rite from unix-e
a480: 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e  xcl, then the on
a490: 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20  ly lock.** ever 
a4a0: 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65  obtained is an e
a4b0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61  xclusive lock, a
a4c0: 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65  nd it is obtaine
a4d0: 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a  d exactly once.*
a4e0: 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  * the first time
a4f0: 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74   any lock is att
a500: 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62  empted.  All sub
a510: 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c  sequent system l
a520: 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  ocking.** operat
a530: 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f  ions become no-o
a540: 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65  ps.  Locking ope
a550: 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61  rations still ha
a560: 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c  ppen internally,
a570: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
a580: 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73  coordinate acces
a590: 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61  s between separa
a5a0: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
a5b0: 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69  ections.** withi
a5c0: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20  n this process, 
a5d0: 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20  but all of that 
a5e0: 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65  is handled in me
a5f0: 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mory and the.** 
a600: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
a610: 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63   does not partic
a620: 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ipate..**.** Thi
a630: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
a640: 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20  pass-through to 
a650: 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69  fcntl(F_SETLK) i
a660: 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67  f pFile is using
a670: 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65  .** any VFS othe
a680: 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63  r than "unix-exc
a690: 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69  l" or if pFile i
a6a0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69  s opened on "uni
a6b0: 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69  x-excl".** and i
a6c0: 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a  s read-only..**.
a6d0: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
a6e0: 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20  ned if the call 
a6f0: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
a700: 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66  sfully, or -1 if
a710: 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63   a call.** to fc
a720: 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20  ntl() fails. In 
a730: 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f  this case, errno
a740: 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72 69   is set appropri
a750: 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28  ately (by fcntl(
a760: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
a770: 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75  t unixFileLock(u
a780: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
a790: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c  struct flock *pL
a7a0: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ock){.  int rc;.
a7b0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
a7c0: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
a7d0: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
a7e0: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
a7f0: 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  () );.  assert( 
a800: 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69  pInode!=0 );.  i
a810: 66 28 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c  f( ((pFile->ctrl
a820: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
a830: 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e  _EXCL)!=0 || pIn
a840: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
a850: 6b 29 0a 20 20 20 26 26 20 28 28 70 46 69 6c 65  k).   && ((pFile
a860: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
a870: 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  IXFILE_RDONLY)==
a880: 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  0).  ){.    if( 
a890: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
a8a0: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
a8b0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
a8c0: 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
a8d0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
a8e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 );.      lock
a8f0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
a900: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
a910: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
a920: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
a930: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
a940: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c  ED_SIZE;.      l
a950: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
a960: 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  RLCK;.      rc =
a970: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
a980: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
a990: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
a9a0: 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  <0 ) return rc;.
a9b0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50        pInode->bP
a9c0: 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a  rocessLock = 1;.
a9d0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
a9e0: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ock++;.    }else
a9f0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
aa00: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
aa10: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
aa20: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
aa30: 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20  K, pLock);.  }. 
aa40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
aa50: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
aa60: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
aa70: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
aa80: 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
aa90: 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
aaa0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
aab0: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
aac0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
aad0: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
aae0: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
aaf0: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
ab00: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
ab10: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
ab20: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
ab30: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
ab40: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
ab50: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
ab60: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
ab70: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
ab80: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
ab90: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
aba0: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
abb0: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
abc0: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
abd0: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
abe0: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
abf0: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
ac00: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
ac10: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
ac20: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
ac30: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
ac40: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
ac50: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
ac60: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
ac70: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
ac80: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
ac90: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
aca0: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
acb0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
acc0: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
acd0: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
ace0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
acf0: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
ad00: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
ad10: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
ad20: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
ad30: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
ad40: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
ad50: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
ad60: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
ad70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
ad80: 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ixLock(sqlite3_f
ad90: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
ada0: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68  leLock){.  /* Th
adb0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63  e following desc
adc0: 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d  ribes the implem
add0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
ade0: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e  various locks an
adf0: 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e  d.  ** lock tran
ae00: 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73  sitions in terms
ae10: 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64   of the POSIX ad
ae20: 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e  visory shared an
ae30: 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a  d exclusive.  **
ae40: 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73   lock primitives
ae50: 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f   (called read-lo
ae60: 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f  cks and write-lo
ae70: 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76  cks below, to av
ae80: 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69  oid.  ** confusi
ae90: 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  on with SQLite l
aea0: 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20  ock names). The 
aeb0: 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63  algorithms are c
aec0: 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20  omplicated.  ** 
aed0: 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65  slightly in orde
aee0: 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62  r to be compatib
aef0: 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20  le with windows 
af00: 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e  systems simultan
af10: 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65  eously.  ** acce
af20: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
af30: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e  atabase file, in
af40: 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76   case that is ev
af50: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  er required..  *
af60: 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64  *.  ** Symbols d
af70: 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69  efined in os.h i
af80: 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65  ndentify the 'pe
af90: 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20  nding byte' and 
afa0: 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20  the 'reserved.  
afb0: 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73  ** byte', each s
afc0: 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77  ingle bytes at w
afd0: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
afe0: 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72  s, and the 'shar
aff0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
b000: 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20  ge', a range of 
b010: 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77  510 bytes at a w
b020: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
b030: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f  ..  **.  ** To o
b040: 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c  btain a SHARED l
b050: 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ock, a read-lock
b060: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
b070: 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a  the 'pending.  *
b080: 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69  * byte'.  If thi
b090: 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
b0a0: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
b0b0: 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20  rom the 'shared 
b0c0: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
b0d0: 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20   is read-locked 
b0e0: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
b0f0: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
b100: 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  e' released..  *
b110: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
b120: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
b130: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
b140: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20   after it has a 
b150: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a  SHARED lock..  *
b160: 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * A RESERVED loc
b170: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
b180: 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77   by grabbing a w
b190: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
b1a0: 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20  .  ** 'reserved 
b1b0: 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a  byte'. .  **.  *
b1c0: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
b1d0: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45  only obtain a PE
b1e0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72  NDING lock after
b1f0: 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64   it has obtained
b200: 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c   a.  ** SHARED l
b210: 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c  ock. A PENDING l
b220: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
b230: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
b240: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a  a write-lock.  *
b250: 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  * on the 'pendin
b260: 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e  g byte'. This en
b270: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65  sures that no ne
b280: 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63  w SHARED locks c
b290: 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69  an be.  ** obtai
b2a0: 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e  ned, but existin
b2b0: 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61  g SHARED locks a
b2c0: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65  re allowed to pe
b2d0: 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73  rsist. A process
b2e0: 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68  .  ** does not h
b2f0: 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ave to obtain a 
b300: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
b310: 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45   the way to a PE
b320: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  NDING lock..  **
b330: 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69   This property i
b340: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c  s used by the al
b350: 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c  gorithm for roll
b360: 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
b370: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74  al file.  ** aft
b380: 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a  er a crash..  **
b390: 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49  .  ** An EXCLUSI
b3a0: 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65  VE lock, obtaine
b3b0: 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e  d after a PENDIN
b3c0: 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  G lock is held, 
b3d0: 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  is.  ** implemen
b3e0: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
b3f0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
b400: 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61   the entire 'sha
b410: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
b420: 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20  nge'. Since all 
b430: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75  other locks requ
b440: 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ire a read-lock 
b450: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79  on one of the by
b460: 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20  tes.  ** within 
b470: 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73  this range, this
b480: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
b490: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65   other locks are
b4a0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a   held on the.  *
b4b0: 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a  * database. .  *
b4c0: 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f  *.  ** The reaso
b4d0: 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
b4e0: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69  cannot be used i
b4f0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73  nstead of the 's
b500: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
b510: 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73  range' is that s
b520: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
b530: 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73  windows do not s
b540: 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b  upport read-lock
b550: 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69  s. By.  ** locki
b560: 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  ng a random byte
b570: 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63   from a range, c
b580: 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44  oncurrent SHARED
b590: 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74   locks may exist
b5a0: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
b5b0: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  e locking primit
b5c0: 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61  ive used is alwa
b5d0: 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e  ys a write-lock.
b5e0: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  .  */.  int rc =
b5f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
b600: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
b610: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
b620: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
b630: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
b640: 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
b650: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
b660: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a  nt tErrno = 0;..
b670: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
b680: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
b690: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
b6a0: 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
b6b0: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
b6c0: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46  le->h,.      azF
b6d0: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
b6e0: 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70  k), azFileLock(p
b6f0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  File->eFileLock)
b700: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
b710: 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  ck(pInode->eFile
b720: 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e  Lock), pInode->n
b730: 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28  Shared , getpid(
b740: 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
b750: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
b760: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
b770: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
b780: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
b790: 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
b7a0: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
b7b0: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
b7c0: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
b7d0: 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
b7e0: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
b7f0: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
b800: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
b810: 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
b820: 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
b830: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
b840: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
b850: 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20  eld) (unix)\n", 
b860: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
b870: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
b880: 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
b890: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b8a0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
b8b0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
b8c0: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
b8d0: 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20   correct..  **  
b8e0: 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
b8f0: 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
b900: 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
b910: 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
b920: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
b930: 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
b940: 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
b950: 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
b960: 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
b970: 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
b980: 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
b990: 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
b9a0: 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
b9b0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
b9c0: 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
b9d0: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
b9e0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
b9f0: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
ba00: 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
ba10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
ba20: 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
ba30: 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
ba40: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
ba50: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
ba60: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
ba70: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
ba80: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
ba90: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
baa0: 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
bab0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
bac0: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
bad0: 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
bae0: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
baf0: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
bb00: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
bb10: 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
bb20: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
bb30: 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
bb40: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
bb50: 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
bb60: 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
bb70: 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
bb80: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
bb90: 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64            (pInod
bba0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
bbb0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
bbc0: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
bbd0: 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  OCK)).  ){.    r
bbe0: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
bbf0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
bc00: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ck;.  }..  /* If
bc10: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
bc20: 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
bc30: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
bc40: 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
bc50: 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
bc60: 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
bc70: 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
bc80: 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
bc90: 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
bca0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
bcb0: 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
bcc0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
bcd0: 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28  LOCK && .      (
bce0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
bcf0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
bd00: 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  | pInode->eFileL
bd10: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
bd20: 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
bd30: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
bd40: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
bd50: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
bd60: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
bd70: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
bd80: 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b  de->nShared>0 );
bd90: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
bda0: 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
bdb0: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
bdc0: 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20  >nShared++;.    
bdd0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
bde0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
bdf0: 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ck;.  }...  /* A
be00: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
be10: 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
be20: 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
be30: 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
be40: 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
be50: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
be60: 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
be70: 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
be80: 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
be90: 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
bea0: 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  /.  lock.l_len =
beb0: 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68   1L;.  lock.l_wh
bec0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
bed0: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
bee0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
bef0: 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
bf00: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
bf10: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
bf20: 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
bf30: 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f  OCK).  ){.    lo
bf40: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69  ck.l_type = (eFi
bf50: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
bf60: 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52  OCK?F_RDLCK:F_WR
bf70: 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  LCK);.    lock.l
bf80: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
bf90: 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75  _BYTE;.    if( u
bfa0: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
bfb0: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
bfc0: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
bfd0: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
bfe0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
bff0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
c000: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
c010: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
c020: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
c030: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
c040: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
c050: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
c060: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
c070: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
c080: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
c090: 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
c0a0: 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
c0b0: 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
c0c0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
c0d0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
c0e0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
c0f0: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
c100: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
c110: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
c120: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
c130: 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  hared==0 );.    
c140: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
c150: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
c160: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
c170: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
c180: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
c190: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
c1a0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c1b0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
c1c0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
c1d0: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
c1e0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
c1f0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
c200: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
c210: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
c220: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
c230: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
c240: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
c250: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a  RR_LOCK);.    }.
c260: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
c270: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
c280: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
c290: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
c2a0: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
c2b0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
c2c0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
c2d0: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
c2e0: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
c2f0: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26  (pFile, &lock) &
c300: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
c310: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
c320: 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69   could happen wi
c330: 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75  th a network mou
c340: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72  nt */.      tErr
c350: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
c360: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
c370: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20  ERR_UNLOCK; .   
c380: 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29   }..    if( rc )
c390: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  {.      if( rc!=
c3a0: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
c3b0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
c3c0: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
c3d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c3e0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
c3f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c400: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
c410: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
c420: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
c430: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
c440: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
c450: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
c460: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
c470: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
c480: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
c490: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
c4a0: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
c4b0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
c4c0: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
c4d0: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
c4e0: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
c4f0: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
c500: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
c510: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
c520: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
c530: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
c540: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
c550: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
c560: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
c570: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
c580: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
c590: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
c5a0: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
c5b0: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
c5c0: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
c5d0: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
c5e0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
c5f0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
c600: 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73  F_WRLCK;..    as
c610: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
c620: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
c630: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  | eFileLock==EXC
c640: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
c650: 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b     if( eFileLock
c660: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
c670: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
c680: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
c690: 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _BYTE;.      loc
c6a0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
c6b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
c6c0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
c6d0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
c6e0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
c6f0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
c700: 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  }..    if( unixF
c710: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
c720: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
c730: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
c740: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c750: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
c760: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
c770: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
c780: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
c790: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
c7a0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
c7b0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
c7c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c7d0: 7d 0a 20 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44  }.  ..#ifndef ND
c7e0: 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70  EBUG.  /* Set up
c7f0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
c800: 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20  -counter change 
c810: 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77  checking flags w
c820: 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74  hen.  ** transit
c830: 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48  ioning from a SH
c840: 41 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56  ARED to a RESERV
c850: 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68  ED lock.  The ch
c860: 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53  ange.  ** from S
c870: 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45  HARED to RESERVE
c880: 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69  D marks the begi
c890: 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61  nning of a norma
c8a0: 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65  l.  ** write ope
c8b0: 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f  ration (not a ho
c8c0: 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t journal rollba
c8d0: 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ck)..  */.  if( 
c8e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
c8f0: 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
c900: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
c910: 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63  K.   && eFileLoc
c920: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
c930: 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  .  ){.    pFile-
c940: 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
c950: 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   0;.    pFile->d
c960: 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20  bUpdate = 0;.   
c970: 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
c980: 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23  Write = 1;.  }.#
c990: 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63  endif...  if( rc
c9a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c9b0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
c9c0: 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
c9d0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
c9e0: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
c9f0: 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ck;.  }else if( 
ca00: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
ca10: 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
ca20: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
ca30: 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
ca40: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
ca50: 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
ca60: 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64  G_LOCK;.  }..end
ca70: 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  _lock:.  unixLea
ca80: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
ca90: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
caa0: 64 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e  d %s %s (unix)\n
cab0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
cac0: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
cad0: 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53  k), .      rc==S
cae0: 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
caf0: 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
cb00: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
cb10: 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65  .** Add the file
cb20: 20 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64   descriptor used
cb30: 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20   by file handle 
cb40: 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72  pFile to the cor
cb50: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55  responding.** pU
cb60: 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73  nused list..*/.s
cb70: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65  tatic void setPe
cb80: 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65  ndingFd(unixFile
cb90: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
cba0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
cbb0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
cbc0: 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  e;.  UnixUnusedF
cbd0: 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55  d *p = pFile->pU
cbe0: 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78  nused;.  p->pNex
cbf0: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  t = pInode->pUnu
cc00: 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  sed;.  pInode->p
cc10: 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46  Unused = p;.  pF
cc20: 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70  ile->h = -1;.  p
cc30: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  File->pUnused = 
cc40: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  0;.}../*.** Lowe
cc50: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
cc60: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
cc70: 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
cc80: 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
cc90: 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
cca0: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
ccb0: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
ccc0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
ccd0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
cce0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
ccf0: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
cd00: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
cd10: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
cd20: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
cd30: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
cd40: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64  ..** .** If hand
cd50: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74  leNFSUnlock is t
cd60: 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77  rue, then on dow
cd70: 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c  ngrading an EXCL
cd80: 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48  USIVE_LOCK to SH
cd90: 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65  ARED.** the byte
cda0: 20 72 61 6e 67 65 20 69 73 20 64 69 76 69 64 65   range is divide
cdb0: 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61  d into 2 parts a
cdc0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 70 61 72  nd the first par
cdd0: 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68  t is unlocked th
cde0: 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72  en.** set to a r
cdf0: 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  ead lock, then t
ce00: 68 65 20 6f 74 68 65 72 20 70 61 72 74 20 69 73  he other part is
ce10: 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64   simply unlocked
ce20: 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a  .  This works .*
ce30: 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69  * around a bug i
ce40: 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20  n BSD NFS lockd 
ce50: 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61  (also seen on Ma
ce60: 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74  cOSX 10.3+) that
ce70: 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65   fails to .** re
ce80: 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65 20 6c  move the write l
ce90: 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20  ock on a region 
cea0: 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b  when a read lock
ceb0: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   is set..*/.stat
cec0: 69 63 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f  ic int posixUnlo
ced0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
cee0: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
cef0: 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46  ck, int handleNF
cf00: 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78  SUnlock){.  unix
cf10: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
cf20: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
cf30: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
cf40: 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66  node;.  struct f
cf50: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
cf60: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
cf70: 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 61 73 73  .  int h;..  ass
cf80: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
cf90: 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
cfa0: 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25    %d %d was %d(%
cfb0: 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  d,%d) pid=%d (un
cfc0: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
cfd0: 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
cfe0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
cff0: 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
d000: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  de->eFileLock, p
d010: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
d020: 68 61 72 65 64 2c 0a 20 20 20 20 20 20 67 65 74  hared,.      get
d030: 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65  pid()));..  asse
d040: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
d050: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
d060: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
d070: 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock<=eFileLock 
d080: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d090: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
d0a0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
d0b0: 0a 20 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  .  h = pFile->h;
d0c0: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
d0d0: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
d0e0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
d0f0: 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  ared!=0 );.  if(
d100: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d110: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
d120: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
d130: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
d140: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
d150: 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65   );.    Simulate
d160: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
d170: 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
d180: 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
d190: 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
d1a0: 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 0a 23  rorBenign(0);..#
d1b0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
d1c0: 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69    /* When reduci
d1d0: 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74  ng a lock such t
d1e0: 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73  hat other proces
d1f0: 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20  ses can start.  
d200: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
d210: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
d220: 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  gain, make sure 
d230: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
d240: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
d250: 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
d260: 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74  if any part of t
d270: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
d280: 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e  ** file changed.
d290: 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
d2a0: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
d2b0: 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20  not updated,.   
d2c0: 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
d2d0: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d  tions to the sam
d2e0: 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74  e file might not
d2f0: 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20   realize that.  
d300: 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61    ** the file ha
d310: 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65  s changed and he
d320: 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e  nce might not kn
d330: 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69  ow to flush thei
d340: 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20  r.    ** cache. 
d350: 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74   The use of a st
d360: 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65  ale cache can le
d370: 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
d380: 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  orruption..    *
d390: 2f 0a 23 69 66 20 30 0a 20 20 20 20 61 73 73 65  /.#if 0.    asse
d3a0: 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  rt( pFile->inNor
d3b0: 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20  malWrite==0.    
d3c0: 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64       || pFile->d
d3d0: 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20  bUpdate==0.     
d3e0: 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72      || pFile->tr
d3f0: 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29  ansCntrChng==1 )
d400: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 46 69  ;.#endif.    pFi
d410: 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
d420: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  e = 0;.#endif.. 
d430: 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e     /* downgradin
d440: 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  g to a shared lo
d450: 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76  ck on NFS involv
d460: 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  es clearing the 
d470: 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a  write lock.    *
d480: 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69  * before establi
d490: 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f  shing the readlo
d4a0: 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ck - to avoid a 
d4b0: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77  race condition w
d4c0: 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20  e downgrade.    
d4d0: 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32  ** the lock in 2
d4e0: 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74   blocks, so that
d4f0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e   part of the ran
d500: 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72  ge will be cover
d510: 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20  ed by a .    ** 
d520: 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c  write lock until
d530: 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f 76   the rest is cov
d540: 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20 6c  ered by a read l
d550: 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20  ock:.    **  1: 
d560: 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a    [WWWWW].    **
d570: 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20    2:   [....W]. 
d580: 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52     **  3:   [RRR
d590: 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20  RW].    **  4:  
d5a0: 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a   [RRRR.].    */.
d5b0: 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63      if( eFileLoc
d5c0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
d5d0: 7b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  {..#if !defined(
d5e0: 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53  __APPLE__) || !S
d5f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
d600: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20  KING_STYLE.     
d610: 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53   (void)handleNFS
d620: 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73  Unlock;.      as
d630: 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55  sert( handleNFSU
d640: 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64  nlock==0 );.#end
d650: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
d660: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
d670: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
d680: 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69  NG_STYLE.      i
d690: 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  f( handleNFSUnlo
d6a0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ck ){.        in
d6b0: 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  t tErrno;       
d6c0: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
d6d0: 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65   code from syste
d6e0: 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f  m call errors */
d6f0: 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64  .        off_t d
d700: 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f  ivSize = SHARED_
d710: 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20  SIZE - 1;.      
d720: 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e    .        lock.
d730: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
d740: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
d750: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
d760: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
d770: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
d780: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
d790: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
d7a0: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
d7b0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
d7c0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
d7d0: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
d7e0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
d7f0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
d800: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
d810: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  OCK;.          i
d820: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
d830: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
d840: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
d850: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
d860: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d870: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
d880: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
d890: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
d8a0: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
d8b0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
d8c0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
d8d0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
d8e0: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
d8f0: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
d900: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69  ck.l_len = divSi
d910: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
d920: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
d930: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
d940: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
d950: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
d960: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
d970: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
d980: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
d990: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
d9a0: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  CK);.          i
d9b0: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
d9c0: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
d9d0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
d9e0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
d9f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
da00: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
da10: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
da20: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
da30: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
da40: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
da50: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
da60: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
da70: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
da80: 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20  IRST+divSize;.  
da90: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
daa0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64   = SHARED_SIZE-d
dab0: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
dac0: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
dad0: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
dae0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
daf0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
db00: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
db10: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
db20: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
db30: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
db40: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
db50: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
db60: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
db70: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
db80: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
db90: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
dba0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
dbb0: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
dbc0: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
dbd0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
dbe0: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20  NG_STYLE */.    
dbf0: 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    {.        lock
dc00: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
dc10: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
dc20: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
dc30: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
dc40: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
dc50: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
dc60: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
dc70: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
dc80: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
dc90: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
dca0: 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k) ){.          
dcb0: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
dcc0: 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69  e call to unixFi
dcd0: 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20  leLock() cannot 
dce0: 66 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f  fail because ano
dcf0: 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ther.          *
dd00: 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  * process is hol
dd10: 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74  ding an incompat
dd20: 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74  ible lock. If it
dd30: 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20   does, this .   
dd40: 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61         ** indica
dd50: 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74 68  tes that the oth
dd60: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
dd70: 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  t following the 
dd80: 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20  locking.        
dd90: 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49    ** protocol. I
dda0: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  f this happens, 
ddb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
ddc0: 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75  ERR_RDLOCK. Retu
ddd0: 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rning.          
dde0: 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
ddf0: 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65  ould confuse the
de00: 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e   upper layer (in
de10: 20 70 72 61 63 74 69 63 65 20 69 74 20 63 61 75   practice it cau
de20: 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ses .          *
de30: 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66  * an assert to f
de40: 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20  ail). */ .      
de50: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
de60: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20  IOERR_RDLOCK;.  
de70: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
de80: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
de90: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
dea0: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
deb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
dec0: 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f     }.    lock.l_
ded0: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
dee0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
def0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
df00: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
df10: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
df20: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
df30: 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e  2L;  assert( PEN
df40: 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53  DING_BYTE+1==RES
df50: 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20  ERVED_BYTE );.  
df60: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
df70: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
df80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  ==0 ){.      pIn
df90: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
dfa0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
dfb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
dfc0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
dfd0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  _UNLOCK;.      p
dfe0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
dff0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 67  = errno;.      g
e000: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
e010: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
e020: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
e030: 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63  CK ){.    /* Dec
e040: 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
e050: 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
e060: 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
e070: 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
e080: 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
e090: 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
e0a0: 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
e0b0: 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
e0c0: 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
e0d0: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ck..    */.    p
e0e0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
e0f0: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
e100: 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
e110: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
e120: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
e130: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
e140: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
e150: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
e160: 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30  = lock.l_len = 0
e170: 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  L;.      Simulat
e180: 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
e190: 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
e1a0: 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
e1b0: 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74   ).      Simulat
e1c0: 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
e1d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69  );.      if( uni
e1e0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
e1f0: 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20   &lock)==0 ){.  
e200: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
e210: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
e220: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
e230: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
e240: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
e250: 3b 0a 09 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  ;..pFile->lastEr
e260: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e270: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
e280: 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
e290: 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
e2a0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
e2b0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
e2c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72    }..    /* Decr
e2d0: 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20  ement the count 
e2e0: 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74  of locks against
e2f0: 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e   this same file.
e300: 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a    When the.    *
e310: 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  * count reaches 
e320: 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20  zero, close any 
e330: 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
e340: 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f  iptors whose clo
e350: 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65  se.    ** was de
e360: 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f  ferred because o
e370: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
e380: 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  cks..    */.    
e390: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
e3a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
e3b0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
e3c0: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
e3d0: 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
e3e0: 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
e3f0: 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ds(pFile);.    }
e400: 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63  .  }...end_unloc
e410: 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
e420: 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
e430: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
e440: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
e450: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
e460: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e470: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
e480: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
e490: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
e4a0: 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
e4b0: 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
e4c0: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
e4d0: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
e4e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
e4f0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
e500: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
e510: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
e520: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
e530: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
e540: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
e550: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
e560: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
e570: 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28   int unixUnlock(
e580: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
e590: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
e5a0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78  {.  return posix
e5b0: 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
e5c0: 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Lock, 0);.}../*.
e5d0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
e5e0: 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61   performs the pa
e5f0: 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73  rts of the "clos
e600: 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f  e file" operatio
e610: 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20  n .** common to 
e620: 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65  all locking sche
e630: 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74  mes. It closes t
e640: 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  he directory and
e650: 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73   file.** handles
e660: 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61  , if they are va
e670: 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c  lid, and sets al
e680: 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  l fields of the 
e690: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
e6a0: 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  cture to 0..**.*
e6b0: 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65  * It is *not* ne
e6c0: 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20  cessary to hold 
e6d0: 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74  the mutex when t
e6e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
e6f0: 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f  alled,.** even o
e700: 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75  n VxWorks.  A mu
e710: 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75  tex will be acqu
e720: 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20  ired on VxWorks 
e730: 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b  by the.** vxwork
e740: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29  sReleaseFileId()
e750: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
e760: 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69  tic int closeUni
e770: 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69  xFile(sqlite3_fi
e780: 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46  le *id){.  unixF
e790: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
e7a0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66  ixFile*)id;.  if
e7b0: 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d  ( pFile->dirfd>=
e7c0: 30 20 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f  0 ){.    robust_
e7d0: 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69  close(pFile, pFi
e7e0: 6c 65 2d 3e 64 69 72 66 64 2c 20 5f 5f 4c 49 4e  le->dirfd, __LIN
e7f0: 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  E__);.    pFile-
e800: 3e 64 69 72 66 64 3d 2d 31 3b 0a 20 20 7d 0a 20  >dirfd=-1;.  }. 
e810: 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
e820: 20 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63   ){.    robust_c
e830: 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c  lose(pFile, pFil
e840: 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  e->h, __LINE__);
e850: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  .    pFile->h = 
e860: 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56  -1;.  }.#if OS_V
e870: 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69  XWORKS.  if( pFi
e880: 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69  le->pId ){.    i
e890: 66 28 20 70 46 69 6c 65 2d 3e 69 73 44 65 6c 65  f( pFile->isDele
e8a0: 74 65 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 69  te ){.      unli
e8b0: 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a  nk(pFile->pId->z
e8c0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a  CanonicalName);.
e8d0: 20 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b      }.    vxwork
e8e0: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70  sReleaseFileId(p
e8f0: 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20  File->pId);.    
e900: 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a  pFile->pId = 0;.
e910: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54    }.#endif.  OST
e920: 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25  RACE(("CLOSE   %
e930: 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
e940: 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  ));.  OpenCounte
e950: 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  r(-1);.  sqlite3
e960: 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e  _free(pFile->pUn
e970: 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28  used);.  memset(
e980: 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
e990: 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72  (unixFile));.  r
e9a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e9b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
e9c0: 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
e9d0: 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28  c int unixClose(
e9e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
e9f0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
ea00: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
ea10: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
ea20: 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75  ixFile *)id;.  u
ea30: 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  nixUnlock(id, NO
ea40: 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e  _LOCK);.  unixEn
ea50: 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  terMutex();..  /
ea60: 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64  * unixFile.pInod
ea70: 65 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  e is always vali
ea80: 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73  d here. Otherwis
ea90: 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  e, a different c
eaa0: 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  lose.  ** routin
eab0: 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c  e (e.g. nolockCl
eac0: 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20  ose()) would be 
ead0: 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a  called instead..
eae0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
eaf0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
eb00: 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e  ock>0 || pFile->
eb10: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
eb20: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Lock==0 );.  if(
eb30: 20 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70   ALWAYS(pFile->p
eb40: 49 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d  Inode) && pFile-
eb50: 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
eb60: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
eb70: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
eb80: 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
eb90: 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
eba0: 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
ebb0: 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
ebc0: 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
ebd0: 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
ebe0: 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
ebf0: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63  file.    ** desc
ec00: 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
ec10: 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20  ->pUnused list. 
ec20: 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
ec30: 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
ec40: 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68   .    ** when th
ec50: 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
ec60: 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
ec70: 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
ec80: 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pFile);.  }.  re
ec90: 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
eca0: 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c  File);.  rc = cl
ecb0: 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
ecc0: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
ecd0: 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
ece0: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
ecf0: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
ed00: 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
ed10: 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
ed20: 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
ed30: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
ed40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed80: 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
ed90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eda0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
edb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
edc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
edd0: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
ede0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
edf0: 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69  **** No-op Locki
ee00: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
ee10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee20: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74  *****.**.** Of t
ee30: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69  he various locki
ee40: 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
ee50: 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ns available, th
ee60: 69 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65  is is by far the
ee70: 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c  .** simplest:  l
ee80: 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65  ocking is ignore
ee90: 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69  d.  No attempt i
eea0: 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74  s made to lock t
eeb0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
eec0: 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ile for reading 
eed0: 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  or writing..**.*
eee0: 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  * This locking m
eef0: 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ode is appropria
ef00: 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65  te for use on re
ef10: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
ef20: 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61  s.** (ex: databa
ef30: 73 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72  ses that are bur
ef40: 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c  ned into CD-ROM,
ef50: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20   for example.)  
ef60: 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62  It can.** also b
ef70: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70  e used if the ap
ef80: 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79  plication employ
ef90: 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20  s some external 
efa0: 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20  mechanism to.** 
efb0: 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e  prevent simultan
efc0: 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74  eous access of t
efd0: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
efe0: 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   by two or more.
eff0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
f000: 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  ections.  But th
f010: 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73  ere is a serious
f020: 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73   risk of databas
f030: 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  e.** corruption 
f040: 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  if this locking 
f050: 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20  mode is used in 
f060: 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65  situations where
f070: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74   multiple.** dat
f080: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
f090: 73 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20  s are accessing 
f0a0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
f0b0: 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
f0c0: 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f  me.** time and o
f0d0: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
f0e0: 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ose connections 
f0f0: 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a  are writing..*/.
f100: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
f110: 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
f120: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
f130: 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a   *NotUsed, int *
f140: 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53  pResOut){.  UNUS
f150: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
f160: 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75  Used);.  *pResOu
f170: 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
f180: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
f190: 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f  tic int nolockLo
f1a0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
f1b0: 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
f1c0: 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
f1d0: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
f1e0: 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
f1f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f200: 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
f210: 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  t nolockUnlock(s
f220: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
f230: 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
f240: 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
f250: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
f260: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
f270: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
f290: 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
f2a0: 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c  tic int nolockCl
f2b0: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
f2c0: 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e   *id) {.  return
f2d0: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
f2e0: 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  d);.}../********
f2f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
f300: 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63  of the no-op loc
f310: 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
f320: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
f330: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
f340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f380: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
f390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f3a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f3b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f3d0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
f3e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f3f0: 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65  * Begin dot-file
f400: 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
f410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f420: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
f430: 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  e dotfile lockin
f440: 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
f450: 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 61   uses the exista
f460: 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20  nce of separate 
f470: 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 69 6e  lock.** files in
f480: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 72 6f   order to contro
f490: 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  l access to the 
f4a0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
f4b0: 77 6f 72 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a  works on just.**
f4c0: 20 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c   about every fil
f4d0: 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62  esystem imaginab
f4e0: 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61  le.  But there a
f4f0: 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73  re serious downs
f500: 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ides:.**.**    (
f510: 31 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72  1)  There is zer
f520: 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20  o concurrency.  
f530: 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20  A single reader 
f540: 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72  blocks all other
f550: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e  .**         conn
f560: 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61  ections from rea
f570: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
f580: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
f590: 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61  .**    (2)  An a
f5a0: 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68  pplication crash
f5b0: 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63   or power loss c
f5c0: 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c  an leave stale l
f5d0: 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20  ock files.**    
f5e0: 20 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f       sitting aro
f5f0: 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f  und that need to
f600: 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75   be cleared manu
f610: 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65  ally..**.** Neve
f620: 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c  rtheless, a dotl
f630: 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70  ock is an approp
f640: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f  riate locking mo
f650: 64 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f  de for use if no
f660: 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
f670: 67 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76  g strategy is av
f680: 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44  ailable..**.** D
f690: 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77  otfile locking w
f6a0: 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67  orks by creating
f6b0: 20 61 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73   a file in the s
f6c0: 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
f6d0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
f6e0: 20 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61   and with the sa
f6f0: 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68  me name but with
f700: 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e   a ".lock" exten
f710: 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54  sion added..** T
f720: 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
f730: 61 20 6c 6f 63 6b 20 66 69 6c 65 20 69 6d 70 6c  a lock file impl
f740: 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ies an EXCLUSIVE
f750: 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65   lock.  All othe
f760: 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70 65 73 20  r lock.** types 
f770: 28 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45  (SHARED, RESERVE
f780: 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20  D, PENDING) are 
f790: 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c  mapped into EXCL
f7a0: 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  USIVE..*/../*.**
f7b0: 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78   The file suffix
f7c0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61   added to the da
f7d0: 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  ta base filename
f7e0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
f7f0: 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20  ate the.** lock 
f800: 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  file..*/.#define
f810: 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20   DOTLOCK_SUFFIX 
f820: 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54  ".lock"../*.** T
f830: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
f840: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
f850: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
f860: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
f870: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
f880: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
f890: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
f8a0: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
f8b0: 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
f8c0: 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
f8d0: 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
f8e0: 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
f8f0: 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
f900: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
f910: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
f920: 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
f930: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
f940: 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
f950: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74  ng..**.** In dot
f960: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69  file locking, ei
f970: 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73  ther a lock exis
f980: 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f  ts or it does no
f990: 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a  t.  So in this.*
f9a0: 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43  * variation of C
f9b0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
f9c0: 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20  (), *pResOut is 
f9d0: 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  set to true if a
f9e0: 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65  ny lock.** is he
f9f0: 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61  ld on the file a
fa00: 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  nd false if the 
fa10: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
fa20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fa30: 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
fa40: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
fa50: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
fa60: 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74  pResOut) {.  int
fa70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
fa80: 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
fa90: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
faa0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
fab0: 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
fac0: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
fad0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
fae0: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
faf0: 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
fb00: 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
fb10: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
fb20: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
fb30: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
fb40: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
fb50: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
fb60: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
fb70: 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69     /* Either thi
fb80: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20  s connection or 
fb90: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
fba0: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d  ction in the sam
fbb0: 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  e process.    **
fbc0: 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e   holds a lock on
fbd0: 20 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e   the file.  No n
fbe0: 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72  eed to check fur
fbf0: 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73  ther. */.    res
fc00: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  erved = 1;.  }el
fc10: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c  se{.    /* The l
fc20: 6f 63 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61  ock is held if a
fc30: 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c  nd only if the l
fc40: 6f 63 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a  ockfile exists *
fc50: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
fc60: 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
fc70: 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65  onst char*)pFile
fc80: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
fc90: 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  ;.    reserved =
fca0: 20 6f 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46   osAccess(zLockF
fcb0: 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a  ile, 0)==0;.  }.
fcc0: 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
fcd0: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
fce0: 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20  d (dotlock)\n", 
fcf0: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
fd00: 73 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65  served));.  *pRe
fd10: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
fd20: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fd30: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
fd40: 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
fd50: 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
fd60: 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
fd70: 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
fd80: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
fd90: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
fda0: 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
fdb0: 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
fdc0: 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
fdd0: 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
fde0: 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
fdf0: 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
fe00: 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
fe10: 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
fe20: 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
fe30: 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
fe40: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
fe50: 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
fe60: 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
fe70: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
fe80: 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
fe90: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
fea0: 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
feb0: 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
fec0: 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
fed0: 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
fee0: 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
fef0: 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
ff00: 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
ff10: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
ff20: 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
ff30: 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
ff40: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
ff50: 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
ff60: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
ff70: 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
ff80: 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
ff90: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
ffa0: 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
ffb0: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
ffc0: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
ffd0: 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
ffe0: 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
fff0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
10000 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
10010 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
10020 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
10030 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
10040 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
10050 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74  ..**.** With dot
10060 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65  file locking, we
10070 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70   really only sup
10080 70 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a 20  port state (4): 
10090 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75  EXCLUSIVE..** Bu
100a0 74 20 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f  t we track the o
100b0 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  ther locking lev
100c0 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  els internally..
100d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
100e0 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  tlockLock(sqlite
100f0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
10100 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
10110 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
10120 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
10130 20 20 69 6e 74 20 66 64 3b 0a 20 20 63 68 61 72    int fd;.  char
10140 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
10150 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
10160 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
10170 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10180 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  K;...  /* If we 
10190 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74  have any lock, t
101a0 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  hen the lock fil
101b0 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
101c0 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20  .  All we have. 
101d0 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a   ** to do is adj
101e0 75 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ust our internal
101f0 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c   record of the l
10200 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a  ock level..  */.
10210 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
10220 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
10230 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
10240 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
10250 4c 6f 63 6b 3b 0a 23 69 66 20 21 4f 53 5f 56 58  Lock;.#if !OS_VX
10260 57 4f 52 4b 53 0a 20 20 20 20 2f 2a 20 41 6c 77  WORKS.    /* Alw
10270 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74  ays update the t
10280 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20  imestamp on the 
10290 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  old file */.    
102a0 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65  utimes(zLockFile
102b0 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
102c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
102d0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
102e0 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
102f0 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64  ive lock */.  fd
10300 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
10310 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52 44 4f 4e 4c  LockFile,O_RDONL
10320 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c  Y|O_CREAT|O_EXCL
10330 2c 30 36 30 30 29 3b 0a 20 20 69 66 28 20 66 64  ,0600);.  if( fd
10340 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69  <0 ){.    /* fai
10350 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61  led to open/crea
10360 74 65 20 74 68 65 20 66 69 6c 65 2c 20 73 6f 6d  te the file, som
10370 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79 20 68 61  eone else may ha
10380 76 65 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c 6f  ve stolen the lo
10390 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45  ck */.    int tE
103a0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
103b0 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20    if( EEXIST == 
103c0 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
103d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
103e0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
103f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10400 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
10410 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
10420 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
10430 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
10440 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
10450 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
10460 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
10470 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10480 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10490 20 7d 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f   } .  robust_clo
104a0 73 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f  se(pFile, fd, __
104b0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 0a 20 20 2f 2a  LINE__);.  .  /*
104c0 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
104d0 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
104e0 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e   ok */.  pFile->
104f0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
10500 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
10510 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
10520 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
10530 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
10540 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
10550 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
10560 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
10570 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
10580 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
10590 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
105a0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
105b0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
105c0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
105d0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
105e0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
105f0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
10600 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
10610 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  p..**.** When th
10620 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
10630 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c  reaches NO_LOCK,
10640 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
10650 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
10660 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f   int dotlockUnlo
10670 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
10680 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
10690 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
106a0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
106b0 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
106c0 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
106d0 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
106e0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61  ingContext;..  a
106f0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
10700 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
10710 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
10720 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b   pid=%d (dotlock
10730 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
10740 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70  eFileLock,..   p
10750 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
10760 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61   getpid()));.  a
10770 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
10780 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
10790 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
107a0 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
107b0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
107c0 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
107d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
107e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
107f0 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20  /* To downgrade 
10800 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c  to shared, simpl
10810 79 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  y update our int
10820 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20  ernal notion of 
10830 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74  the.  ** lock st
10840 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f  ate.  No need to
10850 20 6d 65 73 73 20 77 69 74 68 20 74 68 65 20 66   mess with the f
10860 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a  ile on disk..  *
10870 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
10880 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
10890 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
108a0 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
108b0 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e  LOCK;.    return
108c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
108d0 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79    .  /* To fully
108e0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
108f0 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65  base, delete the
10900 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
10910 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
10920 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20  k==NO_LOCK );.  
10930 69 66 28 20 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b  if( unlink(zLock
10940 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 69 6e 74  File) ){.    int
10950 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74   rc = 0;.    int
10960 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
10970 0a 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20  .    if( ENOENT 
10980 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  != tErrno ){.   
10990 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
109a0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
109b0 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
109c0 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
109d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
109e0 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
109f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
10a00 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
10a10 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
10a20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
10a30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10a40 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
10a50 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  le.  Make sure t
10a60 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
10a70 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65   released before
10a80 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61   closing..*/.sta
10a90 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
10aa0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
10ab0 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
10ac0 63 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  c;.  if( id ){. 
10ad0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
10ae0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
10af0 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55  id;.    dotlockU
10b00 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
10b10 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  K);.    sqlite3_
10b20 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  free(pFile->lock
10b30 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  ingContext);.  }
10b40 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69  .  rc = closeUni
10b50 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 72 65 74  xFile(id);.  ret
10b60 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  urn rc;.}./*****
10b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
10b80 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c  d of the dot-fil
10b90 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
10ba0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
10bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
10bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c00 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
10c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
10c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c70 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63  ***** Begin floc
10c80 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  k Locking ******
10c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
10cb0 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29   Use the flock()
10cc0 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
10cd0 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e  do file locking.
10ce0 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c  .**.** flock() l
10cf0 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
10d00 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  ot-file locking 
10d10 69 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69  in that the vari
10d20 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69  ous.** fine-grai
10d30 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  n locking levels
10d40 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51   supported by SQ
10d50 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73  Lite are collaps
10d60 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ed into.** a sin
10d70 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  gle exclusive lo
10d80 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ck.  In other wo
10d90 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53  rds, SHARED, RES
10da0 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45  ERVED, and.** PE
10db0 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20  NDING locks are 
10dc0 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61  the same thing a
10dd0 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
10de0 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20  ock.  SQLite.** 
10df0 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e  still works when
10e00 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75   you do this, bu
10e10 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73  t concurrency is
10e20 20 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a   reduced since.*
10e30 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
10e40 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72  process can be r
10e50 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
10e60 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a  ase at a time..*
10e70 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73  *.** Omit this s
10e80 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45  ection if SQLITE
10e90 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
10ea0 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20  STYLE is turned 
10eb0 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d  off or if.** com
10ec0 70 69 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52  piling for VXWOR
10ed0 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  KS..*/.#if SQLIT
10ee0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
10ef0 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
10f00 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  WORKS../*.** Ret
10f10 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73  ry flock() calls
10f20 20 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20   that fail with 
10f30 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20  EINTR.*/.#ifdef 
10f40 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74  EINTR.static int
10f50 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e   robust_flock(in
10f60 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20  t fd, int op){. 
10f70 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72   int rc;.  do{ r
10f80 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29  c = flock(fd,op)
10f90 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
10fa0 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
10fb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10fc0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
10fd0 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62  robust_flock(a,b
10fe0 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e  ) flock(a,b).#en
10ff0 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  dif.     ../*.**
11000 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
11010 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
11020 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
11030 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
11040 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
11050 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
11060 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
11070 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
11080 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
11090 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
110a0 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
110b0 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
110c0 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
110d0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
110e0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
110f0 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
11100 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
11110 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
11120 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
11130 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  int flockCheckRe
11140 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
11150 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
11160 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
11170 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11180 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
11190 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
111a0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
111b0 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
111c0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
111d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
111e0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
111f0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
11200 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
11210 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
11220 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
11230 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
11240 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
11250 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
11260 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
11270 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
11280 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
11290 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
112a0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
112b0 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
112c0 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
112d0 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74  ed ){.    /* att
112e0 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  empt to get the 
112f0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lock */.    int 
11300 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f  lrc = robust_flo
11310 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
11320 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b  K_EX | LOCK_NB);
11330 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b  .    if( !lrc ){
11340 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68  .      /* got th
11350 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  e lock, unlock i
11360 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  t */.      lrc =
11370 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46   robust_flock(pF
11380 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
11390 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63  ;.      if ( lrc
113a0 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74   ) {.        int
113b0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
113c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f  .        /* unlo
113d0 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  ck failed with a
113e0 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
113f0 20 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f     lrc = SQLITE_
11400 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20  IOERR_UNLOCK; . 
11410 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
11420 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
11430 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
11440 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
11450 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
11460 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20  rc = lrc;.      
11470 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11480 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69  } else {.      i
11490 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
114a0 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  o;.      reserve
114b0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  d = 1;.      /* 
114c0 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67  someone else mig
114d0 68 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72  ht have it reser
114e0 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ved */.      lrc
114f0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
11500 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
11510 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
11520 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20  R_LOCK); .      
11530 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
11540 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
11550 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11560 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
11570 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
11580 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11590 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
115a0 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
115b0 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %d (flock)\n", p
115c0 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
115d0 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65 66  erved));..#ifdef
115e0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
115f0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
11600 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c  .  if( (rc & SQL
11610 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
11620 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
11630 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
11640 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31  ;.    reserved=1
11650 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
11660 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
11670 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
11680 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  */.  *pResOut = 
11690 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
116a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
116b0 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
116c0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
116d0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
116e0 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
116f0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
11700 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
11710 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
11720 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
11730 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
11740 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
11750 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
11760 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
11770 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
11780 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
11790 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
117a0 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
117b0 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
117c0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
117d0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
117e0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
117f0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
11800 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
11810 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
11820 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
11830 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
11840 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
11850 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
11860 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
11870 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
11880 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
11890 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
118a0 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
118b0 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
118c0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
118d0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
118e0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
118f0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
11900 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
11910 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
11920 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
11930 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
11940 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
11950 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
11960 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20  ** flock() only 
11970 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45  really support E
11980 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20  XCLUSIVE locks. 
11990 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d   We track interm
119a0 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73  ediate.** lock s
119b0 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c  tates in the sql
119c0 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74  ite3_file struct
119d0 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63  ure, but all loc
119e0 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20  ks SHARED or.** 
119f0 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79  above are really
11a00 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
11a10 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c   and exclude all
11a20 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
11a30 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20   from.** access 
11a40 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
11a50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
11a60 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
11a70 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
11a80 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
11a90 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
11aa0 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
11ab0 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
11ac0 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28  c int flockLock(
11ad0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11ae0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
11af0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
11b00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
11b10 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11b20 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  ixFile*)id;..  a
11b30 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
11b40 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
11b50 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
11b60 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
11b70 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
11b80 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
11b90 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
11ba0 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
11bb0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e  e->eFileLock > N
11bc0 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
11bd0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
11be0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
11bf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11c00 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
11c10 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
11c20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20  lock */.  .  if 
11c30 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46  (robust_flock(pF
11c40 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20  ile->h, LOCK_EX 
11c50 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20  | LOCK_NB)) {.  
11c60 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
11c70 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64  rrno;.    /* did
11c80 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65  n't get, must be
11c90 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20   busy */.    rc 
11ca0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
11cb0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
11cc0 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
11cd0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
11ce0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
11cf0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
11d00 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
11d10 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  rrno;.    }.  } 
11d20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f  else {.    /* go
11d30 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
11d40 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
11d50 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   */.    pFile->e
11d60 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
11d70 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  Lock;.  }.  OSTR
11d80 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
11d90 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e   %s %s (flock)\n
11da0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
11db0 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
11dc0 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  k), .           
11dd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
11de0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
11df0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
11e00 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
11e10 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
11e20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
11e30 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
11e40 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
11e50 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
11e60 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11e70 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
11e80 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
11e90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
11ea0 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
11eb0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
11ec0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11ed0 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
11ee0 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
11ef0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
11f00 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
11f10 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
11f20 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
11f30 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
11f40 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
11f50 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
11f60 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
11f70 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
11f80 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
11f90 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
11fa0 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e  atic int flockUn
11fb0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
11fc0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
11fd0 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
11fe0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
11ff0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
12000 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
12010 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
12020 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
12030 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29  d pid=%d (flock)
12040 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
12050 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
12060 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
12070 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29  eLock, getpid())
12080 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
12090 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
120a0 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
120b0 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
120c0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
120d0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c  >eFileLock==eFil
120e0 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
120f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12100 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65   }.  .  /* share
12110 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65  d can just be se
12120 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77  t because we alw
12130 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c  ays have an excl
12140 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65  usive */.  if (e
12150 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
12160 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
12170 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
12180 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
12190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
121a0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c  .  }.  .  /* no,
121b0 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e   really, unlock.
121c0 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74   */.  if( robust
121d0 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
121e0 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66   LOCK_UN) ){.#if
121f0 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
12200 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
12210 4f 52 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ORS.    return S
12220 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
12230 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
12240 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
12250 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ORS */.    retur
12260 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  n SQLITE_IOERR_U
12270 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NLOCK;.  }else{.
12280 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
12290 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
122a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
122b0 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
122c0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
122d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
122e0 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
122f0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
12300 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c  if( id ){.    fl
12310 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
12320 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65  _LOCK);.  }.  re
12330 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69  turn closeUnixFi
12340 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69  le(id);.}..#endi
12350 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
12360 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
12370 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a   && !OS_VXWORK *
12380 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
12390 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
123a0 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d  he flock lock im
123b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
123c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123d0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
123e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12420 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
12430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12470 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
12480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
12490 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f  in Named Semapho
124a0 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  re Locking *****
124b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
124c0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20  ***.**.** Named 
124d0 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
124e0 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  g is only suppor
124f0 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ted on VxWorks..
12500 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
12510 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20  locking is like 
12520 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f  dot-lock and flo
12530 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65  ck in that it re
12540 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70  ally only.** sup
12550 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20  ports EXCLUSIVE 
12560 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61  locking.  Only a
12570 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
12580 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74  can read or writ
12590 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  e.** the databas
125a0 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65  e file at a time
125b0 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
125c0 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72  potential concur
125d0 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61  rency, but.** ma
125e0 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70  kes the lock imp
125f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68  lementation much
12600 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20   easier..*/.#if 
12610 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
12620 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
12630 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
12640 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
12650 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
12660 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
12670 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
12680 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
12690 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
126a0 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
126b0 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
126c0 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
126d0 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
126e0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
126f0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
12700 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
12710 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
12720 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
12730 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
12740 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
12750 20 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73   int semCheckRes
12760 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
12770 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
12780 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
12790 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
127a0 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
127b0 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
127c0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
127d0 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
127e0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
127f0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
12800 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
12810 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
12820 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
12830 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
12840 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
12850 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
12860 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
12870 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12880 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
12890 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
128a0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
128b0 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
128c0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
128d0 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
128e0 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
128f0 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65  {.    sem_t *pSe
12900 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
12910 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74 72  e->pSem;.    str
12920 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66  uct stat statBuf
12930 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74  ;..    if( sem_t
12940 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
12950 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45   ){.      int tE
12960 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
12970 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20 21      if( EAGAIN !
12980 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
12990 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
129a0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
129b0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
129c0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
129d0 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  ERVEDLOCK);.    
129e0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
129f0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
12a00 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
12a10 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
12a20 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f   else has the lo
12a30 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69  ck when we are i
12a40 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  n NO_LOCK */.   
12a50 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
12a60 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
12a70 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  k < SHARED_LOCK)
12a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
12a90 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65  lse{.      /* we
12aa0 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69   could have it i
12ab0 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a  f we want it */.
12ac0 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70        sem_post(p
12ad0 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Sem);.    }.  }.
12ae0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
12af0 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
12b00 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c  d (sem)\n", pFil
12b10 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
12b20 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75  ed));..  *pResOu
12b30 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
12b40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12b50 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
12b60 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
12b70 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
12b80 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
12b90 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
12ba0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
12bb0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
12bc0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
12bd0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
12be0 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
12bf0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
12c00 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
12c10 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
12c20 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
12c30 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
12c40 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
12c50 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
12c60 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
12c70 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
12c80 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
12c90 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
12ca0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
12cb0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
12cc0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
12cd0 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
12ce0 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
12cf0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
12d00 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
12d10 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
12d20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
12d30 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
12d40 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
12d50 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
12d60 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
12d70 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
12d80 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
12d90 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
12da0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
12db0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
12dc0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
12dd0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
12de0 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
12df0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
12e00 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
12e10 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c   locks only real
12e20 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
12e30 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
12e40 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
12e50 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
12e60 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
12e70 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
12e80 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
12e90 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
12ea0 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
12eb0 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
12ec0 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
12ed0 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
12ee0 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
12ef0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
12f00 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
12f10 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
12f20 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
12f30 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
12f40 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
12f50 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
12f60 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
12f70 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65  t semLock(sqlite
12f80 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
12f90 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
12fa0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
12fb0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
12fc0 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f    int fd;.  sem_
12fd0 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
12fe0 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20  >pInode->pSem;. 
12ff0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13000 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  _OK;..  /* if we
13010 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
13020 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
13030 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
13040 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
13050 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
13060 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
13070 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
13080 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
13090 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
130a0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
130b0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
130c0 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  _OK;.    goto se
130d0 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
130e0 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d    .  /* lock sem
130f0 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62  aphore now but b
13100 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72  ail out when alr
13110 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  eady locked. */.
13120 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
13130 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
13140 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
13150 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  USY;.    goto se
13160 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
13170 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
13180 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
13190 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
131a0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
131b0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65   eFileLock;.. se
131c0 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65  m_end_lock:.  re
131d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
131e0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
131f0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
13200 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
13210 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
13220 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
13230 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
13240 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
13250 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
13260 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
13270 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
13280 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
13290 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
132a0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
132b0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
132c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
132d0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
132e0 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28  c int semUnlock(
132f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13300 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
13310 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
13320 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
13330 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
13340 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
13350 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73  ode->pSem;..  as
13360 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
13370 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b   assert( pSem );
13380 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
13390 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
133a0 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e  d pid=%d (sem)\n
133b0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
133c0 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c  leLock,..   pFil
133d0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65  e->eFileLock, ge
133e0 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65  tpid()));.  asse
133f0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
13400 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
13410 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
13420 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
13430 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13440 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k==eFileLock ){.
13450 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13460 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
13470 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73  * shared can jus
13480 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65  t be set because
13490 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20   we always have 
134a0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a  an exclusive */.
134b0 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    if (eFileLock=
134c0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a  =SHARED_LOCK) {.
134d0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
134e0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
134f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
13500 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
13510 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75   /* no, really u
13520 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28  nlock. */.  if (
13530 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d   sem_post(pSem)=
13540 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20  =-1 ) {.    int 
13550 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  rc, tErrno = err
13560 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  no;.    rc = sql
13570 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
13580 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
13590 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
135a0 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
135b0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
135c0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
135d0 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
135e0 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
135f0 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
13600 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13610 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
13620 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13630 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61  ../*. ** Close a
13640 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69   file.. */.stati
13650 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73 65 28 73  c int semClose(s
13660 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
13670 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
13680 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
13690 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
136a0 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63  id;.    semUnloc
136b0 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
136c0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
136d0 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74  e );.    unixEnt
136e0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
136f0 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
13700 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78  pFile);.    unix
13710 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
13720 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28    closeUnixFile(
13730 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
13740 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13750 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
13760 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61  ORKS */./*.** Na
13770 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
13780 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
13790 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72  ailable on VxWor
137a0 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks..**.*********
137b0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
137c0 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
137d0 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
137e0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
137f0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
13800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13840 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
13850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13890 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
138a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138b0 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c  **** Begin AFP L
138c0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
138d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138e0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41  ********.**.** A
138f0 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20  FP is the Apple 
13900 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e  Filing Protocol.
13910 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f    AFP is a netwo
13920 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f  rk filesystem fo
13930 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20  und.** on Apple 
13940 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74  Macintosh comput
13950 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61  ers - both OS9 a
13960 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68  nd OSX..**.** Th
13970 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d  ird-party implem
13980 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50  entations of AFP
13990 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20   are available. 
139a0 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68   But this code h
139b0 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b  ere.** only work
139c0 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69  s on OSX..*/..#i
139d0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
139e0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
139f0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
13a00 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66  YLE./*.** The af
13a10 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
13a20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
13a30 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20  ns all afp lock 
13a40 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a  specific state.*
13a50 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
13a60 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13a70 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  xt afpLockingCon
13a80 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70  text;.struct afp
13a90 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
13aa0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b  .  int reserved;
13ab0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  .  const char *d
13ac0 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
13ad0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
13ae0 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d  e open file */.}
13af0 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61  ;..struct ByteRa
13b00 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75  ngeLockPB2.{.  u
13b10 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
13b20 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  g offset;       
13b30 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69   /* offset to fi
13b40 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b  rst byte to lock
13b50 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
13b60 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b  ong long length;
13b70 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f          /* nbr o
13b80 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
13b90 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
13ba0 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65  ng long retRange
13bb0 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66  Start; /* nbr of
13bc0 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64   1st byte locked
13bd0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a   if successful *
13be0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
13bf0 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20  r unLockFlag;   
13c00 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c        /* 1 = unl
13c10 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f  ock, 0 = lock */
13c20 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
13c30 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20   startEndFlag;  
13c40 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f       /* 1=rel to
13c50 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d   end of fork, 0=
13c60 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a  rel to start */.
13c70 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63      /* file desc
13ca0 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c   to assoc this l
13cb0 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a  ock with */.};..
13cc0 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74  #define afpfsByt
13cd0 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
13ce0 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a          _IOWR('z
13cf0 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
13d00 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a  teRangeLockPB2).
13d10 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
13d20 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74   utility for set
13d30 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67  ting or clearing
13d40 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63   a bit-range loc
13d50 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66  k on an.** AFP f
13d60 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a  ilesystem..** .*
13d70 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
13d80 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53  OK on success, S
13d90 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61  QLITE_BUSY on fa
13da0 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
13db0 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28   int afpSetLock(
13dc0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
13dd0 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
13de0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
13df0 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b   file to be lock
13e00 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a  ed or unlocked *
13e10 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  /.  unixFile *pF
13e20 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
13e30 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
13e40 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61  descriptor on pa
13e50 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  th */.  unsigned
13e60 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
13e70 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  t,     /* First 
13e80 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  byte to be locke
13e90 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
13ea0 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
13eb0 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
13ec0 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
13ed0 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63   */.  int setLoc
13ee0 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  kFlag           
13ef0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
13f00 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65  set lock.  False
13f10 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a   to clear lock *
13f20 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79  /.){.  struct By
13f30 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70  teRangeLockPB2 p
13f40 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  b;.  int err;.  
13f50 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67  .  pb.unLockFlag
13f60 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f   = setLockFlag ?
13f70 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61   0 : 1;.  pb.sta
13f80 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20  rtEndFlag = 0;. 
13f90 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66   pb.offset = off
13fa0 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68  set;.  pb.length
13fb0 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62   = length; .  pb
13fc0 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  .fd = pFile->h;.
13fd0 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41    .  OSTRACE(("A
13fe0 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66  FPSETLOCK [%s] f
13ff0 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65  or %d%s in range
14000 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a   %llx:%llx\n", .
14010 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67      (setLockFlag
14020 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46  ?"ON":"OFF"), pF
14030 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d  ile->h, (pb.fd==
14040 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22  -1?"[testval-1]"
14050 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74  :""),.    offset
14060 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72  , length));.  er
14070 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20  r = fsctl(path, 
14080 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
14090 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30  ck2FSCTL, &pb, 0
140a0 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d  );.  if ( err==-
140b0 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
140c0 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  ;.    int tErrno
140d0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53   = errno;.    OS
140e0 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f  TRACE(("AFPSETLO
140f0 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63  CK failed to fsc
14100 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c  tl() '%s' %d %s\
14110 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
14120 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73   path, tErrno, s
14130 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29  trerror(tErrno))
14140 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
14150 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
14160 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d  _ERRORS.    rc =
14170 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65   SQLITE_BUSY;.#e
14180 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  lse.    rc = sql
14190 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
141a0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20  xError(tErrno,. 
141b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141c0 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f     setLockFlag ?
141d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
141e0 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  CK : SQLITE_IOER
141f0 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69  R_UNLOCK);.#endi
14200 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
14210 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f  RE_AFP_LOCK_ERRO
14220 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53  RS */.    if( IS
14230 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
14240 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
14250 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
14260 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  no;.    }.    re
14270 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73  turn rc;.  } els
14280 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e {.    return S
14290 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
142a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
142b0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
142c0 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
142d0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
142e0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
142f0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
14300 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
14310 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
14320 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
14330 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
14340 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
14350 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
14360 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
14370 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
14380 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
14390 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
143a0 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
143b0 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
143c0 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
143d0 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 68 65  tatic int afpChe
143e0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
143f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
14400 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
14410 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14420 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
14430 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
14440 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
14450 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
14460 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
14470 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
14480 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
14490 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
144a0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
144b0 29 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  );.  afpLockingC
144c0 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
144d0 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
144e0 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
144f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
14500 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65   if( context->re
14510 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70  served ){.    *p
14520 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20  ResOut = 1;.    
14530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14540 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
14550 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63  rMutex(); /* Bec
14560 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
14570 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
14580 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20  oss threads */. 
14590 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
145a0 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
145b0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
145c0 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
145d0 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
145e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
145f0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
14600 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
14610 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
14620 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
14630 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
14640 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20  lds it..   */.  
14650 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
14660 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65  .    /* lock the
14670 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a   RESERVED byte *
14680 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
14690 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
146a0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
146b0 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
146c0 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66  , 1,1);  .    if
146d0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63  ( SQLITE_OK==lrc
146e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20   ){.      /* if 
146f0 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
14700 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72  taking the reser
14710 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  ved lock, unlock
14720 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20   it to restore. 
14730 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
14740 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  inal state */.  
14750 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74      lrc = afpSet
14760 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
14770 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
14780 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
14790 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
147a0 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66        /* if we f
147b0 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65  ailed to get the
147c0 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f   lock then someo
147d0 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76  ne else must hav
147e0 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  e it */.      re
147f0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
14800 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
14810 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
14820 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20        rc=lrc;.  
14830 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69    }.  }.  .  uni
14840 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
14850 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
14860 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
14870 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
14880 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
14890 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f  d));.  .  *pResO
148a0 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
148b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
148c0 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
148d0 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
148e0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
148f0 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
14900 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
14910 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
14920 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
14930 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
14940 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
14950 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
14960 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
14970 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
14980 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
14990 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
149a0 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
149b0 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
149c0 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
149d0 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
149e0 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
149f0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
14a00 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
14a10 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
14a20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
14a30 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
14a40 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
14a50 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
14a60 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
14a70 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
14a80 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
14a90 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
14aa0 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
14ab0 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
14ac0 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
14ad0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
14ae0 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
14af0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
14b00 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
14b10 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
14b20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
14b30 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
14b40 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
14b50 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
14b60 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
14b70 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
14b80 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
14b90 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
14ba0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
14bb0 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
14bc0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
14bd0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
14be0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
14bf0 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  pLock(sqlite3_fi
14c00 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
14c10 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
14c20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14c30 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
14c40 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
14c50 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
14c60 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
14c70 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c  ->pInode;.  afpL
14c80 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
14c90 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
14ca0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
14cb0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
14cc0 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72  text;.  .  asser
14cd0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
14ce0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
14cf0 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
14d00 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29  %d) pid=%d (afp)
14d10 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
14d20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
14d30 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
14d40 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
14d50 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20  e->eFileLock),. 
14d60 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
14d70 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69  Lock(pInode->eFi
14d80 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d  leLock), pInode-
14d90 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70 69  >nShared , getpi
14da0 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  d()));..  /* If 
14db0 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
14dc0 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
14dd0 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
14de0 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
14df0 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
14e00 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
14e10 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64   use the afp_end
14e20 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
14e30 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
14e40 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
14e50 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
14e60 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
14e70 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
14e80 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
14e90 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
14ea0 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
14eb0 65 61 64 79 20 68 65 6c 64 29 20 28 61 66 70 29  eady held) (afp)
14ec0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
14ed0 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
14ee0 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29  Lock(eFileLock))
14ef0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
14f00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
14f10 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
14f20 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
14f30 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a  e is correct.  *
14f40 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
14f50 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
14f60 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
14f70 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
14f80 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
14f90 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
14fa0 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
14fb0 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
14fc0 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
14fd0 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
14fe0 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
14ff0 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
15000 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
15010 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
15020 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
15030 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
15040 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
15050 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
15060 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
15070 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
15080 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52  eFileLock!=RESER
15090 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
150a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
150b0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
150c0 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20    /* This mutex 
150d0 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73  is needed becaus
150e0 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
150f0 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
15100 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
15110 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
15120 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
15130 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f  le->pInode;..  /
15140 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64  * If some thread
15150 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
15160 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61  has a lock via a
15170 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46   different unixF
15180 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65  ile*.  ** handle
15190 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20   that precludes 
151a0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
151b0 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e  ck, return BUSY.
151c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69  .  */.  if( (pFi
151d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70  le->eFileLock!=p
151e0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
151f0 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e   && .       (pIn
15200 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ode->eFileLock>=
15210 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20  PENDING_LOCK || 
15220 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
15230 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a  _LOCK)).     ){.
15240 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15250 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61  BUSY;.    goto a
15260 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  fp_end_lock;.  }
15270 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48  .  .  /* If a SH
15280 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71  ARED lock is req
15290 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65  uested, and some
152a0 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
152b0 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20  is PID already. 
152c0 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44   ** has a SHARED
152d0 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63   or RESERVED loc
152e0 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  k, then incremen
152f0 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  t reference coun
15300 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75  ts and.  ** retu
15310 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  rn SQLITE_OK..  
15320 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
15330 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
15340 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65  && .     (pInode
15350 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
15360 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
15370 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  de->eFileLock==R
15380 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b  ESERVED_LOCK) ){
15390 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69  .    assert( eFi
153a0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
153b0 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
153c0 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
153d0 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
153e0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
153f0 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70  hared>0 );.    p
15400 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
15410 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
15420 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
15430 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  ed++;.    pInode
15440 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67  ->nLock++;.    g
15450 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
15460 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20  ;.  }.    .  /* 
15470 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
15480 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
15490 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
154a0 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
154b0 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
154c0 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
154d0 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
154e0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
154f0 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
15500 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
15510 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
15520 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
15530 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65  .      || (eFile
15540 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
15550 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
15560 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47  FileLock<PENDING
15570 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
15580 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  int failed;.    
15590 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
155a0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
155b0 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
155c0 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b  ING_BYTE, 1, 1);
155d0 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29  .    if (failed)
155e0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61   {.      rc = fa
155f0 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f  iled;.      goto
15600 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
15610 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a     }.  }.  .  /*
15620 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73   If control gets
15630 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
15640 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f  then actually go
15650 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a   ahead and make.
15660 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73    ** operating s
15670 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20  ystem calls for 
15680 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f  the specified lo
15690 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ck..  */.  if( e
156a0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
156b0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74  _LOCK ){.    int
156c0 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63   lrc1, lrc2, lrc
156d0 31 45 72 72 6e 6f 3b 0a 20 20 20 20 6c 6f 6e 67  1Errno;.    long
156e0 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a   lk, mask;.    .
156f0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
15700 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
15710 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
15720 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
15730 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20  =0 );.        . 
15740 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f     mask = (sizeo
15750 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41  f(long)==8) ? LA
15760 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78  RGEST_INT64 : 0x
15770 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a  7fffffff;.    /*
15780 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
15790 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f  d-lock SHARED_LO
157a0 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74  CK */.    /* not
157b0 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69  e that the quali
157c0 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d  ty of the random
157d0 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74  ness doesn't mat
157e0 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f  ter that much */
157f0 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d  .    lk = random
15800 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d  (); .    pInode-
15810 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c  >sharedByte = (l
15820 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45  k & mask)%(SHARE
15830 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20  D_SIZE - 1);.   
15840 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f   lrc1 = afpSetLo
15850 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
15860 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
15870 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
15880 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
15890 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  dByte, 1, 1);.  
158a0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
158b0 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20  ROR(lrc1) ){.   
158c0 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70     lrc1Errno = p
158d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
158e0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72  .    }.    /* Dr
158f0 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
15900 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
15910 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53  .    lrc2 = afpS
15920 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15930 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
15940 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
15950 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28  0);.    .    if(
15960 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
15970 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 70  rc1) ) {.      p
15980 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
15990 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20  = lrc1Errno;.   
159a0 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20     rc = lrc1;.  
159b0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
159c0 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73  _lock;.    } els
159d0 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52  e if( IS_LOCK_ER
159e0 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20  ROR(lrc2) ){.   
159f0 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20     rc = lrc2;.  
15a00 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
15a10 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73  _lock;.    } els
15a20 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51  e if( lrc1 != SQ
15a30 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20  LITE_OK ) {.    
15a40 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20    rc = lrc1;.   
15a50 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
15a60 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15a70 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
15a80 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
15a90 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
15aa0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
15ab0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
15ac0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
15ad0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
15ae0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
15af0 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
15b00 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
15b10 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
15b20 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
15b30 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
15b40 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73   ** same process
15b50 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e   is still holdin
15b60 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  g a shared lock.
15b70 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
15b80 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73  ITE_BUSY;.  }els
15b90 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
15ba0 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20  quest was for a 
15bb0 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
15bc0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20  USIVE lock.  It 
15bd0 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65  is.    ** assume
15be0 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  d that there is 
15bf0 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61  a SHARED or grea
15c00 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
15c10 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65  file.    ** alre
15c20 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
15c30 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a  int failed = 0;.
15c40 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70      assert( 0!=p
15c50 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
15c60 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c 65  );.    if (eFile
15c70 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45 44  Lock >= RESERVED
15c80 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
15c90 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45  eFileLock < RESE
15ca0 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  RVED_LOCK) {.   
15cb0 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
15cc0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
15cd0 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
15ce0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
15cf0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
15d00 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
15d10 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20  BYTE, 1,1);.    
15d20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20 29 7b    if( !failed ){
15d30 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
15d40 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a  ->reserved = 1;.
15d50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15d60 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26    if (!failed &&
15d70 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58   eFileLock == EX
15d80 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a  CLUSIVE_LOCK) {.
15d90 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
15da0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
15db0 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20  ck */.        . 
15dc0 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
15dd0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62  he shared lock b
15de0 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65  efore trying the
15df0 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e   range.  we'll n
15e00 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  eed to .      **
15e10 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65   reestablish the
15e20 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20   shared lock if 
15e30 77 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65  we can't get the
15e40 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20    afpUnlock.    
15e50 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
15e60 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74  (failed = afpSet
15e70 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
15e80 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
15e90 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20  RED_FIRST +.    
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15eb0 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61       pInode->sha
15ec0 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20  redByte, 1, 0)) 
15ed0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  ){.        int f
15ee0 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f  ailed2 = SQLITE_
15ef0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e  OK;.        /* n
15f00 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67  ow attemmpt to g
15f10 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
15f20 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20   lock range */. 
15f30 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
15f40 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
15f50 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
15f60 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
15f70 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
15f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f90 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29   SHARED_SIZE, 1)
15fa0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 61  ;.        if( fa
15fb0 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64 32  iled && (failed2
15fc0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
15fd0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
15fe0 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20  File, .         
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
16000 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49 6e  ARED_FIRST + pIn
16010 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c  ode->sharedByte,
16020 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20   1, 1)) ){.     
16030 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65       /* Can't re
16040 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
16050 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69  ared lock.  Sqli
16060 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74  te can't deal, t
16070 68 69 73 20 69 73 0a 20 20 20 20 20 20 20 20 20  his is.         
16080 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49   ** a critical I
16090 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20  /O error.       
160a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
160b0 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20  rc = ((failed & 
160c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
160d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f   SQLITE_IOERR) ?
160e0 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20   failed2 : .    
160f0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
16100 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
16110 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70          goto afp
16120 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20  _end_lock;.     
16130 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73     } .      }els
16140 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
16150 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d  failed; .      }
16160 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
16170 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72  ailed ){.      r
16180 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  c = failed;.    
16190 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72  }.  }.  .  if( r
161a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
161b0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
161c0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
161d0 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
161e0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
161f0 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ock;.  }else if(
16200 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
16210 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
16220 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
16230 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
16240 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  K;.    pInode->e
16250 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
16260 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a  NG_LOCK;.  }.  .
16270 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  afp_end_lock:.  
16280 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
16290 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
162a0 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
162b0 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
162c0 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46  h, azFileLock(eF
162d0 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20  ileLock), .     
162e0 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
162f0 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
16300 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ed"));.  return 
16310 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
16320 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
16330 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
16340 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
16350 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
16360 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
16370 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
16380 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
16390 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
163a0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
163b0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
163c0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
163d0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
163e0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
163f0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
16400 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
16410 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
16420 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   afpUnlock(sqlit
16430 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
16440 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
16450 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16460 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
16470 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
16480 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
16490 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
164a0 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
164b0 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
164c0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
164d0 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
164e0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
164f0 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 30  t skipShared = 0
16500 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
16510 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20 70  TEST.  int h = p
16520 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a  File->h;.#endif.
16530 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
16540 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
16550 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
16560 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d  s %d(%d,%d) pid=
16570 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
16580 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
16590 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
165a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  le->eFileLock, p
165b0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
165c0 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
165d0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
165e0 0a 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70  .           getp
165f0 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65 72  id()));..  asser
16600 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
16610 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
16620 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
16630 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock<=eFileLock )
16640 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
16650 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
16660 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
16670 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
16680 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
16690 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
166a0 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  red!=0 );.  if( 
166b0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
166c0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
166d0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
166e0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70  de->eFileLock==p
166f0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
16700 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
16710 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
16720 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
16730 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
16740 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
16750 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
16760 20 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47   .#ifndef NDEBUG
16770 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
16780 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
16790 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
167a0 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
167b0 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
167c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
167d0 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
167e0 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
167f0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
16800 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
16810 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
16820 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
16830 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
16840 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
16850 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
16860 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
16870 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
16880 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
16890 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
168a0 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
168b0 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
168c0 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
168d0 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
168e0 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
168f0 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
16900 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
16910 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
16920 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
16930 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
16940 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
16950 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
16960 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  Write==0.       
16970 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62      || pFile->db
16980 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20  Update==0.      
16990 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74       || pFile->t
169a0 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20  ransCntrChng==1 
169b0 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  );.    pFile->in
169c0 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
169d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20  .#endif.    .   
169e0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
169f0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
16a00 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
16a10 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
16a20 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
16a30 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
16a40 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  RST, SHARED_SIZE
16a50 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
16a60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
16a70 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
16a80 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
16a90 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20 29  de->nShared>1) )
16aa0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c  {.        /* onl
16ab0 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74  y re-establish t
16ac0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
16ad0 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
16ae0 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72 65         int share
16af0 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52  dLockByte = SHAR
16b00 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
16b10 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
16b20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
16b30 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
16b40 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61  Path, pFile, sha
16b50 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
16b60 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  1);.      } else
16b70 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70 53   {.        skipS
16b80 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  hared = 1;.     
16b90 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
16ba0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
16bb0 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
16bc0 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
16bd0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
16be0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
16bf0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16c00 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
16c10 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20  1, 0);.    } .  
16c20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16c30 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  _OK && pFile->eF
16c40 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ileLock>=RESERVE
16c50 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78  D_LOCK && contex
16c60 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20  t->reserved ){. 
16c70 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
16c80 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
16c90 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
16ca0 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
16cb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 63  );.      if( !rc
16cc0 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f 6e   ){ .        con
16cd0 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
16ce0 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20   0; .      }.   
16cf0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
16d00 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69  QLITE_OK && (eFi
16d10 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
16d20 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e  OCK || pInode->n
16d30 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20 20  Shared>1)){.    
16d40 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
16d50 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
16d60 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
16d70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16d80 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e   && eFileLock==N
16d90 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f  O_LOCK ){..    /
16da0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
16db0 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e  shared lock coun
16dc0 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68  ter.  Release th
16dd0 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a  e lock using an.
16de0 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f      ** OS call o
16df0 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72  nly when all thr
16e00 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d  eads in this sam
16e10 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72  e process have r
16e20 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74  eleased.    ** t
16e30 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a  he lock..    */.
16e40 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e      unsigned lon
16e50 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63  g long sharedLoc
16e60 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
16e70 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
16e80 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49 6e  redByte;.    pIn
16e90 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
16ea0 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
16eb0 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
16ec0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
16ed0 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
16ee0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
16ef0 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
16f00 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
16f10 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
16f20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53 68 61      if( !skipSha
16f30 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  red ){.        r
16f40 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
16f50 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
16f60 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
16f70 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20  kByte, 1, 0);.  
16f80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16f90 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !rc ){.        p
16fa0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
16fb0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
16fc0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
16fd0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
16fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16ff0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17000 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  _OK ){.      pIn
17010 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
17020 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
17030 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  de->nLock>=0 );.
17040 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
17050 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  ->nLock==0 ){.  
17060 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
17070 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
17080 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17090 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
170a0 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
170b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
170c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
170d0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
170e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
170f0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20   Close a file & 
17100 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63  cleanup AFP spec
17110 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e  ific locking con
17120 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20  text .*/.static 
17130 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c  int afpClose(sql
17140 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
17150 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17160 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20  TE_OK;.  if( id 
17170 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
17180 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
17190 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55  le*)id;.    afpU
171a0 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
171b0 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65  K);.    unixEnte
171c0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66  rMutex();.    if
171d0 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  ( pFile->pInode 
171e0 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  && pFile->pInode
171f0 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  ->nLock ){.     
17200 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
17210 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
17220 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
17230 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
17240 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a  le just.      **
17250 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
17260 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
17270 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
17280 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
17290 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
172a0 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
172b0 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77  >aPending.  It w
172c0 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
172d0 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e  ally closed when
172e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  .      ** the la
172f0 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
17300 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
17310 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
17320 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
17330 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
17340 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 73  fo(pFile);.    s
17350 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
17360 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
17370 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f  t);.    rc = clo
17380 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
17390 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
173a0 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ex();.  }.  retu
173b0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
173c0 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
173d0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
173e0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
173f0 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  STYLE */./*.** T
17400 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73  he code above is
17410 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
17420 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54  plementation.  T
17430 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69  he code is speci
17440 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58  fic.** to MacOSX
17450 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f   and does not wo
17460 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78  rk on other unix
17470 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20   platforms.  No 
17480 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69  alternative.** i
17490 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66  s available.  If
174a0 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69   you don't compi
174b0 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68  le for a mac, th
174c0 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70  en the "unix-afp
174d0 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20  ".** VFS is not 
174e0 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
174f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17500 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41  *** End of the A
17510 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FP lock implemen
17520 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
17530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
17540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
17590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
175a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
175b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
175c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
175d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
175e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
175f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
17600 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a   NFS Locking ***
17610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
17630 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
17640 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
17650 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
17660 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77  STYLE./*. ** Low
17670 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
17680 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
17690 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
176a0 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
176b0 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20  leLock. ** must 
176c0 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
176d0 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
176e0 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65  .. **. ** If the
176f0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
17700 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
17710 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
17720 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a   at or below. **
17730 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
17740 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
17750 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
17760 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69  no-op.. */.stati
17770 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28  c int nfsUnlock(
17780 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
17790 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
177a0 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78  {.  return posix
177b0 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
177c0 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e  Lock, 1);.}..#en
177d0 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
177e0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
177f0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
17800 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
17810 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65  * The code above
17820 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b   is the NFS lock
17830 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
17840 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70    The code is sp
17850 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63  ecific.** to Mac
17860 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  OSX and does not
17870 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75   work on other u
17880 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  nix platforms.  
17890 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  No alternative.*
178a0 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  * is available. 
178b0 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   .**.***********
178c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
178d0 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69  f the NFS lock i
178e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
178f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17900 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
17910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17950 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
17960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179a0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
179b0 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69  ****** Non-locki
179c0 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ng sqlite3_file 
179d0 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
179e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179f0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
17a00 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f  next division co
17a10 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74  ntains implement
17a20 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d  ations for all m
17a30 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a  ethods of the .*
17a40 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f  * sqlite3_file o
17a50 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e  bject other than
17a60 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   the locking met
17a70 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69  hods.  The locki
17a80 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65  ng.** methods we
17a90 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69  re defined in di
17aa0 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f  visions above (o
17ab0 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  ne locking metho
17ac0 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f  d per.** divisio
17ad0 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f  n).  Those metho
17ae0 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d  ds that are comm
17af0 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
17b00 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67  g modes.** are g
17b10 61 74 68 65 72 20 74 6f 67 65 74 68 65 72 20 69  ather together i
17b20 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f  nto this divisio
17b30 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  n..*/../*.** See
17b40 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  k to the offset 
17b50 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
17b60 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74  cond argument, t
17b70 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a  hen read cnt .**
17b80 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66   bytes into pBuf
17b90 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  . Return the num
17ba0 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
17bb0 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a  ually read..**.*
17bc0 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65  * NB:  If you de
17bd0 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f  fine USE_PREAD o
17be0 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74  r USE_PREAD64, t
17bf0 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73  hen it might als
17c00 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72  o.** be necessar
17c10 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50  y to define _XOP
17c20 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20  EN_SOURCE to be 
17c30 35 30 30 2e 20 20 54 68 69 73 20 76 61 72 69 65  500.  This varie
17c40 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79  s from.** one sy
17c50 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e  stem to another.
17c60 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64    Since SQLite d
17c70 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55  oes not define U
17c80 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20  SE_PREAD.** any 
17c90 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61  any form by defa
17ca0 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74  ult, we will not
17cb0 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69   attempt to defi
17cc0 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
17cd0 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73  ..** See tickets
17ce0 20 23 32 37 34 31 20 61 6e 64 20 23 32 36 38 31   #2741 and #2681
17cf0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
17d00 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72   stomping the er
17d10 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66  rno value on a f
17d20 61 69 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c  ailed read the l
17d30 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
17d40 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
17d50 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
17d60 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
17d70 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69  Read(unixFile *i
17d80 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
17d90 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70   offset, void *p
17da0 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
17db0 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28 21   int got;.#if (!
17dc0 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
17dd0 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55  D) && !defined(U
17de0 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69  SE_PREAD64)).  i
17df0 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65  64 newOffset;.#e
17e00 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41  ndif.  TIMER_STA
17e10 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  RT;.#if defined(
17e20 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b  USE_PREAD).  do{
17e30 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69   got = osPread(i
17e40 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
17e50 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65   offset); }while
17e60 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
17e70 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 53 69 6d  ==EINTR );.  Sim
17e80 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
17e90 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20  t = -1 );.#elif 
17ea0 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
17eb0 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d  D64).  do{ got =
17ec0 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e 68   osPread64(id->h
17ed0 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
17ee0 73 65 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f  set); }while( go
17ef0 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  t<0 && errno==EI
17f00 4e 54 52 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  NTR);.  Simulate
17f10 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d  IOError( got = -
17f20 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77  1 );.#else.  new
17f30 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69  Offset = lseek(i
17f40 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45  d->h, offset, SE
17f50 45 4b 5f 53 45 54 29 3b 0a 20 20 53 69 6d 75 6c  EK_SET);.  Simul
17f60 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f  ateIOError( newO
17f70 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 69 66 28  ffset-- );.  if(
17f80 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73   newOffset!=offs
17f90 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65  et ){.    if( ne
17fa0 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b  wOffset == -1 ){
17fb0 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
17fc0 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
17fd0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d  o = errno;.    }
17fe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 28 28 75 6e  else{.      ((un
17ff0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
18000 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20  tErrno = 0;.... 
18010 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
18020 2d 31 3b 0a 20 20 7d 0a 20 20 64 6f 7b 20 67 6f  -1;.  }.  do{ go
18030 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d 3e 68  t = osRead(id->h
18040 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 20 7d 77  , pBuf, cnt); }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 23  rrno==EINTR );.#
18070 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e  endif.  TIMER_EN
18080 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29  D;.  if( got<0 )
18090 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
180a0 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
180b0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20   = errno;.  }.  
180c0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 20  OSTRACE(("READ  
180d0 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
180e0 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c   %llu\n", id->h,
180f0 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49   got, offset, TI
18100 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
18110 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a   return got;.}..
18120 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20  /*.** Read data 
18130 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f  from a file into
18140 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75   a buffer.  Retu
18150 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
18160 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72  all.** bytes wer
18170 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  e read successfu
18180 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  lly and SQLITE_I
18190 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67  OERR if anything
181a0 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a   goes.** wrong..
181b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
181c0 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  ixRead(.  sqlite
181d0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76  3_file *id, .  v
181e0 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e  oid *pBuf, .  in
181f0 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33  t amt,.  sqlite3
18200 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b  _int64 offset.){
18210 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
18220 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
18230 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  )id;.  int got;.
18240 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
18250 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
18260 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
18270 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
18280 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
18290 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
182a0 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
182b0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
182c0 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
182d0 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
182e0 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
182f0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55  ssert( pFile->pU
18300 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  nused==0.       
18310 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49  || offset>=PENDI
18320 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20  NG_BYTE+512.    
18330 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74     || offset+amt
18340 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a  <=PENDING_BYTE .
18350 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 67    );.#endif..  g
18360 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  ot = seekAndRead
18370 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
18380 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66  pBuf, amt);.  if
18390 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20  ( got==amt ){.  
183a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
183b0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
183c0 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  got<0 ){.    /* 
183d0 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
183e0 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
183f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18400 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
18410 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
18420 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
18430 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d   /* not a system
18440 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a   error */.    /*
18450 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66   Unread parts of
18460 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74   the buffer must
18470 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20   be zero-filled 
18480 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28  */.    memset(&(
18490 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74  (char*)pBuf)[got
184a0 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a  ], 0, amt-got);.
184b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
184c0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
184d0 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  AD;.  }.}../*.**
184e0 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66   Seek to the off
184f0 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65  set in id->offse
18500 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20  t then read cnt 
18510 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
18520 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
18530 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
18540 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55  ctually read.  U
18550 70 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74  pdate the offset
18560 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
18570 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72   stomping the er
18580 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66  rno value on a f
18590 61 69 6c 65 64 20 77 72 69 74 65 20 74 68 65 20  ailed write the 
185a0 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a  lastErrno value.
185b0 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65  ** is set before
185c0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
185d0 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
185e0 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20  dWrite(unixFile 
185f0 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *id, i64 offset,
18600 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
18610 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
18620 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65  nt got;.#if (!de
18630 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
18640 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45   && !defined(USE
18650 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34  _PREAD64)).  i64
18660 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64   newOffset;.#end
18670 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  if.  TIMER_START
18680 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ;.#if defined(US
18690 45 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 67  E_PREAD).  do{ g
186a0 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 28 69 64  ot = osPwrite(id
186b0 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
186c0 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65 28  offset); }while(
186d0 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d   got<0 && errno=
186e0 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20  =EINTR );.#elif 
186f0 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
18700 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d  D64).  do{ got =
18710 20 6f 73 50 77 72 69 74 65 36 34 28 69 64 2d 3e   osPwrite64(id->
18720 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
18730 66 73 65 74 29 3b 7d 77 68 69 6c 65 28 20 67 6f  fset);}while( go
18740 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  t<0 && errno==EI
18750 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65  NTR);.#else.  ne
18760 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28  wOffset = lseek(
18770 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53  id->h, offset, S
18780 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53 69 6d 75  EEK_SET);.  Simu
18790 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77  lateIOError( new
187a0 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 69 66  Offset-- );.  if
187b0 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66  ( newOffset!=off
187c0 73 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  set ){.    if( n
187d0 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29  ewOffset == -1 )
187e0 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
187f0 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
18800 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
18810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 28 28 75  }else{.      ((u
18820 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
18830 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a  stErrno = 0;....
18840 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
18850 20 2d 31 3b 0a 20 20 7d 0a 20 20 64 6f 7b 20 67   -1;.  }.  do{ g
18860 6f 74 20 3d 20 6f 73 57 72 69 74 65 28 69 64 2d  ot = osWrite(id-
18870 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 20  >h, pBuf, cnt); 
18880 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
18890 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
188a0 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
188b0 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30  END;.  if( got<0
188c0 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
188d0 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
188e0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a  no = errno;.  }.
188f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
18900 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  TE   %-3d %5d %7
18910 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d  lld %llu\n", id-
18920 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c  >h, got, offset,
18930 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
18940 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a  ;.  return got;.
18950 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
18960 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
18970 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20  er into a file. 
18980 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
18990 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
189a0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
189b0 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c  ror code on fail
189c0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
189d0 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20  nt unixWrite(.  
189e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
189f0 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  , .  const void 
18a00 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d  *pBuf, .  int am
18a10 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  t,.  sqlite3_int
18a20 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20  64 offset .){.  
18a30 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
18a40 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
18a50 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30  .  int wrote = 0
18a60 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
18a70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e  ;.  assert( amt>
18a80 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
18a90 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65  is is a database
18aa0 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
18ab0 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75  rnal, master-jou
18ac0 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a  rnal or temp.  *
18ad0 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74  * file), the byt
18ae0 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  es in the lockin
18af0 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e  g range should n
18b00 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20  ever be read or 
18b10 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20  written. */.#if 
18b20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  0.  assert( pFil
18b30 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20  e->pUnused==0.  
18b40 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d       || offset>=
18b50 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32  PENDING_BYTE+512
18b60 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
18b70 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  t+amt<=PENDING_B
18b80 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66  YTE .  );.#endif
18b90 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
18ba0 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
18bb0 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77  doing a normal w
18bc0 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61  rite to a databa
18bd0 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f  se file (as oppo
18be0 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e  sed to.  ** doin
18bf0 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
18c00 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72  rollback or a wr
18c10 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65  ite to some file
18c20 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20   other than a.  
18c30 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61  ** normal databa
18c40 73 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65  se file) then re
18c50 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
18c60 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  at the database.
18c70 20 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64    ** has changed
18c80 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  .  If the transa
18c90 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73  ction counter is
18ca0 20 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72   modified, recor
18cb0 64 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74  d that.  ** fact
18cc0 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   too..  */.  if(
18cd0 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
18ce0 57 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69  Write ){.    pFi
18cf0 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31  le->dbUpdate = 1
18d00 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  ;  /* The databa
18d10 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  se has been modi
18d20 66 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  fied */.    if( 
18d30 6f 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66  offset<=24 && of
18d40 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a  fset+amt>=27 ){.
18d50 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
18d60 20 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72      char oldCntr
18d70 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  [4];.      Simul
18d80 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
18d90 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  (1);.      rc = 
18da0 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c  seekAndRead(pFil
18db0 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20  e, 24, oldCntr, 
18dc0 34 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  4);.      Simula
18dd0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
18de0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
18df0 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c  !=4 || memcmp(ol
18e00 64 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29  dCntr, &((char*)
18e10 70 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d  pBuf)[24-offset]
18e20 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 4)!=0 ){.     
18e30 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
18e40 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a  ntrChng = 1;  /*
18e50 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
18e60 20 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61   counter has cha
18e70 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  nged */.      }.
18e80 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
18e90 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30  ..  while( amt>0
18ea0 20 26 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65   && (wrote = see
18eb0 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c  kAndWrite(pFile,
18ec0 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
18ed0 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d  mt))>0 ){.    am
18ee0 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20  t -= wrote;.    
18ef0 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b  offset += wrote;
18f00 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63  .    pBuf = &((c
18f10 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65  har*)pBuf)[wrote
18f20 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74  ];.  }.  Simulat
18f30 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65  eIOError(( wrote
18f40 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b  =(-1), amt=1 ));
18f50 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
18f60 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65  ullError(( wrote
18f70 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20  =0, amt=1 ));.. 
18f80 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20   if( amt>0 ){.  
18f90 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26    if( wrote<0 &&
18fa0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
18fb0 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20  o!=ENOSPC ){.   
18fc0 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
18fd0 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72  set by seekAndWr
18fe0 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ite */.      ret
18ff0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
19000 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  _WRITE;.    }els
19010 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
19020 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f  lastErrno = 0; /
19030 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65  * not a system e
19040 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65  rror */.      re
19050 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
19060 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
19070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19080 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
19090 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
190a0 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
190b0 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
190c0 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
190d0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
190e0 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
190f0 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
19100 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20  re occurring at 
19110 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e  the right times.
19120 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
19130 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
19140 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  int sqlite3_full
19150 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
19160 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
19170 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79   do not trust sy
19180 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65  stems to provide
19190 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61   a working fdata
191a0 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f  sync().  Some do
191b0 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e  ..** Others do n
191c0 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20  o.  To be safe, 
191d0 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69  we will stick wi
191e0 74 68 20 74 68 65 20 28 73 6c 6f 77 65 72 29 20  th the (slower) 
191f0 66 73 79 6e 63 28 29 2e 0a 2a 2a 20 49 66 20 79  fsync()..** If y
19200 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75  ou know that you
19210 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75  r system does su
19220 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28  pport fdatasync(
19230 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20  ) correctly,.** 
19240 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70  then simply comp
19250 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61  ile with -Dfdata
19260 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a  sync=fdatasync.*
19270 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66  /.#if !defined(f
19280 64 61 74 61 73 79 6e 63 29 20 26 26 20 21 64 65  datasync) && !de
19290 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
192a0 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73  .# define fdatas
192b0 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66  ync fsync.#endif
192c0 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48  ../*.** Define H
192d0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f  AVE_FULLFSYNC to
192e0 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e   0 or 1 dependin
192f0 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
19300 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c  not.** the F_FUL
19310 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20  LFSYNC macro is 
19320 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c  defined.  F_FULL
19330 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74  FSYNC is current
19340 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c  ly.** only avail
19350 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58  able on Mac OS X
19360 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c  .  But that coul
19370 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66  d change..*/.#if
19380 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a  def F_FULLFSYNC.
19390 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
193a0 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a  LLFSYNC 1.#else.
193b0 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
193c0 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66  LLFSYNC 0.#endif
193d0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79  .../*.** The fsy
193e0 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  nc() system call
193f0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61   does not work a
19400 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20  s advertised on 
19410 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73  many.** unix sys
19420 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  tems.  The follo
19430 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69  wing procedure i
19440 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
19450 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20  make.** it work 
19460 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  better..**.** Th
19470 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
19480 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20   macro disables 
19490 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54  all fsync()s.  T
194a0 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a  his is useful.**
194b0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65   for testing whe
194c0 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e  n we want to run
194d0 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73   through the tes
194e0 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e  t suite quickly.
194f0 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f  .** You are stro
19500 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f  ngly advised *no
19510 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74  t* to deploy wit
19520 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
19530 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77  .** enabled, how
19540 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68  ever, since with
19550 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
19560 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63  enabled, an OS c
19570 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  rash.** or power
19580 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69   failure will li
19590 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  kely corrupt the
195a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
195b0 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74  **.** SQLite set
195c0 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  s the dataOnly f
195d0 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20  lag if the size 
195e0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  of the file is u
195f0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65  nchanged..** The
19600 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74   idea behind dat
19610 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74  aOnly is that it
19620 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69   should only wri
19630 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  te the file cont
19640 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20  ent.** to disk, 
19650 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20  not the inode.  
19660 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61  We only set data
19670 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65  Only if the file
19680 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63   size is .** unc
19690 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65  hanged since the
196a0 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61   file size is pa
196b0 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e  rt of the inode.
196c0 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54    However, .** T
196d0 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73  ed Ts'o tells us
196e0 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
196f0 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74  ) will also writ
19700 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74  e the inode if t
19710 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  he.** file size 
19720 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68  has changed.  Th
19730 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66  e only real diff
19740 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66  erence between f
19750 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e  datasync().** an
19760 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74  d fsync(), Ted t
19770 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74  ells us, is that
19780 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
19790 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a  l not flush the.
197a0 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20  ** inode if the 
197b0 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f  mtime or owner o
197c0 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74  r other inode at
197d0 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68  tributes have ch
197e0 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c  anged..** We onl
197f0 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  y care about the
19800 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20   file size, not 
19810 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61  the other file a
19820 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a  ttributes, so.**
19830 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74   as far as SQLit
19840 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20  e is concerned, 
19850 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  an fdatasync() i
19860 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74  s always adequat
19870 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77  e..** So, we alw
19880 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e  ays use fdatasyn
19890 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61  c() if it is ava
198a0 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65  ilable, regardle
198b0 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c  ss of.** the val
198c0 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e  ue of the dataOn
198d0 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74  ly flag..*/.stat
198e0 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  ic int full_fsyn
198f0 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75  c(int fd, int fu
19900 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61  llSync, int data
19910 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Only){.  int rc;
19920 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
19930 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66  wing "ifdef/elif
19940 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61  /else/" block ha
19950 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63  s the same struc
19960 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  ture as.  ** the
19970 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69   one below. It i
19980 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72  s replicated her
19990 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69  e solely to avoi
199a0 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20  d cluttering .  
199b0 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63  ** up the real c
199c0 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55  ode with the UNU
199d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20  SED_PARAMETER() 
199e0 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66  macros..  */.#if
199f0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
19a00 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
19a10 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55  METER(fd);.  UNU
19a20 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
19a30 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
19a40 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
19a50 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56  Only);.#elif HAV
19a60 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e  E_FULLFSYNC.  UN
19a70 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
19a80 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a  ataOnly);.#else.
19a90 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
19aa0 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
19ab0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19ac0 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64  (dataOnly);.#end
19ad0 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  if..  /* Record 
19ae0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
19af0 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
19b00 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
19b10 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
19b20 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
19b30 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
19b40 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
19b50 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
19b60 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
19b70 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
19b80 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
19b90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
19ba0 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
19bb0 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
19bc0 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
19bd0 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
19be0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
19bf0 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
19c00 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
19c10 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
19c20 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
19c30 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
19c40 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
19c50 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20  _NO_SYNC.  rc = 
19c60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66  SQLITE_OK;.#elif
19c70 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a   HAVE_FULLFSYNC.
19c80 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
19c90 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e  {.    rc = osFcn
19ca0 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59  tl(fd, F_FULLFSY
19cb0 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  NC, 0);.  }else{
19cc0 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
19cd0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c  .  /* If the FUL
19ce0 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66  LFSYNC failed, f
19cf0 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65  all back to atte
19d00 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28  mpting an fsync(
19d10 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c  )..  ** It shoul
19d20 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65  dn't be possible
19d30 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74   for fullfsync t
19d40 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f  o fail on the lo
19d50 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73  cal .  ** file s
19d60 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20  ystem (on OSX), 
19d70 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63  so failure indic
19d80 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53  ates that FULLFS
19d90 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73  YNC.  ** isn't s
19da0 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69  upported for thi
19db0 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53  s file system. S
19dc0 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73  o, attempt an fs
19dd0 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66  ync .  ** and (f
19de0 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74  or now) ignore t
19df0 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61  he overhead of a
19e00 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e   superfluous fcn
19e10 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20  tl call.  .  ** 
19e20 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74  It'd be better t
19e30 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79  o detect fullfsy
19e40 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20  nc support once 
19e50 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20  and avoid .  ** 
19e60 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65  the fcntl call e
19e70 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69  very time sync i
19e80 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20  s called..  */. 
19e90 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66   if( rc ) rc = f
19ea0 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66  sync(fd);..#elif
19eb0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
19ec0 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79  __).  /* fdatasy
19ed0 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65  nc() on HFS+ doe
19ee0 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20 74  sn't yet flush t
19ef0 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20  he file size if 
19f00 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65  it changed corre
19f10 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72  ctly.  ** so cur
19f20 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c  rently we defaul
19f30 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74  t to the macro t
19f40 68 61 74 20 72 65 64 65 66 69 6e 65 73 20 66 64  hat redefines fd
19f50 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63  atasync to fsync
19f60 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79  .  */.  rc = fsy
19f70 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20  nc(fd);.#else . 
19f80 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28   rc = fdatasync(
19f90 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  fd);.#if OS_VXWO
19fa0 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31  RKS.  if( rc==-1
19fb0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53   && errno==ENOTS
19fc0 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  UP ){.    rc = f
19fd0 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65  sync(fd);.  }.#e
19fe0 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
19ff0 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  KS */.#endif /* 
1a000 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
1a010 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46  SYNC elif HAVE_F
1a020 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69  ULLFSYNC */..  i
1a030 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26  f( OS_VXWORKS &&
1a040 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20   rc!= -1 ){.    
1a050 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  rc = 0;.  }.  re
1a060 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1a070 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
1a080 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74  writes to a part
1a090 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20  icular file are 
1a0a0 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73  committed to dis
1a0b0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61  k..**.** If data
1a0c0 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74  Only==0 then bot
1a0d0 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c  h the file itsel
1a0e0 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61  f and its metada
1a0f0 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65  ta (file.** size
1a100 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65  , access time, e
1a110 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20  tc) are synced. 
1a120 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20   If dataOnly!=0 
1a130 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  then only the.**
1a140 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79   file data is sy
1a150 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65  nced..**.** Unde
1a160 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b  r Unix, also mak
1a170 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
1a180 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20  directory entry 
1a190 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20  for the file.** 
1a1a0 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
1a1b0 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68   by fsync-ing th
1a1c0 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
1a1d0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69   contains the fi
1a1e0 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20  le..** If we do 
1a1f0 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20  not do this and 
1a200 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70  we encounter a p
1a210 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
1a220 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65  e directory.** e
1a230 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75  ntry for the jou
1a240 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65  rnal might not e
1a250 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65  xist after we re
1a260 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a  boot.  The next.
1a270 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63  ** SQLite to acc
1a280 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c  ess the file wil
1a290 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20  l not know that 
1a2a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  the journal exis
1a2b0 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ts (because.** t
1a2c0 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74  he directory ent
1a2d0 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
1a2e0 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65  al was never cre
1a2f0 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72  ated) and the tr
1a300 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c  ansaction.** wil
1a310 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20  l not roll back 
1a320 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69  - possibly leadi
1a330 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ng to database c
1a340 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
1a350 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e  atic int unixSyn
1a360 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
1a370 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  id, int flags){.
1a380 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78    int rc;.  unix
1a390 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1a3a0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
1a3b0 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d  int isDataOnly =
1a3c0 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53   (flags&SQLITE_S
1a3d0 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20  YNC_DATAONLY);. 
1a3e0 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20   int isFullsync 
1a3f0 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  = (flags&0x0F)==
1a400 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1a410 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
1a420 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  at one of SQLITE
1a430 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20  _SYNC_NORMAL or 
1a440 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20  FULL was passed 
1a450 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61  */.  assert((fla
1a460 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
1a470 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20  _SYNC_NORMAL.   
1a480 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30     || (flags&0x0
1a490 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
1a4a0 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  FULL.  );..  /* 
1a4b0 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74  Unix cannot, but
1a4c0 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61   some systems ma
1a4d0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
1a4e0 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20  FULL from here. 
1a4f0 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69  This.  ** line i
1a500 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64  s to test that d
1a510 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74  oing so does not
1a520 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
1a530 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ems..  */.  Simu
1a540 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
1a550 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1a560 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65  _FULL );..  asse
1a570 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
1a580 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 20 20  STRACE(("SYNC   
1a590 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d   %-3d\n", pFile-
1a5a0 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c  >h));.  rc = ful
1a5b0 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68  l_fsync(pFile->h
1a5c0 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73  , isFullsync, is
1a5d0 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d  DataOnly);.  Sim
1a5e0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
1a5f0 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29  =1 );.  if( rc )
1a600 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
1a610 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1a620 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1a630 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1a640 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c  OERR_FSYNC, "ful
1a650 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d  l_fsync", pFile-
1a660 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 69  >zPath);.  }.  i
1a670 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e  f( pFile->dirfd>
1a680 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  =0 ){.    OSTRAC
1a690 45 28 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64  E(("DIRSYNC %-3d
1a6a0 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63   (have_fullfsync
1a6b0 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29  =%d fullsync=%d)
1a6c0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66  \n", pFile->dirf
1a6d0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48  d,.            H
1a6e0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69  AVE_FULLFSYNC, i
1a6f0 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 23 69 66  sFullsync));.#if
1a700 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
1a710 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 20 20  BLE_DIRSYNC.    
1a720 2f 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79  /* The directory
1a730 20 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74   sync is only at
1a740 74 65 6d 70 74 65 64 20 69 66 20 66 75 6c 6c 5f  tempted if full_
1a750 66 73 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20  fsync is.    ** 
1a760 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e  turned off or un
1a770 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 61  available.  If a
1a780 20 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75   full_fsync occu
1a790 72 72 65 64 20 61 62 6f 76 65 2c 0a 20 20 20 20  rred above,.    
1a7a0 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 69 72 65  ** then the dire
1a7b0 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 73 75  ctory sync is su
1a7c0 70 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a  perfluous..    *
1a7d0 2f 0a 20 20 20 20 69 66 28 20 28 21 48 41 56 45  /.    if( (!HAVE
1a7e0 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 69  _FULLFSYNC || !i
1a7f0 73 46 75 6c 6c 73 79 6e 63 29 20 26 26 20 66 75  sFullsync) && fu
1a800 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e  ll_fsync(pFile->
1a810 64 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20  dirfd,0,0) ){.  
1a820 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a       /*.       *
1a830 2a 20 57 65 20 68 61 76 65 20 72 65 63 65 69 76  * We have receiv
1a840 65 64 20 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f  ed multiple repo
1a850 72 74 73 20 6f 66 20 66 73 79 6e 63 28 29 20 72  rts of fsync() r
1a860 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20  eturning.       
1a870 2a 2a 20 65 72 72 6f 72 73 20 77 68 65 6e 20 61  ** errors when a
1a880 70 70 6c 69 65 64 20 74 6f 20 64 69 72 65 63 74  pplied to direct
1a890 6f 72 69 65 73 20 6f 6e 20 63 65 72 74 61 69 6e  ories on certain
1a8a0 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20   file systems.. 
1a8b0 20 20 20 20 20 20 2a 2a 20 41 20 66 61 69 6c 65        ** A faile
1a8c0 64 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  d directory sync
1a8d0 20 69 73 20 6e 6f 74 20 61 20 62 69 67 20 64 65   is not a big de
1a8e0 61 6c 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73  al.  So it seems
1a8f0 0a 20 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65  .       ** bette
1a900 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  r to ignore the 
1a910 65 72 72 6f 72 2e 20 20 54 69 63 6b 65 74 20 23  error.  Ticket #
1a920 31 36 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20  1657.       */. 
1a930 20 20 20 20 20 20 2f 2a 20 70 46 69 6c 65 2d 3e        /* pFile->
1a940 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1a950 6f 3b 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20  o; */.       /* 
1a960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a970 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23 65  ERR; */.    }.#e
1a980 6e 64 69 66 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79  ndif.    /* Only
1a990 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e   need to sync on
1a9a0 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68 65  ce, so close the
1a9b0 20 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 6e    directory when
1a9c0 20 77 65 20 61 72 65 20 64 6f 6e 65 20 2a 2f 0a   we are done */.
1a9d0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
1a9e0 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 64  (pFile, pFile->d
1a9f0 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  irfd, __LINE__);
1aa00 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66  .    pFile->dirf
1aa10 64 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  d = -1;.  }.  re
1aa20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1aa30 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
1aa40 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
1aa50 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
1aa60 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
1aa70 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
1aa80 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
1aa90 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  te){.  unixFile 
1aaa0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1aab0 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  le *)id;.  int r
1aac0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  c;.  assert( pFi
1aad0 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
1aae0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1aaf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1ab00 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  NCATE );..  /* I
1ab10 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
1ab20 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
1ab30 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
1ab40 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
1ab50 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
1ab60 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
1ab70 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
1ab80 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
1ab90 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
1aba0 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
1abb0 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
1abc0 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
1abd0 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
1abe0 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
1abf0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1ac00 65 2d 3e 73 7a 43 68 75 6e 6b 20 29 7b 0a 20 20  e->szChunk ){.  
1ac10 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74    nByte = ((nByt
1ac20 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  e + pFile->szChu
1ac30 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73  nk - 1)/pFile->s
1ac40 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d  zChunk) * pFile-
1ac50 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20  >szChunk;.  }.. 
1ac60 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 74 72   rc = robust_ftr
1ac70 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
1ac80 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a   (off_t)nByte);.
1ac90 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1aca0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1acb0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65   = errno;.    re
1acc0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1acd0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
1ace0 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63  RUNCATE, "ftrunc
1acf0 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ate", pFile->zPa
1ad00 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69  th);.  }else{.#i
1ad10 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
1ad20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
1ad30 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69  ing a normal wri
1ad40 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  te to a database
1ad50 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65   file (as oppose
1ad60 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  d to.    ** doin
1ad70 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
1ad80 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72  rollback or a wr
1ad90 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65  ite to some file
1ada0 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20   other than a.  
1adb0 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61    ** normal data
1adc0 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77  base file) and w
1add0 65 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66  e truncate the f
1ade0 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ile to zero leng
1adf0 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  th,.    ** that 
1ae00 65 66 66 65 63 74 69 76 65 6c 79 20 75 70 64 61  effectively upda
1ae10 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 20 63  tes the change c
1ae20 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69  ounter.  This mi
1ae30 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a  ght happen.    *
1ae40 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67  * when restoring
1ae50 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69 6e   a database usin
1ae60 67 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49  g the backup API
1ae70 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e   from a zero-len
1ae80 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63  gth.    ** sourc
1ae90 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1aea0 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
1aeb0 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d  lWrite && nByte=
1aec0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  =0 ){.      pFil
1aed0 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
1aee0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
1aef0 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53  if..    return S
1af00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
1af10 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
1af20 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1af30 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
1af40 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
1af50 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28  nt unixFileSize(
1af60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1af70 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
1af80 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
1af90 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73  t stat buf;.  as
1afa0 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63  sert( id );.  rc
1afb0 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75 6e 69   = osFstat(((uni
1afc0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26  xFile*)id)->h, &
1afd0 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  buf);.  Simulate
1afe0 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
1aff0 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
1b000 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
1b010 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
1b020 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75   errno;.    retu
1b030 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1b040 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53  FSTAT;.  }.  *pS
1b050 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a  ize = buf.st_siz
1b060 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70  e;..  /* When op
1b070 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a  ening a zero-siz
1b080 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1b090 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20  findInodeInfo() 
1b0a0 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77  procedure.  ** w
1b0b0 72 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  rites a single b
1b0c0 79 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69  yte into that fi
1b0d0 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77  le in order to w
1b0e0 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67  ork around a bug
1b0f0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d  .  ** in the OS-
1b100 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  X msdos filesyst
1b110 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  em.  In order to
1b120 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20   avoid problems 
1b130 77 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20  with upper.  ** 
1b140 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20  layers, we need 
1b150 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 66  to report this f
1b160 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f  ile size as zero
1b170 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
1b180 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31  is.  ** really 1
1b190 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32 36 30  .   Ticket #3260
1b1a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53  ..  */.  if( *pS
1b1b0 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20  ize==1 ) *pSize 
1b1c0 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20  = 0;...  return 
1b1d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1b1e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1b1f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1b200 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1b210 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65  __)./*.** Handle
1b220 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b  r for proxy-lock
1b230 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  ing file-control
1b240 20 76 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64   verbs.  Defined
1b250 20 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a   below in the.**
1b260 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e   proxying lockin
1b270 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73  g division..*/.s
1b280 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46  tatic int proxyF
1b290 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
1b2a0 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69  e3_file*,int,voi
1b2b0 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  d*);.#endif../* 
1b2c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1b2d0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68  n is called to h
1b2e0 61 6e 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45  andle the SQLITE
1b2f0 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
1b300 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f   .** file-contro
1b310 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  l operation..**.
1b320 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  ** If the user h
1b330 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20  as configured a 
1b340 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74  chunk-size for t
1b350 68 69 73 20 66 69 6c 65 2c 20 69 74 20 63 6f 75  his file, it cou
1b360 6c 64 20 62 65 0a 2a 2a 20 74 68 61 74 20 74 68  ld be.** that th
1b370 65 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20  e file needs to 
1b380 62 65 20 65 78 74 65 6e 64 65 64 20 61 74 20 74  be extended at t
1b390 68 69 73 20 70 6f 69 6e 74 2e 20 4f 74 68 65 72  his point. Other
1b3a0 77 69 73 65 2c 20 74 68 65 0a 2a 2a 20 53 51 4c  wise, the.** SQL
1b3b0 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
1b3c0 49 4e 54 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  INT operation is
1b3d0 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 55 6e 69   a no-op for Uni
1b3e0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
1b3f0 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75   fcntlSizeHint(u
1b400 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
1b410 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  i64 nByte){.  if
1b420 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1b430 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a   ){.    i64 nSiz
1b440 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1b450 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65        /* Require
1b460 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  d file size */. 
1b470 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
1b480 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
1b490 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64   /* Used to hold
1b4a0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f   return values o
1b4b0 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20  f fstat() */.   
1b4c0 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74  .    if( osFstat
1b4d0 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  (pFile->h, &buf)
1b4e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1b4f0 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20  _IOERR_FSTAT;.. 
1b500 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79     nSize = ((nBy
1b510 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  te+pFile->szChun
1b520 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a  k-1) / pFile->sz
1b530 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
1b540 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28  szChunk;.    if(
1b550 20 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e   nSize>(i64)buf.
1b560 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20  st_size ){..#if 
1b570 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53  defined(HAVE_POS
1b580 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26  IX_FALLOCATE) &&
1b590 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c   HAVE_POSIX_FALL
1b5a0 4f 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54  OCATE.      /* T
1b5b0 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73  he code below is
1b5c0 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65   handling the re
1b5d0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73  turn value of os
1b5e0 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20  Fallocate() .   
1b5f0 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e     ** correctly.
1b600 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
1b610 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  () is defined to
1b620 20 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f   "returns zero o
1b630 6e 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20  n success, .    
1b640 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72    ** or an error
1b650 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c   number on  fail
1b660 75 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61  ure". See the ma
1b670 6e 70 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c  npage for detail
1b680 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  s. */.      int 
1b690 65 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  err;.      do{. 
1b6a0 20 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46         err = osF
1b6b0 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e  allocate(pFile->
1b6c0 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20  h, buf.st_size, 
1b6d0 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a  nSize-buf.st_siz
1b6e0 65 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  e);.      }while
1b6f0 28 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a  ( err==EINTR );.
1b700 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29 20        if( err ) 
1b710 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1b720 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65  ERR_WRITE;.#else
1b730 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1b740 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   OS does not hav
1b750 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  e posix_fallocat
1b760 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 46 69  e(), fake it. Fi
1b770 72 73 74 20 75 73 65 0a 20 20 20 20 20 20 2a 2a  rst use.      **
1b780 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20   ftruncate() to 
1b790 73 65 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a  set the file siz
1b7a0 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  e, then write a 
1b7b0 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 0a 20  single byte to. 
1b7c0 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74       ** the last
1b7d0 20 62 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c   byte in each bl
1b7e0 6f 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 65  ock within the e
1b7f0 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20  xtended region. 
1b800 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73  This.      ** is
1b810 20 74 68 65 20 73 61 6d 65 20 74 65 63 68 6e 69   the same techni
1b820 71 75 65 20 75 73 65 64 20 62 79 20 67 6c 69 62  que used by glib
1b830 63 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70  c to implement p
1b840 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1b850 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73  .      ** on sys
1b860 74 65 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  tems that do not
1b870 20 68 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c   have a real fal
1b880 6c 6f 63 61 74 65 28 29 20 73 79 73 74 65 6d 20  locate() system 
1b890 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  call..      */. 
1b8a0 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20       int nBlk = 
1b8b0 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20  buf.st_blksize; 
1b8c0 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20   /* File-system 
1b8d0 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20  block size */.  
1b8e0 20 20 20 20 69 36 34 20 69 57 72 69 74 65 3b 20      i64 iWrite; 
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b900 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74  /* Next offset t
1b910 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20  o write to */.. 
1b920 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f       if( robust_
1b930 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d  ftruncate(pFile-
1b940 3e 68 2c 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20  >h, nSize) ){.  
1b950 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
1b960 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1b970 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 75          return u
1b980 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1b990 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
1b9a0 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20  E, "ftruncate", 
1b9b0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1b9c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 57 72       }.      iWr
1b9d0 69 74 65 20 3d 20 28 28 62 75 66 2e 73 74 5f 73  ite = ((buf.st_s
1b9e0 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31  ize + 2*nBlk - 1
1b9f0 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a  )/nBlk)*nBlk-1;.
1ba00 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 57 72        while( iWr
1ba10 69 74 65 3c 6e 53 69 7a 65 20 29 7b 0a 20 20 20  ite<nSize ){.   
1ba20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20       int nWrite 
1ba30 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70  = seekAndWrite(p
1ba40 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22  File, iWrite, ""
1ba50 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
1ba60 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65  ( nWrite!=1 ) re
1ba70 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1ba80 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20 20  R_WRITE;.       
1ba90 20 69 57 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b   iWrite += nBlk;
1baa0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1bab0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1bac0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1bad0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74  ../*.** Informat
1bae0 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20  ion and control 
1baf0 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  of an open file 
1bb00 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
1bb10 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f  c int unixFileCo
1bb20 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
1bb30 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
1bb40 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73  void *pArg){.  s
1bb50 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
1bb60 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1bb70 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
1bb80 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
1bb90 67 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29  g = ((unixFile*)
1bba0 69 64 29 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a  id)->eFileLock;.
1bbb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1bbc0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1bbd0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41    case SQLITE_LA
1bbe0 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20  ST_ERRNO: {.    
1bbf0 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
1bc00 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1bc10 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
1bc20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bc30 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1bc40 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1bc50 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20  CHUNK_SIZE: {.  
1bc60 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
1bc70 69 64 29 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a  id)->szChunk = *
1bc80 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20  (int *)pArg;.   
1bc90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bca0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1bcb0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1bcc0 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20  _SIZE_HINT: {.  
1bcd0 20 20 20 20 72 65 74 75 72 6e 20 66 63 6e 74 6c      return fcntl
1bce0 53 69 7a 65 48 69 6e 74 28 28 75 6e 69 78 46 69  SizeHint((unixFi
1bcf0 6c 65 20 2a 29 69 64 2c 20 2a 28 69 36 34 20 2a  le *)id, *(i64 *
1bd00 29 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 69  )pArg);.    }.#i
1bd10 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
1bd20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
1bd30 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20  lls this method 
1bd40 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69  to signal that i
1bd50 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a  t has done.    *
1bd60 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  * a rollback and
1bd70 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1bd80 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  se is therefore 
1bd90 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20  unchanged and.  
1bda0 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74    ** it hence it
1bdb0 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74   is OK for the t
1bdc0 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67  ransaction chang
1bdd0 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a  e counter to be.
1bde0 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64      ** unchanged
1bdf0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1be00 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  e SQLITE_FCNTL_D
1be10 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20  B_UNCHANGED: {. 
1be20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
1be30 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d  )id)->dbUpdate =
1be40 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1be50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1be60 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  }.#endif.#if SQL
1be70 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1be80 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1be90 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1bea0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
1beb0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
1bec0 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
1bed0 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
1bee0 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ILE: {.      ret
1bef0 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  urn proxyFileCon
1bf00 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29  trol(id,op,pArg)
1bf10 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1bf20 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
1bf30 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1bf40 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1bf50 5f 5f 29 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  __) */.    case 
1bf60 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e  SQLITE_FCNTL_SYN
1bf70 43 5f 4f 4d 49 54 54 45 44 3a 20 7b 0a 20 20 20  C_OMITTED: {.   
1bf80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bf90 5f 4f 4b 3b 20 20 2f 2a 20 41 20 6e 6f 2d 6f 70  _OK;  /* A no-op
1bfa0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
1bfb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1bfc0 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TFOUND;.}../*.**
1bfd0 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
1bfe0 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or size in bytes
1bff0 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
1c000 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20  ng block device 
1c010 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  for.** the speci
1c020 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20  fied file. This 
1c030 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
1c040 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20   512 bytes, but 
1c050 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72  may be.** larger
1c060 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65   for some device
1c070 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
1c080 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69  code assumes thi
1c090 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  s function canno
1c0a0 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20  t fail. It also 
1c0b0 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20  assumes that.** 
1c0c0 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65  if two files are
1c0d0 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
1c0e0 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d  same file-system
1c0f0 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
1c100 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
1c110 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  nd its journal f
1c120 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
1c130 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
1c140 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
1c150 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
1c160 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72  c int unixSector
1c170 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
1c180 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  e *NotUsed){.  U
1c190 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1c1a0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
1c1b0 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rn SQLITE_DEFAUL
1c1c0 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d  T_SECTOR_SIZE;.}
1c1d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1c1e0 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63  he device charac
1c1f0 74 65 72 69 73 74 69 63 73 20 66 6f 72 20 74 68  teristics for th
1c200 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
1c210 61 6c 77 61 79 73 20 30 20 66 6f 72 20 75 6e 69  always 0 for uni
1c220 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
1c230 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
1c240 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
1c250 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
1c260 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1c270 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
1c280 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23    return 0;.}..#
1c290 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c2a0 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f  IT_WAL.../*.** O
1c2b0 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
1c2c0 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65  present an share
1c2d0 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e  d memory buffer.
1c2e0 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75    .**.** When mu
1c2f0 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61  ltiple threads a
1c300 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ll reference the
1c310 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c   same wal-index,
1c320 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20   each thread.** 
1c330 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78  has its own unix
1c340 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  Shm object, but 
1c350 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74  they all point t
1c360 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61  o a single insta
1c370 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75  nce.** of this u
1c380 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1c390 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
1c3a0 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64  ds, each wal-ind
1c3b0 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  ex is opened.** 
1c3c0 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72  only once per pr
1c3d0 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63  ocess..**.** Eac
1c3e0 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  h unixShmNode ob
1c3f0 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65  ject is connecte
1c400 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e  d to a single un
1c410 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
1c420 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20  ct..** We could 
1c430 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62  coalesce this ob
1c440 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e  ject into unixIn
1c450 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61  odeInfo, but tha
1c460 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20  t would mean.** 
1c470 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20  every open file 
1c480 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73  that does not us
1c490 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
1c4a0 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (in other words,
1c4b0 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69   most.** open fi
1c4c0 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20  les) would have 
1c4d0 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20  to carry around 
1c4e0 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72  this extra infor
1c4f0 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74  mation.  So.** t
1c500 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
1c510 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
1c520 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1c530 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  is unixShmNode o
1c540 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65  bject.** and the
1c550 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1c560 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 6f  ect is created o
1c570 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e  nly when needed.
1c580 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78  .**.** unixMutex
1c590 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
1c5a0 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  rue when creatin
1c5b0 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a  g or destroying.
1c5c0 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f  ** this object o
1c5d0 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  r while reading 
1c5e0 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66  or writing the f
1c5f0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
1c600 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66  .**.**      nRef
1c610 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
1c620 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
1c630 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20  read-only after 
1c640 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72  the object is cr
1c650 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  eated:.** .**   
1c660 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a     fid.**      z
1c670 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45  Filename.**.** E
1c680 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ither unixShmNod
1c690 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  e.mutex must be 
1c6a0 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e  held or unixShmN
1c6b0 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a  ode.nRef==0 and.
1c6c0 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  ** unixMutexHeld
1c6d0 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20  () is true when 
1c6e0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
1c6f0 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65  ng any other fie
1c700 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74  ld.** in this st
1c710 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
1c720 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b  ct unixShmNode {
1c730 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
1c740 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a   *pInode;     /*
1c750 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74   unixInodeInfo t
1c760 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48  hat owns this SH
1c770 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  M node */.  sqli
1c780 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
1c790 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  ;      /* Mutex 
1c7a0 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
1c7b0 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
1c7c0 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
1c7d0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1c7e0 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c   the mmapped fil
1c7f0 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20  e */.  int h;   
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c810 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
1c820 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69  escriptor */.  i
1c830 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20  nt szRegion;    
1c840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1c850 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  e of shared-memo
1c860 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  ry regions */.  
1c870 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20  int nRegion;    
1c880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1c890 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65  ze of array apRe
1c8a0 67 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  gion */.  char *
1c8b0 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  *apRegion;      
1c8c0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
1c8d0 20 6d 61 70 70 65 64 20 73 68 61 72 65 64 2d 6d   mapped shared-m
1c8e0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
1c8f0 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
1c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c910 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53   Number of unixS
1c920 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
1c930 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
1c940 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74   unixShm *pFirst
1c950 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
1c960 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  ll unixShm objec
1c970 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
1c980 68 69 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  his */.#ifdef SQ
1c990 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
1c9a0 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20  exclMask;       
1c9b0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1c9c0 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
1c9d0 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
1c9e0 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
1c9f0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1ca00 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  of shared locks 
1ca10 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78  held */.  u8 nex
1ca20 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20  tShmId;         
1ca30 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61       /* Next ava
1ca40 69 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69  ilable unixShm.i
1ca50 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69  d value */.#endi
1ca60 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75  f.};../*.** Stru
1ca70 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72  cture used inter
1ca80 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46  nally by this VF
1ca90 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  S to record the 
1caa0 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f  state of an.** o
1cab0 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  pen shared memor
1cac0 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  y connection..**
1cad0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1cae0 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69  g fields are ini
1caf0 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68  tialized when th
1cb00 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  is object is cre
1cb10 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20  ated and.** are 
1cb20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61  read-only therea
1cb30 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75  fter:.**.**    u
1cb40 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20  nixShm.pFile.** 
1cb50 20 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a     unixShm.id.**
1cb60 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69  .** All other fi
1cb70 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72  elds are read/wr
1cb80 69 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68  ite.  The unixSh
1cb90 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d  m.pFile->mutex m
1cba0 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
1cbb0 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61  hile accessing a
1cbc0 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69  ny read/write fi
1cbd0 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  elds..*/.struct 
1cbe0 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78  unixShm {.  unix
1cbf0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1cc00 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e  e;     /* The un
1cc10 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d  derlying unixShm
1cc20 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Node object */. 
1cc30 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b   unixShm *pNext;
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1cc50 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68  ext unixShm with
1cc60 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68   the same unixSh
1cc70 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61  mNode */.  u8 ha
1cc80 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  sMutex;         
1cc90 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1cca0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69   holding the uni
1ccb0 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a  xShmNode mutex *
1ccc0 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61  /.  u16 sharedMa
1ccd0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sk;            /
1cce0 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
1ccf0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
1cd00 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20   u16 exclMask;  
1cd10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1cd20 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
1cd30 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23   locks held */.#
1cd40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1cd50 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20  UG.  u8 id;     
1cd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd70 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f  /* Id of this co
1cd80 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20  nnection within 
1cd90 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  its unixShmNode 
1cda0 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
1cdb0 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73  .** Constants us
1cdc0 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a  ed for locking.*
1cdd0 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53  /.#define UNIX_S
1cde0 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53  HM_BASE   ((22+S
1cdf0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
1ce00 2a 34 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66  *4)         /* f
1ce10 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a  irst lock byte *
1ce20 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53  /.#define UNIX_S
1ce30 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f  HM_DMS    (UNIX_
1ce40 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f  SHM_BASE+SQLITE_
1ce50 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64  SHM_NLOCK)  /* d
1ce60 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f  eadman switch */
1ce70 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f  ../*.** Apply po
1ce80 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
1ce90 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73  ks for all bytes
1cea0 20 66 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75   from ofst throu
1ceb0 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a  gh ofst+n-1..**.
1cec0 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69  ** Locks block i
1ced0 66 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65 78  f the mask is ex
1cee0 61 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43  actly UNIX_SHM_C
1cef0 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f   and are non-blo
1cf00 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69  cking.** otherwi
1cf10 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1cf20 74 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  t unixShmSystemL
1cf30 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  ock(.  unixShmNo
1cf40 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a  de *pShmNode, /*
1cf50 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20   Apply locks to 
1cf60 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64  this open shared
1cf70 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20  -memory segment 
1cf80 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70  */.  int lockTyp
1cf90 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  e,          /* F
1cfa0 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c  _UNLCK, F_RDLCK,
1cfb0 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20   or F_WRLCK */. 
1cfc0 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
1cfd0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1cfe0 20 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63   byte of the loc
1cff0 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20  king range */.  
1d000 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20 20  int n           
1d010 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d020 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
1d030 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  k */.){.  struct
1d040 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20 20   flock f;       
1d050 2f 2a 20 54 68 65 20 70 6f 73 69 78 20 61 64 76  /* The posix adv
1d060 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74  isory locking st
1d070 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
1d080 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d090 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1d0a0 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a  e form fcntl() *
1d0b0 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74  /..  /* Access t
1d0c0 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  o the unixShmNod
1d0d0 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69  e object is seri
1d0e0 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61  alized by the ca
1d0f0 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  ller */.  assert
1d100 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1d110 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  held(pShmNode->m
1d120 75 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64  utex) || pShmNod
1d130 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  e->nRef==0 );.. 
1d140 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73   /* Shared locks
1d150 20 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65   never span more
1d160 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a   than one byte *
1d170 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31  /.  assert( n==1
1d180 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f   || lockType!=F_
1d190 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c  RDLCK );..  /* L
1d1a0 6f 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20  ocks are within 
1d1b0 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72  range */.  asser
1d1c0 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c  t( n>=1 && n<SQL
1d1d0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
1d1e0 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ..  if( pShmNode
1d1f0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ->h>=0 ){.    /*
1d200 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1d210 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65  locking paramete
1d220 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  rs */.    memset
1d230 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  (&f, 0, sizeof(f
1d240 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65  ));.    f.l_type
1d250 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20   = lockType;.   
1d260 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45   f.l_whence = SE
1d270 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f  EK_SET;.    f.l_
1d280 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20  start = ofst;.  
1d290 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a    f.l_len = n;..
1d2a0 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
1d2b0 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f  (pShmNode->h, F_
1d2c0 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20  SETLK, &f);.    
1d2d0 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20  rc = (rc!=(-1)) 
1d2e0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
1d2f0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
1d300 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
1d310 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74  global lock stat
1d320 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74  e and do debug t
1d330 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66  racing */.#ifdef
1d340 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1d350 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53  { u16 mask;.  OS
1d360 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
1d370 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28   "));.  mask = (
1d380 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  1<<(ofst+n)) - (
1d390 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20  1<<ofst);.  if( 
1d3a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d3b0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
1d3c0 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
1d3d0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e      OSTRACE(("un
1d3e0 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
1d3f0 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
1d400 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d  ode->exclMask &=
1d410 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53   ~mask;.      pS
1d420 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
1d430 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
1d440 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54   }else if( lockT
1d450 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
1d460 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1d470 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22  read-lock %d ok"
1d480 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
1d490 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
1d4a0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
1d4b0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
1d4c0 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
1d4d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d4e0 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79    assert( lockTy
1d4f0 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20  pe==F_WRLCK );. 
1d500 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77       OSTRACE(("w
1d510 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22  rite-lock %d ok"
1d520 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
1d530 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
1d540 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
1d550 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
1d560 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
1d570 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1d580 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
1d590 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
1d5a0 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
1d5b0 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20  ock %d failed", 
1d5c0 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73  ofst));.    }els
1d5d0 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  e if( lockType==
1d5e0 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
1d5f0 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
1d600 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a  lock failed"));.
1d610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d620 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
1d630 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
1d640 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
1d650 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c  ite-lock %d fail
1d660 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ed", ofst));.   
1d670 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
1d680 28 28 22 20 2d 20 61 66 74 65 72 77 61 72 64 73  ((" - afterwards
1d690 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20   %03x,%03x\n",. 
1d6a0 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
1d6b0 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20  de->sharedMask, 
1d6c0 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
1d6d0 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  sk));.  }.#endif
1d6e0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  ..  return rc;  
1d6f0 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a        .}.../*.**
1d700 20 50 75 72 67 65 20 74 68 65 20 75 6e 69 78 53   Purge the unixS
1d710 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20  hmNodeList list 
1d720 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77  of all entries w
1d730 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  ith unixShmNode.
1d740 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54  nRef==0..**.** T
1d750 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53  his is not a VFS
1d760 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
1d770 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75  ethod; it is a u
1d780 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20  tility function 
1d790 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53  called.** by VFS
1d7a0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
1d7b0 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ethods..*/.stati
1d7c0 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75  c void unixShmPu
1d7d0 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  rge(unixFile *pF
1d7e0 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  d){.  unixShmNod
1d7f0 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f  e *p = pFd->pIno
1d800 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de->pShmNode;.  
1d810 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
1d820 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28  xHeld() );.  if(
1d830 20 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30   p && p->nRef==0
1d840 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1d850 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49     assert( p->pI
1d860 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64  node==pFd->pInod
1d870 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  e );.    if( p->
1d880 6d 75 74 65 78 20 29 20 73 71 6c 69 74 65 33 5f  mutex ) sqlite3_
1d890 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
1d8a0 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tex);.    for(i=
1d8b0 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b  0; i<p->nRegion;
1d8c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
1d8d0 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
1d8e0 20 20 20 20 6d 75 6e 6d 61 70 28 70 2d 3e 61 70      munmap(p->ap
1d8f0 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a  Region[i], p->sz
1d900 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  Region);.      }
1d910 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1d920 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
1d930 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20  Region[i]);.    
1d940 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1d950 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
1d960 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28  Region);.    if(
1d970 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
1d980 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
1d990 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  Fd, p->h, __LINE
1d9a0 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20  __);.      p->h 
1d9b0 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
1d9c0 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  p->pInode->pShmN
1d9d0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ode = 0;.    sql
1d9e0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1d9f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  }.}../*.** Open 
1da00 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
1da10 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20  area associated 
1da20 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61  with open databa
1da30 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20  se file pDbFd.  
1da40 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69 63 75  .** This particu
1da50 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  lar implementati
1da60 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20  on uses mmapped 
1da70 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  files..**.** The
1da80 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d   file used to im
1da90 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d  plement shared-m
1daa0 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20  emory is in the 
1dab0 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a  same directory.*
1dac0 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61  * as the open da
1dad0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1dae0 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  has the same nam
1daf0 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61  e as the open da
1db00 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77  tabase.** file w
1db10 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73  ith the "-shm" s
1db20 75 66 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f  uffix added.  Fo
1db30 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
1db40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
1db50 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65  ** is "/home/use
1db60 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68  r1/config.db" th
1db70 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  en the file that
1db80 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
1db90 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73  mmapped.** for s
1dba0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c  hared memory wil
1dbb0 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f  l be called "/ho
1dbc0 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e  me/user1/config.
1dbd0 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a  db-shm".  .**.**
1dbe0 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63   Another approac
1dbf0 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66  h to is to use f
1dc00 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d  iles in /dev/shm
1dc10 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20   or /dev/tmp or 
1dc20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72  an.** some other
1dc30 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75   tmpfs mount. Bu
1dc40 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61  t if a file in a
1dc50 20 64 69 66 66 65 72 65 6e 74 20 64 69 72 65 63   different direc
1dc60 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  tory.** from the
1dc70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1dc80 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66  s used, then dif
1dc90 66 65 72 69 6e 67 20 61 63 63 65 73 73 20 70 65  fering access pe
1dca0 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20  rmissions.** or 
1dcb0 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74  a chroot() might
1dcc0 20 63 61 75 73 65 20 74 77 6f 20 64 69 66 66 65   cause two diffe
1dcd0 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f  rent processes o
1dce0 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61  n the same.** da
1dcf0 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70  tabase to end up
1dd00 20 75 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74   using different
1dd10 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65   files for share
1dd20 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d  d memory - .** m
1dd30 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69  eaning that thei
1dd40 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e  r memory would n
1dd50 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61  ot really be sha
1dd60 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a  red - resulting.
1dd70 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20 63  ** in database c
1dd80 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65  orruption.  Neve
1dd90 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74  rtheless, this t
1dda0 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a  mpfs file usage.
1ddb0 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65  ** can be enable
1ddc0 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1ddd0 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  e using -DSQLITE
1dde0 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22  _SHM_DIRECTORY="
1ddf0 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20  /dev/shm".** or 
1de00 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  the equivalent. 
1de10 20 54 68 65 20 75 73 65 20 6f 66 20 74 68 65 20   The use of the 
1de20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
1de30 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  TORY compile-tim
1de40 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75  e.** option resu
1de50 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  lts in an incomp
1de60 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20  atible build of 
1de70 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20  SQLite;  builds 
1de80 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61  of SQLite.** tha
1de90 74 20 77 69 74 68 20 64 69 66 66 65 72 69 6e 67  t with differing
1dea0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
1deb0 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61  CTORY settings a
1dec0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68  ttempt to use th
1ded0 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61  e.** same databa
1dee0 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73  se file at the s
1def0 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61  ame time, databa
1df00 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69  se corruption wi
1df10 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
1df20 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f  ult. The SQLITE_
1df30 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f  SHM_DIRECTORY co
1df40 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
1df50 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a  n is considered.
1df60 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22  ** "unsupported"
1df70 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79   and may go away
1df80 20 69 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c   in a future SQL
1df90 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a  ite release..**.
1dfa0 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** When opening 
1dfb0 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d  a new shared-mem
1dfc0 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20  ory file, if no 
1dfd0 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20  other instances 
1dfe0 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20  of that.** file 
1dff0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  are currently op
1e000 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63  en, in this proc
1e010 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20  ess or in other 
1e020 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a  processes, then.
1e030 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74  ** the file must
1e040 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
1e050 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20   zero length or 
1e060 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20  have its header 
1e070 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  cleared..**.** I
1e080 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
1e090 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 70 44  atabase file (pD
1e0a0 62 46 64 29 20 69 73 20 75 73 69 6e 67 20 74 68  bFd) is using th
1e0b0 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46  e "unix-excl" VF
1e0c0 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20  S.** that means 
1e0d0 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76  that an exclusiv
1e0e0 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  e lock is held o
1e0f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1e100 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20  ile and.** that 
1e110 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
1e120 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72  es are able to r
1e130 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
1e140 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a   database.  In.*
1e150 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 20  * that case, we 
1e160 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65  do not really ne
1e170 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ed shared memory
1e180 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d  .  No shared mem
1e190 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63  ory.** file is c
1e1a0 72 65 61 74 65 64 2e 20 20 54 68 65 20 73 68 61  reated.  The sha
1e1b0 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  red memory will 
1e1c0 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74  be simulated wit
1e1d0 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a  h heap memory..*
1e1e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1e1f0 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  xOpenSharedMemor
1e200 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46  y(unixFile *pDbF
1e210 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  d){.  struct uni
1e220 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20  xShm *p = 0;    
1e230 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
1e240 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70  nection to be op
1e250 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ened */.  struct
1e260 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
1e270 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65  hmNode;   /* The
1e280 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70   underlying mmap
1e290 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ped file */.  in
1e2a0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e2c0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
1e2d0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
1e2e0 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20  *pInode;        
1e2f0 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f    /* The inode o
1e300 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  f fd */.  char *
1e310 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20  zShmFilename;   
1e320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1e330 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73  e of the file us
1e340 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20  ed for SHM */.  
1e350 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  int nShmFilename
1e360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e370 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53  /* Size of the S
1e380 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62  HM filename in b
1e390 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  ytes */..  /* Al
1e3a0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
1e3b0 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d   the new unixShm
1e3c0 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20   object. */.  p 
1e3d0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1e3e0 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
1e3f0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1e400 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1e410 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
1e420 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
1e430 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70  assert( pDbFd->p
1e440 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Shm==0 );..  /* 
1e450 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1e460 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  a unixShmNode ob
1e470 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65 78 69  ject already exi
1e480 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78  sts. Reuse an ex
1e490 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20  isting.  ** one 
1e4a0 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61  if present. Crea
1e4b0 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
1e4c0 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
1e4d0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
1e4e0 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
1e4f0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  DbFd->pInode;.  
1e500 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64  pShmNode = pInod
1e510 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e->pShmNode;.  i
1e520 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  f( pShmNode==0 )
1e530 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
1e540 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
1e550 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61           /* fsta
1e560 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74  t() info for dat
1e570 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
1e580 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74     /* Call fstat
1e590 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  () to figure out
1e5a0 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
1e5b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1e5c0 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a   file. If.    **
1e5d0 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c   a new *-shm fil
1e5e0 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e  e is created, an
1e5f0 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65   attempt will be
1e600 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65 20   made to create 
1e610 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  it.    ** with t
1e620 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69  he same permissi
1e630 6f 6e 73 2e 20 54 68 65 20 61 63 74 75 61 6c 20  ons. The actual 
1e640 70 65 72 6d 69 73 73 69 6f 6e 73 20 74 68 65 20  permissions the 
1e650 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
1e660 20 20 20 20 2a 2a 20 77 69 74 68 20 61 72 65 20      ** with are 
1e670 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 63  subject to the c
1e680 75 72 72 65 6e 74 20 75 6d 61 73 6b 20 73 65 74  urrent umask set
1e690 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ting..    */.   
1e6a0 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 44 62   if( osFstat(pDb
1e6b0 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 26  Fd->h, &sStat) &
1e6c0 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  & pInode->bProce
1e6d0 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
1e6e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1e6f0 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20  OERR_FSTAT;.    
1e700 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
1e710 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  err;.    }..#ifd
1e720 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ef SQLITE_SHM_DI
1e730 52 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d  RECTORY.    nShm
1e740 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f  Filename = sizeo
1e750 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f(SQLITE_SHM_DIR
1e760 45 43 54 4f 52 59 29 20 2b 20 33 30 3b 0a 23 65  ECTORY) + 30;.#e
1e770 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65  lse.    nShmFile
1e780 6e 61 6d 65 20 3d 20 35 20 2b 20 28 69 6e 74 29  name = 5 + (int)
1e790 73 74 72 6c 65 6e 28 70 44 62 46 64 2d 3e 7a 50  strlen(pDbFd->zP
1e7a0 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ath);.#endif.   
1e7b0 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69   pShmNode = sqli
1e7c0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
1e7d0 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20  of(*pShmNode) + 
1e7e0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a  nShmFilename );.
1e7f0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
1e800 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1e810 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1e820 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
1e830 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
1e840 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f     memset(pShmNo
1e850 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  de, 0, sizeof(*p
1e860 53 68 6d 4e 6f 64 65 29 29 3b 0a 20 20 20 20 7a  ShmNode));.    z
1e870 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53  ShmFilename = pS
1e880 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
1e890 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d  e = (char*)&pShm
1e8a0 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20  Node[1];.#ifdef 
1e8b0 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
1e8c0 54 4f 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33  TORY.    sqlite3
1e8d0 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69  _snprintf(nShmFi
1e8e0 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65  lename, zShmFile
1e8f0 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20  name, .         
1e900 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1e910 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
1e920 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78   "/sqlite-shm-%x
1e930 2d 25 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20  -%x",.          
1e940 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
1e950 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75  sStat.st_ino, (u
1e960 33 32 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29  32)sStat.st_dev)
1e970 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69  ;.#else.    sqli
1e980 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68  te3_snprintf(nSh
1e990 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46  mFilename, zShmF
1e9a0 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d  ilename, "%s-shm
1e9b0 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1e9c0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68  ;.#endif.    pSh
1e9d0 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  mNode->h = -1;. 
1e9e0 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65     pDbFd->pInode
1e9f0 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
1ea00 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e  mNode;.    pShmN
1ea10 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44  ode->pInode = pD
1ea20 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20  bFd->pInode;.   
1ea30 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
1ea40 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
1ea50 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
1ea60 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69  TEX_FAST);.    i
1ea70 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  f( pShmNode->mut
1ea80 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ex==0 ){.      r
1ea90 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1eaa0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
1eab0 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
1eac0 0a 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ..    if( pInode
1ead0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
1eae0 30 20 29 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e  0 ){.      pShmN
1eaf0 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f  ode->h = robust_
1eb00 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d  open(zShmFilenam
1eb10 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  e, O_RDWR|O_CREA
1eb20 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb40 20 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65    (sStat.st_mode
1eb50 20 26 20 30 37 37 37 29 29 3b 0a 20 20 20 20 20   & 0777));.     
1eb60 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
1eb70 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  <0 ){.        rc
1eb80 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
1eb90 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
1eba0 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53  BKPT, "open", zS
1ebb0 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  hmFilename);.   
1ebc0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
1ebd0 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  en_err;.      }.
1ebe0 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63    .      /* Chec
1ebf0 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  k to see if anot
1ec00 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68  her process is h
1ec10 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d  olding the dead-
1ec20 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20  man switch..    
1ec30 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75    ** If not, tru
1ec40 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
1ec50 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a  o zero length. .
1ec60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
1ec70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1ec80 20 20 20 20 20 69 66 28 20 75 6e 69 78 53 68 6d       if( unixShm
1ec90 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1eca0 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e  ode, F_WRLCK, UN
1ecb0 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d  IX_SHM_DMS, 1)==
1ecc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ecd0 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f       if( robust_
1ece0 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f  ftruncate(pShmNo
1ecf0 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20  de->h, 0) ){.   
1ed00 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
1ed10 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1ed20 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 22  IOERR_SHMOPEN, "
1ed30 66 74 72 75 6e 63 61 74 65 22 2c 20 7a 53 68 6d  ftruncate", zShm
1ed40 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
1ed50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1ed60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ed70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ed80 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
1ed90 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1eda0 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_RDLCK, UNIX_S
1edb0 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
1edc0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1edd0 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e   ) goto shm_open
1ede0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _err;.    }.  }.
1edf0 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e  .  /* Make the n
1ee00 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20  ew connection a 
1ee10 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75 6e 69  child of the uni
1ee20 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d  xShmNode */.  p-
1ee30 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
1ee40 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Node;.#ifdef SQL
1ee50 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69  ITE_DEBUG.  p->i
1ee60 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65  d = pShmNode->ne
1ee70 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69  xtShmId++;.#endi
1ee80 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  f.  pShmNode->nR
1ee90 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70  ef++;.  pDbFd->p
1eea0 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c  Shm = p;.  unixL
1eeb0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
1eec0 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65  /* The reference
1eed0 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f   count on pShmNo
1eee0 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  de has already b
1eef0 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20  een incremented 
1ef00 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  under.  ** the c
1ef10 6f 76 65 72 20 6f 66 20 74 68 65 20 75 6e 69 78  over of the unix
1ef20 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74  EnterMutex() mut
1ef30 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74  ex and the point
1ef40 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  er from the.  **
1ef50 20 6e 65 77 20 28 73 74 72 75 63 74 20 75 6e 69   new (struct uni
1ef60 78 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20  xShm) object to 
1ef70 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73  the pShmNode has
1ef80 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74   been set. All t
1ef90 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74  hat is.  ** left
1efa0 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e   to do is to lin
1efb0 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  k the new object
1efc0 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
1efd0 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20   list starting. 
1efe0 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d   ** at pShmNode-
1eff0 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75  >pFirst. This mu
1f000 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65  st be done while
1f010 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68   holding the pSh
1f020 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20  mNode->mutex .  
1f030 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20  ** mutex..  */. 
1f040 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1f050 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
1f060 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78  utex);.  p->pNex
1f070 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  t = pShmNode->pF
1f080 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  irst;.  pShmNode
1f090 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20  ->pFirst = p;.  
1f0a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1f0b0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
1f0c0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
1f0d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
1f0e0 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79  Jump here on any
1f0f0 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70   error */.shm_op
1f100 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53 68  en_err:.  unixSh
1f110 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 20 20  mPurge(pDbFd);  
1f120 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
1f130 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65  l frees pShmNode
1f140 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
1f150 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1f160 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  );.  unixLeaveMu
1f170 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
1f180 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1f190 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1f1a0 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
1f1b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69   pointer to regi
1f1c0 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68  on iRegion of th
1f1d0 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  e .** shared-mem
1f1e0 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
1f1f0 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
1f200 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64   file fd. Shared
1f210 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
1f220 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64  .** are numbered
1f230 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a   starting from z
1f240 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64  ero. Each shared
1f250 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69  -memory region i
1f260 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62  s szRegion .** b
1f270 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
1f280 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1f290 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
1f2a0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1f2b0 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74  d and *pp is set
1f2c0 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
1f2d0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1f2e0 65 20 62 45 78 74 65 6e 64 20 70 61 72 61 6d 65  e bExtend parame
1f2f0 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65  ter is 0 and the
1f300 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
1f310 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69  d-memory.** regi
1f320 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  on has not been 
1f330 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e  allocated (by an
1f340 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64  y client, includ
1f350 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20  ing one running 
1f360 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65  in a.** separate
1f370 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20   process), then 
1f380 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
1f390 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
1f3a0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a   returned. If .*
1f3b0 2a 20 62 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e  * bExtend is non
1f3c0 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65  -zero and the re
1f3d0 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
1f3e0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
1f3f0 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65   not yet .** bee
1f400 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
1f410 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  is allocated by 
1f420 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
1f430 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72  *.** If the shar
1f440 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1f450 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1f460 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69  n allocated or i
1f470 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
1f480 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64  * this call as d
1f490 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20  escribed above, 
1f4a0 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65  then it is mappe
1f4b0 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  d into this proc
1f4c0 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73  esses .** addres
1f4d0 73 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69  s space (if it i
1f4e0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20  s not already), 
1f4f0 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f  *pp is set to po
1f500 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65  int to the mappe
1f510 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64  d .** memory and
1f520 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1f530 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1f540 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20  nt unixShmMap(. 
1f550 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
1f560 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
1f570 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20   /* Handle open 
1f580 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
1f590 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f   */.  int iRegio
1f5a0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1f5b0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20        /* Region 
1f5c0 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20  to retrieve */. 
1f5d0 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20   int szRegion,  
1f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5f0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69   /* Size of regi
1f600 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78  ons */.  int bEx
1f610 74 65 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  tend,           
1f620 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1f630 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20   to extend file 
1f640 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
1f650 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20    void volatile 
1f660 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20  **pp            
1f670 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64    /* OUT: Mapped
1f680 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
1f690 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20  unixFile *pDbFd 
1f6a0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
1f6b0 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20  .  unixShm *p;. 
1f6c0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
1f6d0 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
1f6e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1f6f0 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72 65   /* If the share
1f700 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68 61  d-memory file ha
1f710 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
1f720 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
1f730 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44 62  ow. */.  if( pDb
1f740 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20  Fd->pShm==0 ){. 
1f750 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e     rc = unixOpen
1f760 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
1f770 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Fd);.    if( rc!
1f780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1f790 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70  urn rc;.  }..  p
1f7a0 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
1f7b0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
1f7c0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69  pShmNode;.  sqli
1f7d0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1f7e0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1f7f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65  ;.  assert( szRe
1f800 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e  gion==pShmNode->
1f810 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d  szRegion || pShm
1f820 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30  Node->nRegion==0
1f830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
1f840 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
1f850 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
1f860 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
1f870 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62  ode->h>=0 || pDb
1f880 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
1f890 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  cessLock==1 );. 
1f8a0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
1f8b0 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d  e->h<0 || pDbFd-
1f8c0 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
1f8d0 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69  sLock==0 );..  i
1f8e0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
1f8f0 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b  gion<=iRegion ){
1f900 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65  .    char **apNe
1f910 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
1f920 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
1f930 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  pRegion[] array 
1f940 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
1f950 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73   = (iRegion+1)*s
1f960 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e  zRegion;  /* Min
1f970 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
1f980 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
1f990 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
1f9a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f9b0 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74    /* Used by fst
1f9c0 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68  at() */..    pSh
1f9d0 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
1f9e0 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
1f9f0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
1fa00 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  >=0 ){.      /* 
1fa10 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
1fa20 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
1fa30 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
1fa40 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
1fa50 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43  pace..      ** C
1fa60 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
1fa70 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
1fa80 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
1fa90 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
1faa0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72   is.      ** lar
1fab0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
1fac0 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
1fad0 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
1fae0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
1faf0 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d  sFstat(pShmNode-
1fb00 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
1fb10 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1fb20 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
1fb30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
1fb40 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1fb50 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28    }.  .      if(
1fb60 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e   sStat.st_size<n
1fb70 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
1fb80 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
1fb90 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64   memory region d
1fba0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
1fbb0 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74  f bExtend is set
1fbc0 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   to.        ** f
1fbd0 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79  alse, exit early
1fbe0 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
1fbf0 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
1fc00 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1fc10 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
1fc20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74       ** Alternat
1fc30 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e  ively, if bExten
1fc40 64 20 69 73 20 74 72 75 65 2c 20 75 73 65 20 66  d is true, use f
1fc50 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61 6c  truncate() to al
1fc60 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 20 20 2a  locate.        *
1fc70 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
1fc80 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20  memory region.. 
1fc90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1fca0 20 20 69 66 28 20 21 62 45 78 74 65 6e 64 20 29    if( !bExtend )
1fcb0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1fcc0 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  t;.        if( r
1fcd0 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1fce0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 6e 42 79  pShmNode->h, nBy
1fcf0 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  te) ){.         
1fd00 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
1fd10 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1fd20 53 48 4d 53 49 5a 45 2c 20 22 66 74 72 75 6e 63  SHMSIZE, "ftrunc
1fd30 61 74 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ate",.          
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd50 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c    pShmNode->zFil
1fd60 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
1fd70 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1fd80 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
1fd90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1fda0 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75   /* Map the requ
1fdb0 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
1fdc0 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ion into this pr
1fdd0 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
1fde0 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70  space. */.    ap
1fdf0 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73  New = (char **)s
1fe00 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a  qlite3_realloc(.
1fe10 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
1fe20 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 28 69 52 65  ->apRegion, (iRe
1fe30 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 63  gion+1)*sizeof(c
1fe40 68 61 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20  har *).    );.  
1fe50 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a    if( !apNew ){.
1fe60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1fe70 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1fe80 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
1fe90 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
1fea0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
1feb0 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20  ion = apNew;.   
1fec0 20 77 68 69 6c 65 28 70 53 68 6d 4e 6f 64 65 2d   while(pShmNode-
1fed0 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f  >nRegion<=iRegio
1fee0 6e 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  n){.      void *
1fef0 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  pMem;.      if( 
1ff00 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
1ff10 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d  {.        pMem =
1ff20 20 6d 6d 61 70 28 30 2c 20 73 7a 52 65 67 69 6f   mmap(0, szRegio
1ff30 6e 2c 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f  n, PROT_READ|PRO
1ff40 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20  T_WRITE, .      
1ff50 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44        MAP_SHARED
1ff60 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 70  , pShmNode->h, p
1ff70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1ff80 2a 73 7a 52 65 67 69 6f 6e 0a 20 20 20 20 20 20  *szRegion.      
1ff90 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
1ffa0 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45   pMem==MAP_FAILE
1ffb0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
1ffc0 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
1ffd0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
1ffe0 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53  MMAP, "mmap", pS
1fff0 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
20000 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
20010 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
20020 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20030 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
20040 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Mem = sqlite3_ma
20050 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e 29 3b 0a  lloc(szRegion);.
20060 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d          if( pMem
20070 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
20080 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
20090 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  EM;.          go
200a0 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
200b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
200c0 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30    memset(pMem, 0
200d0 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  , szRegion);.   
200e0 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e     }.      pShmN
200f0 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53  ode->apRegion[pS
20100 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d  hmNode->nRegion]
20110 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 20 20 70   = pMem;.      p
20120 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
20130 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73  ++;.    }.  }..s
20140 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  hmpage_out:.  if
20150 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
20160 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20  ion>iRegion ){. 
20170 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64     *pp = pShmNod
20180 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67  e->apRegion[iReg
20190 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ion];.  }else{. 
201a0 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a     *pp = 0;.  }.
201b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
201c0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
201d0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
201e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
201f0 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74  ange the lock st
20200 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64  ate for a shared
20210 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e  -memory segment.
20220 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
20230 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69   the relationshi
20240 70 20 62 65 74 77 65 65 6e 20 53 48 41 52 45 64  p between SHAREd
20250 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c   and EXCLUSIVE l
20260 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65  ocks is a little
20270 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65  .** different he
20280 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78  re than in posix
20290 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29  .  In xShmLock()
202a0 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f  , one can go fro
202b0 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f  m unlocked.** to
202c0 20 73 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b   shared and back
202d0 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   or from unlocke
202e0 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61  d to exclusive a
202f0 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e  nd back.  But on
20300 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20  e may.** not go 
20310 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65  from shared to e
20320 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d  xclusive or from
20330 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68   exclusive to sh
20340 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
20350 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28  int unixShmLock(
20360 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
20370 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
20380 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
20390 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
203a0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
203b0 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
203c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
203d0 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72  t lock to acquir
203e0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
203f0 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
20400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20410 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  Number of locks 
20420 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
20430 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66  lease */.  int f
20440 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
20450 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
20460 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63   do with the loc
20470 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  k */.){.  unixFi
20480 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69  le *pDbFd = (uni
20490 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  xFile*)fd;      
204a0 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f  /* Connection ho
204b0 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
204c0 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ory */.  unixShm
204d0 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
204e0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
204f0 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d  * The shared mem
20500 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ory being locked
20510 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
20520 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
20530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
20540 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
20550 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  all siblings */.
20560 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
20570 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
20580 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75  mNode;  /* The u
20590 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69  nderlying file i
205a0 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Node */.  int rc
205b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205d0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
205e0 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20  /.  u16 mask;   
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
20610 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
20620 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
20630 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ..  assert( pShm
20640 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  Node==pDbFd->pIn
20650 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b  ode->pShmNode );
20660 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
20670 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
20680 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20  Fd->pInode );.  
20690 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20  assert( ofst>=0 
206a0 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54  && ofst+n<=SQLIT
206b0 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20  E_SHM_NLOCK );. 
206c0 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b   assert( n>=1 );
206d0 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
206e0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
206f0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
20700 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
20710 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
20720 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
20730 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
20740 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
20750 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
20760 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
20770 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
20780 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
20790 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
207a0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
207b0 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65  USIVE) );.  asse
207c0 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61  rt( n==1 || (fla
207d0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
207e0 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b  EXCLUSIVE)!=0 );
207f0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
20800 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62  ode->h>=0 || pDb
20810 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
20820 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  cessLock==1 );. 
20830 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
20840 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d  e->h<0 || pDbFd-
20850 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
20860 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d  sLock==0 );..  m
20870 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b  ask = (1<<(ofst+
20880 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b  n)) - (1<<ofst);
20890 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c  .  assert( n>1 |
208a0 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74  | mask==(1<<ofst
208b0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ) );.  sqlite3_m
208c0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
208d0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  ode->mutex);.  i
208e0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
208f0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  E_SHM_UNLOCK ){.
20900 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20      u16 allMask 
20910 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  = 0; /* Mask of 
20920 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69  locks held by si
20930 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f  blings */..    /
20940 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62  * See if any sib
20950 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20  lings hold this 
20960 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  same lock */.   
20970 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
20980 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
20990 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
209a0 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63     if( pX==p ) c
209b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
209c0 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c  ssert( (pX->excl
209d0 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d  Mask & (p->exclM
209e0 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73  ask|p->sharedMas
209f0 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  k))==0 );.      
20a00 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73  allMask |= pX->s
20a10 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
20a20 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20  ..    /* Unlock 
20a30 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
20a40 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
20a50 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73  ( (mask & allMas
20a60 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  k)==0 ){.      r
20a70 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
20a80 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
20a90 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_UNLCK, ofst+UN
20aa0 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
20ab0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20ac0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
20ad0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
20ae0 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c  Undo the local l
20af0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
20b00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20b10 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61  .      p->exclMa
20b20 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
20b30 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
20b40 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
20b50 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c   .  }else if( fl
20b60 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
20b70 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75  _SHARED ){.    u
20b80 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30  16 allShared = 0
20b90 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c  ;  /* Union of l
20ba0 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
20bb0 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74  nections other t
20bc0 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20  han "p" */..    
20bd0 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63  /* Find out whic
20be0 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  h shared locks a
20bf0 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  re already held 
20c00 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  by sibling conne
20c10 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49  ctions..    ** I
20c20 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c  f any sibling al
20c30 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65  ready holds an e
20c40 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67  xclusive lock, g
20c50 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75  o ahead and retu
20c60 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  rn.    ** SQLITE
20c70 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  _BUSY..    */.  
20c80 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
20c90 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
20ca0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
20cb0 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
20cc0 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
20cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
20ce0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
20cf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20d00 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68     }.      allSh
20d10 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72  ared |= pX->shar
20d20 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
20d30 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64     /* Get shared
20d40 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
20d50 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e  stem level, if n
20d60 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
20d70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20d80 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  K ){.      if( (
20d90 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b  allShared & mask
20da0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
20db0 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
20dc0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
20dd0 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_RDLCK, ofst+U
20de0 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
20df0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
20e00 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
20e10 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
20e20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
20e30 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65   the local share
20e40 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  d locks */.    i
20e50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20e60 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   ){.      p->sha
20e70 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
20e80 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
20e90 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
20ea0 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   no sibling conn
20eb0 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63  ections hold loc
20ec0 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f  ks that will blo
20ed0 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c  ck this.    ** l
20ee0 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c  ock.  If any do,
20ef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
20f00 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a  USY right away..
20f10 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
20f20 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
20f30 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
20f40 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
20f50 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
20f60 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58   mask)!=0 || (pX
20f70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
20f80 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
20f90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
20fa0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
20fb0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
20fc0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20  }.  .    /* Get 
20fd0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
20fe0 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
20ff0 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69  m level.  Then i
21000 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20  f successful.   
21010 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68   ** also mark th
21020 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69  e local connecti
21030 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b  on as being lock
21040 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
21050 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21060 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75   ){.      rc = u
21070 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
21080 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c  (pShmNode, F_WRL
21090 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
210a0 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
210b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
210c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
210d0 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65  ssert( (p->share
210e0 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  dMask & mask)==0
210f0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   );.        p->e
21100 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
21110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21120 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
21130 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
21140 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54  e->mutex);.  OST
21150 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
21160 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64  shmid-%d, pid-%d
21170 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e   got %03x,%03x\n
21180 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
21190 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c 20 70  >id, getpid(), p
211a0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d  ->sharedMask, p-
211b0 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72  >exclMask));.  r
211c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
211d0 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d  ** Implement a m
211e0 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72  emory barrier or
211f0 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e   memory fence on
21200 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
21210 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64   .**.** All load
21220 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67  s and stores beg
21230 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  un before the ba
21240 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c  rrier must compl
21250 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ete before.** an
21260 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20  y load or store 
21270 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20  begun after the 
21280 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74  barrier..*/.stat
21290 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42  ic void unixShmB
212a0 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65  arrier(.  sqlite
212b0 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20  3_file *fd      
212c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
212d0 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69  abase file holdi
212e0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
212f0 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55  mory */.){.  UNU
21300 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
21310 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
21320 74 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61  tex();.  unixLea
21330 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a  veMutex();.}../*
21340 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e  .** Close a conn
21350 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
21360 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65  -memory.  Delete
21370 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
21380 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64  .** storage if d
21390 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75  eleteFlag is tru
213a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  e..**.** If ther
213b0 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d  e is no shared m
213c0 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
213d0 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63   with the connec
213e0 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a  tion then this.*
213f0 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  * routine is a h
21400 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a  armless no-op..*
21410 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
21420 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c  xShmUnmap(.  sql
21430 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
21440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21450 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
21460 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
21470 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67    int deleteFlag
21480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21490 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72    /* Delete shar
214a0 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75  ed-memory if tru
214b0 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68  e */.){.  unixSh
214c0 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
214d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
214e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
214f0 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e  e closed */.  un
21500 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
21510 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
21520 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
21530 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
21540 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  le */.  unixShm 
21550 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20  **pp;           
21560 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
21570 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
21580 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
21590 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
215a0 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20 20  DbFd;           
215b0 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
215c0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
215d0 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64  file */..  pDbFd
215e0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
215f0 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ;.  p = pDbFd->p
21600 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Shm;.  if( p==0 
21610 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
21620 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  OK;.  pShmNode =
21630 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
21640 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
21650 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
21660 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20  ->pShmNode );.  
21670 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
21680 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
21690 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a  >pInode );..  /*
216a0 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69   Remove connecti
216b0 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65  on p from the se
216c0 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  t of connections
216d0 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a   associated.  **
216e0 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a   with pShmNode *
216f0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
21700 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
21710 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28  ->mutex);.  for(
21720 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  pp=&pShmNode->pF
21730 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20  irst; (*pp)!=p; 
21740 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65  pp = &(*pp)->pNe
21750 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d  xt){}.  *pp = p-
21760 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72  >pNext;..  /* Fr
21770 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ee the connectio
21780 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n p */.  sqlite3
21790 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46  _free(p);.  pDbF
217a0 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73  d->pShm = 0;.  s
217b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
217c0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
217d0 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  ex);..  /* If pS
217e0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73  hmNode->nRef has
217f0 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e   reached 0, then
21800 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72   close the under
21810 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65  lying.  ** share
21820 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74  d-memory file, t
21830 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  oo */.  unixEnte
21840 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
21850 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
21860 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
21870 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
21880 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
21890 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  ==0 ){.    if( d
218a0 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53 68  eleteFlag && pSh
218b0 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20 75 6e  mNode->h>=0 ) un
218c0 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a  link(pShmNode->z
218d0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 75  Filename);.    u
218e0 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46  nixShmPurge(pDbF
218f0 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
21900 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72  aveMutex();..  r
21910 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21920 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66  .}...#else.# def
21930 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20  ine unixShmMap  
21940 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e     0.# define un
21950 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23  ixShmLock    0.#
21960 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42   define unixShmB
21970 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e  arrier 0.# defin
21980 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20  e unixShmUnmap  
21990 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   0.#endif /* #if
219a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
219b0 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48  _WAL */../*.** H
219c0 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
219d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
219e0 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
219f0 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
21a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21a10 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
21a20 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
21a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
21a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
21aa0 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
21ab0 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
21ac0 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
21ad0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
21ae0 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c  cts that.** impl
21af0 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69  ement various fi
21b00 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  le locking strat
21b10 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20  egies.  It also 
21b20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
21b30 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64  ions.** of "find
21b40 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  er" functions.  
21b50 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  A finder-functio
21b60 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63  n is used to loc
21b70 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ate the appropri
21b80 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  ate.** sqlite3_i
21b90 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
21ba0 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
21bb0 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  r database file.
21bc0 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a    The pAppData.*
21bd0 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73  * field of the s
21be0 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f  qlite3_vfs VFS o
21bf0 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69  bjects are initi
21c00 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69  alized to be poi
21c10 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  nters to.** the 
21c20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66  correct finder-f
21c30 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  unction for that
21c40 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74   VFS..**.** Most
21c50 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
21c60 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
21c70 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
21c80 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
21c90 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  .** object.  The
21ca0 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e   only interestin
21cb0 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  g finder-functio
21cc0 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  n is autolockIoF
21cd0 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20  inder, which.** 
21ce0 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c  looks at the fil
21cf0 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64  esystem type and
21d00 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20   tries to guess 
21d10 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
21d20 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f  .** strategy fro
21d30 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  m that..**.** Fo
21d40 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e  r finder-funtion
21d50 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20   F, two objects 
21d60 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a  are created:.**.
21d70 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72 65  **    (1) The re
21d80 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  al finder-functi
21d90 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28  on named "FImpt(
21da0 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  )"..**.**    (2)
21db0 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e   A constant poin
21dc0 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ter to this func
21dd0 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20  tion named just 
21de0 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20  "F"..**.**.** A 
21df0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46  pointer to the F
21e00 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64   pointer is used
21e10 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74 61   as the pAppData
21e20 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a   value for VFS.*
21e30 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68  * objects.  We h
21e40 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69  ave to do this i
21e50 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e  nstead of lettin
21e60 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74  g pAppData point
21e70 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20  .** directly at 
21e80 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  the finder-funct
21e90 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75  ion since C90 ru
21ea0 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f  les prevent a vo
21eb0 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63  id*.** from be c
21ec0 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74  ast into a funct
21ed0 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ion pointer..**.
21ee0 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61  **.** Each insta
21ef0 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72  nce of this macr
21f00 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20  o generates two 
21f10 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  objects:.**.**  
21f20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73   *  A constant s
21f30 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
21f40 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45  s object call ME
21f50 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f  THOD that has lo
21f60 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65  cking.**      me
21f70 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43  thods CLOSE, LOC
21f80 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53  K, UNLOCK, CKRES
21f90 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  LOCK..**.**   * 
21fa0 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66   An I/O method f
21fb0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63  inder function c
21fc0 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61  alled FINDER tha
21fd0 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  t returns a poin
21fe0 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ter.**      to t
21ff0 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74  he METHOD object
22000 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
22010 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66   bullet..*/.#def
22020 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49  ine IOMETHODS(FI
22030 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45  NDER, METHOD, VE
22040 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f  RSION, CLOSE, LO
22050 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f  CK, UNLOCK, CKLO
22060 43 4b 29 20 20 20 20 20 20 5c 0a 73 74 61 74 69  CK)      \.stati
22070 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
22080 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f  io_methods METHO
22090 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20  D = {           
220a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220b0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52          \.   VER
220c0 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20  SION,           
220d0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
220e0 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  sion */         
220f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22100 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53         \.   CLOS
22110 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
22120 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
22130 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
22140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22150 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52        \.   unixR
22160 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
22170 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
22180 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
22190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221a0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72       \.   unixWr
221b0 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
221c0 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
221d0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
221e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221f0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75      \.   unixTru
22200 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
22210 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
22220 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
22230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22240 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63     \.   unixSync
22250 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22260 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20      /* xSync */ 
22270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22290 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53    \.   unixFileS
222a0 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
222b0 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20     /* xFileSize 
222c0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222e0 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20   \.   LOCK,     
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22300 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20    /* xLock */   
22310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22330 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20  \.   UNLOCK,    
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22350 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20   /* xUnlock */  
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
22380 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20  .   CKLOCK,     
22390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223a0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
223b0 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  dLock */        
223c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
223d0 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72     unixFileContr
223e0 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ol,            /
223f0 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
22400 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
22410 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
22420 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65    unixSectorSize
22430 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
22440 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20   xSectorSize */ 
22450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22460 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
22470 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
22480 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20  cteristics,  /* 
22490 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69 74  xDeviceCapabilit
224a0 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ies */          
224b0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
224c0 75 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20 20 20  unixShmMap,     
224d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
224e0 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20  ShmMap */       
224f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22500 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
22510 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20  nixShmLock,     
22520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
22530 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  hmLock */       
22540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22550 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
22560 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20  ixShmBarrier,   
22570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
22580 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20  mBarrier */     
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225a0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
225b0 78 53 68 6d 55 6e 6d 61 70 20 20 20 20 20 20 20  xShmUnmap       
225c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
225d0 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20  Unmap */        
225e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225f0 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20         \.};     
22600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22640 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
22650 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
22660 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23  methods *FINDER#
22670 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72  #Impl(const char
22680 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70   *z, unixFile *p
22690 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f  ){   \.  UNUSED_
226a0 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e  PARAMETER(z); UN
226b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
226c0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
226d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226e0 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26      \.  return &
226f0 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20  METHOD;         
22700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22730 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20     \.}          
22740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22780 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
22790 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
227a0 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e  ods *(*const FIN
227b0 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  DER)(const char*
227c0 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20  ,unixFile *p)   
227d0 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23   \.    = FINDER#
227e0 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65  #Impl;../*.** He
227f0 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68  re are all of th
22800 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
22810 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  hods objects for
22820 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
22830 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
22840 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74  es.  Functions t
22850 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74  hat return point
22860 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74  ers to these met
22870 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f  hods.** are also
22880 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d   created..*/.IOM
22890 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49  ETHODS(.  posixI
228a0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
228b0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
228c0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
228d0 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c   posixIoMethods,
228e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
228f0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
22900 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
22910 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20    2,            
22920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
22930 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
22940 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69  enabled */.  uni
22950 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  xClose,         
22960 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
22970 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
22980 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  xLock,          
22990 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
229a0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
229b0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
229c0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
229d0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
229e0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
229f0 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ck     /* xCheck
22a00 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
22a10 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f  hod */.).IOMETHO
22a20 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69  DS(.  nolockIoFi
22a30 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
22a40 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
22a50 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c  on name */.  nol
22a60 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
22a70 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
22a80 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
22a90 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ab0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
22ac0 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
22ad0 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  bled */.  nolock
22ae0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
22af0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
22b00 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
22b10 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
22b20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
22b30 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55  hod */.  nolockU
22b40 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
22b50 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
22b60 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
22b70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
22b80 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  k   /* xCheckRes
22b90 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
22ba0 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
22bb0 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64  .  dotlockIoFind
22bc0 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er,          /* 
22bd0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
22be0 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  name */.  dotloc
22bf0 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
22c00 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
22c10 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
22c20 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c40 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
22c50 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
22c60 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c  d */.  dotlockCl
22c70 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
22c80 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
22c90 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  d */.  dotlockLo
22ca0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
22cb0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
22cc0 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c   */.  dotlockUnl
22cd0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
22ce0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
22cf0 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68  d */.  dotlockCh
22d00 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
22d10 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
22d20 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
22d30 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .)..#if SQLITE_E
22d40 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
22d50 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
22d60 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  KS.IOMETHODS(.  
22d70 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  flockIoFinder,  
22d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
22d90 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
22da0 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65  e */.  flockIoMe
22db0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
22dc0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
22dd0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
22de0 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e00 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
22e10 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
22e20 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20  /.  flockClose, 
22e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22e40 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
22e50 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  /.  flockLock,  
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22e70 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
22e80 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20  .  flockUnlock, 
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22ea0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
22eb0 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  /.  flockCheckRe
22ec0 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a  servedLock    /*
22ed0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
22ee0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
22ef0 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56  #endif..#if OS_V
22f00 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
22f10 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c  (.  semIoFinder,
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22f30 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
22f40 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f   name */.  semIo
22f50 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
22f60 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
22f70 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
22f80 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fa0 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
22fb0 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
22fc0 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65  ed */.  semClose
22fd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22fe0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
22ff0 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c  od */.  semLock,
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23010 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
23020 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b  d */.  semUnlock
23030 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23040 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
23050 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b  od */.  semCheck
23060 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
23070 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
23080 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
23090 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
230a0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
230b0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
230c0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
230d0 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61  E.IOMETHODS(.  a
230e0 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fpIoFinder,     
230f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
23100 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
23110 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f   */.  afpIoMetho
23120 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
23130 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
23140 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
23150 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
23160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23170 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
23180 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
23190 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20  .  afpClose,    
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
231b0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
231c0 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20  .  afpLock,     
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
231e0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
231f0 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20    afpUnlock,    
23200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23210 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
23220 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  .  afpCheckReser
23230 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
23240 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
23250 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
23260 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
23270 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d   proxy locking m
23280 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65  ethod is a "supe
23290 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65  r-method" in the
232a0 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a   sense that it.*
232b0 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72  * opens secondar
232c0 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
232d0 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  rs for the conch
232e0 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20   and lock files 
232f0 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70  and.** it uses p
23300 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20  roxy, dot-file, 
23310 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29  AFP, and flock()
23320 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
23330 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63   on those.** sec
23340 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46  ondary files.  F
23350 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
23360 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
23370 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20  t implements.** 
23380 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
23390 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75   located much fu
233a0 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68  rther down in th
233b0 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20  e file.  But we 
233c0 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68  need.** to go ah
233d0 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74  ead and define t
233e0 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
233f0 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72  thods and finder
23400 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
23410 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68   proxy locking h
23420 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77  ere.  So we forw
23430 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20  ard declare the 
23440 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  I/O methods..*/.
23450 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
23460 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
23470 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
23480 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74  STYLE.static int
23490 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69   proxyClose(sqli
234a0 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
234b0 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b  ic int proxyLock
234c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
234d0 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
234e0 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
234f0 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
23500 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
23510 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
23520 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
23530 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48  *, int*);.IOMETH
23540 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69  ODS(.  proxyIoFi
23550 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
23560 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
23570 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72  ion name */.  pr
23580 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  oxyIoMethods,   
23590 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
235a0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
235b0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
235c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
235d0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
235e0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
235f0 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79  abled */.  proxy
23600 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
23610 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
23620 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
23630 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
23640 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
23650 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55  thod */.  proxyU
23660 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
23670 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
23680 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
23690 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
236a0 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k    /* xCheckRe
236b0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
236c0 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f  d */.).#endif../
236d0 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f  * nfs lockd on O
236e0 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74  SX 10.3+ doesn't
236f0 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63   clear write loc
23700 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  ks when a read l
23710 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69  ock is set */.#i
23720 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
23730 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
23740 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
23750 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
23760 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20   nfsIoFinder,   
23770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23780 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
23790 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65  ame */.  nfsIoMe
237a0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
237b0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
237c0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
237d0 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
237e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237f0 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
23800 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
23810 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73  ed */.  unixClos
23820 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
23830 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
23840 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63  hod */.  unixLoc
23850 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
23860 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
23870 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f  hod */.  nfsUnlo
23880 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
23890 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
238a0 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
238b0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
238c0 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
238d0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
238e0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
238f0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
23900 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
23910 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
23920 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69  STYLE./* .** Thi
23930 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  s "finder" funct
23940 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
23950 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65  determine the be
23960 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  st locking strat
23970 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20  egy .** for the 
23980 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66  database file "f
23990 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68  ilePath".  It th
239a0 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  en returns the s
239b0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
239c0 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  s.** object that
239d0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74   implements that
239e0 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a   strategy..**.**
239f0 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63   This is for Mac
23a00 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  OSX only..*/.sta
23a10 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
23a20 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75  3_io_methods *au
23a30 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
23a40 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pl(.  const char
23a50 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f   *filePath,    /
23a60 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
23a70 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
23a80 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
23a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65            /* ope
23aa0 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f  n file object fo
23ab0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
23ac0 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74  ile */.){.  stat
23ad0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
23ae0 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f  Mapping {.    co
23af0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73  nst char *zFiles
23b00 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20  ystem;          
23b10 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65      /* Filesyste
23b20 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20  m type name */. 
23b30 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
23b40 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65  _io_methods *pMe
23b50 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72  thods;   /* Appr
23b60 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
23b70 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d  method */.  } aM
23b80 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ap[] = {.    { "
23b90 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49  hfs",    &posixI
23ba0 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
23bb0 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73  { "ufs",    &pos
23bc0 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
23bd0 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26     { "afpfs",  &
23be0 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  afpIoMethods },.
23bf0 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20      { "smbfs",  
23c00 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
23c10 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c  .    { "webdav",
23c20 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
23c30 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20  s },.    { 0, 0 
23c40 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  }.  };.  int i;.
23c50 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
23c60 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  fsInfo;.  struct
23c70 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b   flock lockInfo;
23c80 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74  ..  if( !filePat
23c90 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66  h ){.    /* If f
23ca0 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68  ilePath==NULL th
23cb0 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  at means we are 
23cc0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74  dealing with a t
23cd0 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20  ransient file.  
23ce0 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e    ** that does n
23cf0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
23d00 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74  cked. */.    ret
23d10 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
23d20 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  hods;.  }.  if( 
23d30 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c  statfs(filePath,
23d40 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20   &fsInfo) != -1 
23d50 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66  ){.    if( fsInf
23d60 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f  o.f_flags & MNT_
23d70 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  RDONLY ){.      
23d80 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
23d90 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
23da0 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70     for(i=0; aMap
23db0 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b  [i].zFilesystem;
23dc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
23dd0 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
23de0 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61  _fstypename, aMa
23df0 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
23e00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
23e10 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70  return aMap[i].p
23e20 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d  Methods;.      }
23e30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
23e40 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48   Default case. H
23e50 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20  andles, amongst 
23e60 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20  others, "nfs".. 
23e70 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61   ** Test byte-ra
23e80 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66  nge lock using f
23e90 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63  cntl(). If the c
23ea0 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20  all succeeds, . 
23eb0 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20   ** assume that 
23ec0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
23ed0 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73  supports POSIX s
23ee0 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a  tyle locks. .  *
23ef0 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c  /.  lockInfo.l_l
23f00 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e  en = 1;.  lockIn
23f10 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  fo.l_start = 0;.
23f20 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65    lockInfo.l_whe
23f30 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
23f40 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70    lockInfo.l_typ
23f50 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69  e = F_RDLCK;.  i
23f60 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d  f( osFcntl(pNew-
23f70 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
23f80 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a  ckInfo)!=-1 ) {.
23f90 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
23fa0 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
23fb0 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b  me, "nfs")==0 ){
23fc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
23fd0 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  fsIoMethods;.   
23fe0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
23ff0 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d  return &posixIoM
24000 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20  ethods;.    }.  
24010 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
24020 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  n &dotlockIoMeth
24030 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  ods;.  }.}.stati
24040 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
24050 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28  io_methods .  *(
24060 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49  *const autolockI
24070 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
24080 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
24090 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  = autolockIoFind
240a0 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20  erImpl;..#endif 
240b0 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
240c0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
240d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
240e0 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f  TYLE */..#if OS_
240f0 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54  VXWORKS && SQLIT
24100 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
24110 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
24120 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
24130 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
24140 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
24150 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
24160 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
24170 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
24180 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
24190 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
241a0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
241b0 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
241c0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
241d0 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
241e0 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 56 58  * This is for VX
241f0 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  Works only..*/.s
24200 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
24210 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
24220 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
24230 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
24240 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
24250 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
24260 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
24270 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
24280 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  w           /* t
24290 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a  he open file obj
242a0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ect */.){.  stru
242b0 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
242c0 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
242d0 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
242e0 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
242f0 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
24300 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
24310 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
24320 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
24330 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
24340 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
24350 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
24360 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f  ethods;.  }..  /
24370 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28  * Test if fcntl(
24380 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61  ) is supported a
24390 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74 79  nd use POSIX sty
243a0 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f  le locks..  ** O
243b0 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61  therwise fall ba
243c0 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20  ck to the named 
243d0 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64  semaphore method
243e0 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66  ..  */.  lockInf
243f0 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  o.l_len = 1;.  l
24400 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20  ockInfo.l_start 
24410 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 0;.  lockInfo.
24420 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
24430 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  SET;.  lockInfo.
24440 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
24450 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28  ;.  if( osFcntl(
24460 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
24470 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
24480 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
24490 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
244a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
244b0 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f  turn &semIoMetho
244c0 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
244d0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
244e0 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
244f0 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f  const autolockIo
24500 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68  Finder)(const ch
24510 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d  ar*,unixFile*) =
24520 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
24530 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
24540 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  * OS_VXWORKS && 
24550 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
24560 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
24570 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63  /*.** An abstrac
24580 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69  t type for a poi
24590 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65 74  nter to a IO met
245a0 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
245b0 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion:.*/.typedef 
245c0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
245d0 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64  _methods *(*find
245e0 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63  er_type)(const c
245f0 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b  har*,unixFile*);
24600 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
24610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24650 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
24660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
24670 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
24680 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
24690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
246a0 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
246b0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
246c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
246d0 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
246e0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
246f0 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  object..*/../*.*
24700 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
24710 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
24720 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
24730 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ure pointed to b
24740 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  y pId..*/.static
24750 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46   int fillInUnixF
24760 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ile(.  sqlite3_v
24770 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
24780 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
24790 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
247a0 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
247b0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
247c0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20  e descriptor of 
247d0 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
247e0 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64  d */.  int dirfd
247f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
24800 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65  * Directory file
24810 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
24820 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
24830 49 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74  Id,      /* Writ
24840 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c  e to the unixFil
24850 65 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  e structure here
24860 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
24870 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
24880 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
24890 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
248a0 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20  /.  int noLock, 
248b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
248c0 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74  mit locking if t
248d0 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  rue */.  int isD
248e0 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20  elete,          
248f0 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
24900 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
24910 20 69 6e 74 20 69 73 52 65 61 64 4f 6e 6c 79 20   int isReadOnly 
24920 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
24930 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
24940 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79  opened read-only
24950 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73   */.){.  const s
24960 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
24970 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  s *pLockingStyle
24980 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
24990 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  ew = (unixFile *
249a0 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  )pId;.  int rc =
249b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
249c0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e  ssert( pNew->pIn
249d0 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20  ode==NULL );..  
249e0 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 69 73 44  /* Parameter isD
249f0 65 6c 65 74 65 20 69 73 20 6f 6e 6c 79 20 75 73  elete is only us
24a00 65 64 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 45  ed on vxworks. E
24a10 78 70 72 65 73 73 20 74 68 69 73 20 65 78 70 6c  xpress this expl
24a20 69 63 69 74 6c 79 20 0a 20 20 2a 2a 20 68 65 72  icitly .  ** her
24a30 65 20 74 6f 20 70 72 65 76 65 6e 74 20 63 6f 6d  e to prevent com
24a40 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61  piler warnings a
24a50 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72 61  bout unused para
24a60 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 55  meters..  */.  U
24a70 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
24a80 69 73 44 65 6c 65 74 65 29 3b 0a 0a 20 20 2f 2a  isDelete);..  /*
24a90 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70 61 74   Usually the pat
24aa0 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75  h zFilename shou
24ab0 6c 64 20 6e 6f 74 20 62 65 20 61 20 72 65 6c 61  ld not be a rela
24ac0 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 54  tive pathname. T
24ad0 68 65 0a 20 20 2a 2a 20 65 78 63 65 70 74 69 6f  he.  ** exceptio
24ae0 6e 20 69 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e  n is when openin
24af0 67 20 74 68 65 20 70 72 6f 78 79 20 22 63 6f 6e  g the proxy "con
24b00 63 68 22 20 66 69 6c 65 20 69 6e 20 62 75 69 6c  ch" file in buil
24b10 64 73 20 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63  ds that.  ** inc
24b20 6c 75 64 65 20 74 68 65 20 73 70 65 63 69 61 6c  lude the special
24b30 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73   Apple locking s
24b40 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20  tyles..  */.#if 
24b50 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
24b60 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
24b70 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
24b80 45 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  E.  assert( zFil
24b90 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c  ename==0 || zFil
24ba0 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20  ename[0]=='/' . 
24bb0 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70     || pVfs->pApp
24bc0 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75  Data==(void*)&au
24bd0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  tolockIoFinder )
24be0 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74  ;.#else.  assert
24bf0 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  ( zFilename==0 |
24c00 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
24c10 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  '/' );.#endif.. 
24c20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
24c30 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68     %-3d %s\n", h
24c40 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  , zFilename));. 
24c50 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20   pNew->h = h;.  
24c60 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20 64 69  pNew->dirfd = di
24c70 72 66 64 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61  rfd;.  pNew->zPa
24c80 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
24c90 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 56 66    if( memcmp(pVf
24ca0 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65  s->zName,"unix-e
24cb0 78 63 6c 22 2c 31 30 29 3d 3d 30 20 29 7b 0a 20  xcl",10)==0 ){. 
24cc0 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
24cd0 67 73 20 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58  gs = UNIXFILE_EX
24ce0 43 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  CL;.  }else{.   
24cf0 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
24d00 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
24d10 69 73 52 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  isReadOnly ){.  
24d20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
24d30 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44  s |= UNIXFILE_RD
24d40 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f  ONLY;.  }..#if O
24d50 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77  S_VXWORKS.  pNew
24d60 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46  ->pId = vxworksF
24d70 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e  indFileId(zFilen
24d80 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ame);.  if( pNew
24d90 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pId==0 ){.    
24da0 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20  noLock = 1;.    
24db0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
24dc0 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  M;.  }.#endif.. 
24dd0 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20   if( noLock ){. 
24de0 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
24df0 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68   = &nolockIoMeth
24e00 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
24e10 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
24e20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70  = (**(finder_typ
24e30 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74  e*)pVfs->pAppDat
24e40 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e  a)(zFilename, pN
24e50 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ew);.#if SQLITE_
24e60 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
24e70 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68  TYLE.    /* Cach
24e80 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74  e zFilename in t
24e90 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
24ea0 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c  xt (AFP and dotl
24eb0 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f  ock override) fo
24ec0 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f  r.    ** proxyLo
24ed0 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73  ck activation is
24ee0 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74   possible (remot
24ef0 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64  e proxy is based
24f00 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20   on db name).   
24f10 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65   ** zFilename re
24f20 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
24f30 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
24f40 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a  , to support */.
24f50 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
24f60 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64  gContext = (void
24f70 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e  *)zFilename;.#en
24f80 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
24f90 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
24fa0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a  &posixIoMethods.
24fb0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
24fc0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
24fd0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
24fe0 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f  STYLE.    || pLo
24ff0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e  ckingStyle == &n
25000 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64  fsIoMethods.#end
25010 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78  if.  ){.    unix
25020 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
25030 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
25040 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
25050 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
25060 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25070 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
25080 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
25090 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   in findInodeInf
250a0 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66  o(), close the f
250b0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20  ile descriptor. 
250c0 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74       ** immediat
250d0 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65  ely, before rele
250e0 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e  asing the mutex.
250f0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
25100 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20   may fail.      
25110 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ** in two scenar
25120 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ios:.      **.  
25130 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63      **   (a) A c
25140 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66  all to fstat() f
25150 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  ailed..      ** 
25160 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66    (b) A malloc f
25170 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ailed..      **.
25180 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69        ** Scenari
25190 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f  o (b) may only o
251a0 63 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63  ccur if the proc
251b0 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e  ess is holding n
251c0 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  o other.      **
251d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
251e0 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  s open on the sa
251f0 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  me file. If ther
25200 65 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c  e were other fil
25210 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
25220 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66  iptors on this f
25230 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c  ile, then no mal
25240 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71  loc would be req
25250 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
25260 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  * findInodeInfo(
25270 29 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ). If this is th
25280 65 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75  e case, it is qu
25290 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73  ite safe to clos
252a0 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c  e.      ** handl
252b0 65 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67  e h - as it is g
252c0 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e  uaranteed that n
252d0 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69  o posix locks wi
252e0 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20  ll be released. 
252f0 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67       ** by doing
25300 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20   so..      **.  
25310 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72      ** If scenar
25320 69 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68  io (a) caused th
25330 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69  e error then thi
25340 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73  ngs are not so s
25350 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  afe. The.      *
25360 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d  * implicit assum
25370 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68  ption here is th
25380 61 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61  at if fstat() fa
25390 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20  ils, things are 
253a0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68  in.      ** such
253b0 20 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20   bad shape that 
253c0 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20  dropping a lock 
253d0 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d  or two doesn't m
253e0 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20  atter much..    
253f0 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73    */.      robus
25400 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
25410 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
25420 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a    h = -1;.    }.
25430 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
25440 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53  ex();.  }..#if S
25450 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
25460 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
25470 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
25480 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
25490 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66  kingStyle == &af
254a0 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
254b0 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67    /* AFP locking
254c0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
254d0 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
254e0 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
254f0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70  n.    ** the afp
25500 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a  LockingContext..
25510 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f      */.    afpLo
25520 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
25530 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f  tx;.    pNew->lo
25540 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
25550 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ctx = sqlite3_ma
25560 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
25570 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  tx) );.    if( p
25580 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ctx==0 ){.      
25590 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
255a0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
255b0 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65      /* NB: zFile
255c0 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20  name exists and 
255d0 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
255e0 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20  til the file is 
255f0 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  closed.      ** 
25600 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71  according to req
25610 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e  uirement F11141.
25620 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e    So we do not n
25630 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20  eed to make a.  
25640 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
25650 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a  he filename. */.
25660 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61        pCtx->dbPa
25670 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
25680 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65        pCtx->rese
25690 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rved = 0;.      
256a0 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20  srandomdev();.  
256b0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
256c0 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ex();.      rc =
256d0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
256e0 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
256f0 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  de);.      if( r
25700 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
25710 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
25720 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69  free(pNew->locki
25730 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ngContext);.    
25740 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
25750 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
25760 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d  __);.        h =
25770 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
25780 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
25790 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20  x();        .   
257a0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
257b0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
257c0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c  ngStyle == &dotl
257d0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  ockIoMethods ){.
257e0 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c      /* Dotfile l
257f0 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
25800 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
25810 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
25820 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
25830 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  he dotlockLockin
25840 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f  gContext .    */
25850 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  .    char *zLock
25860 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46  File;.    int nF
25870 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 6e 46 69  ilename;.    nFi
25880 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74  lename = (int)st
25890 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20  rlen(zFilename) 
258a0 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69  + 6;.    zLockFi
258b0 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  le = (char *)sql
258c0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c  ite3_malloc(nFil
258d0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
258e0 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a  zLockFile==0 ){.
258f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25900 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
25910 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
25920 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65  3_snprintf(nFile
25930 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c  name, zLockFile,
25940 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55   "%s" DOTLOCK_SU
25950 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  FFIX, zFilename)
25960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
25970 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
25980 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20   = zLockFile;.  
25990 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  }..#if OS_VXWORK
259a0 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f  S.  else if( pLo
259b0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73  ckingStyle == &s
259c0 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  emIoMethods ){. 
259d0 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61     /* Named sema
259e0 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73  phore locking us
259f0 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
25a00 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
25a10 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64  be.    ** includ
25a20 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63  ed in the semLoc
25a30 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20  kingContext.    
25a40 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  */.    unixEnter
25a50 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
25a60 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
25a70 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
25a80 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72  ode);.    if( (r
25a90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
25aa0 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e   (pNew->pInode->
25ab0 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20  pSem==NULL) ){. 
25ac0 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e       char *zSemN
25ad0 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f  ame = pNew->pIno
25ae0 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20  de->aSemName;.  
25af0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
25b00 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
25b10 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20  f(MAX_PATHNAME, 
25b20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73  zSemName, "/%s.s
25b30 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  em",.           
25b40 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
25b50 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61  ->pId->zCanonica
25b60 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f  lName);.      fo
25b70 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65  r( n=1; zSemName
25b80 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20  [n]; n++ ).     
25b90 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b     if( zSemName[
25ba0 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61  n]=='/' ) zSemNa
25bb0 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20  me[n] = '_';.   
25bc0 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d     pNew->pInode-
25bd0 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e  >pSem = sem_open
25be0 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45  (zSemName, O_CRE
25bf0 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20  AT, 0666, 1);.  
25c00 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49      if( pNew->pI
25c10 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45  node->pSem == SE
25c20 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  M_FAILED ){.    
25c30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25c40 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70  NOMEM;.        p
25c50 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65  New->pInode->aSe
25c60 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b  mName[0] = '\0';
25c70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25c80 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
25c90 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  x();.  }.#endif.
25ca0 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45    .  pNew->lastE
25cb0 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53  rrno = 0;.#if OS
25cc0 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72  _VXWORKS.  if( r
25cd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
25ce0 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72      if( h>=0 ) r
25cf0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
25d00 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
25d10 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
25d20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65  unlink(zFilename
25d30 29 3b 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20  );.    isDelete 
25d40 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  = 0;.  }.  pNew-
25d50 3e 69 73 44 65 6c 65 74 65 20 3d 20 69 73 44 65  >isDelete = isDe
25d60 6c 65 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69  lete;.#endif.  i
25d70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25d80 20 29 7b 0a 20 20 20 20 69 66 28 20 64 69 72 66   ){.    if( dirf
25d90 64 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c  d>=0 ) robust_cl
25da0 6f 73 65 28 70 4e 65 77 2c 20 64 69 72 66 64 2c  ose(pNew, dirfd,
25db0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
25dc0 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73  if( h>=0 ) robus
25dd0 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
25de0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65   __LINE__);.  }e
25df0 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  lse{.    pNew->p
25e00 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e  Method = pLockin
25e10 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e  gStyle;.    Open
25e20 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d  Counter(+1);.  }
25e30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25e40 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69  ./*.** Open a fi
25e50 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
25e60 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
25e70 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a  ontaining file z
25e80 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20  Filename..** If 
25e90 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64  successful, *pFd
25ea0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
25eb0 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72  pened file descr
25ec0 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c  iptor and.** SQL
25ed0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
25ee0 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
25ef0 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72 20 53  occurs, either S
25f00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f  QLITE_NOMEM.** o
25f10 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r SQLITE_CANTOPE
25f20 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  N is returned an
25f30 64 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  d *pFd is set to
25f40 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a   an undefined.**
25f50 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   value..**.** If
25f60 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
25f70 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c  turned, the call
25f80 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
25f90 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a  e for closing.**
25fa0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
25fb0 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20  ptor *pFd using 
25fc0 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  close()..*/.stat
25fd0 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63  ic int openDirec
25fe0 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20  tory(const char 
25ff0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20  *zFilename, int 
26000 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b  *pFd){.  int ii;
26010 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
26020 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b    char zDirname[
26030 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
26040 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
26050 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
26060 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73  E, zDirname, "%s
26070 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
26080 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72   for(ii=(int)str
26090 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69  len(zDirname); i
260a0 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b  i>1 && zDirname[
260b0 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b  ii]!='/'; ii--);
260c0 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20  .  if( ii>0 ){. 
260d0 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20     zDirname[ii] 
260e0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d  = '\0';.    fd =
260f0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69   robust_open(zDi
26100 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
26110 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
26120 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23    if( fd>=0 ){.#
26130 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43  ifdef FD_CLOEXEC
26140 0a 20 20 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  .      osFcntl(f
26150 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63  d, F_SETFD, osFc
26160 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
26170 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
26180 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
26190 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49  OSTRACE(("OPENDI
261a0 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64  R %-3d %s\n", fd
261b0 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20  , zDirname));.  
261c0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d    }.  }.  *pFd =
261d0 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66   fd;.  return (f
261e0 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75  d>=0?SQLITE_OK:u
261f0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
26200 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
26210 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61  , "open", zDirna
26220 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  me));.}../*.** R
26230 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
26240 66 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e  f a directory in
26250 20 77 68 69 63 68 20 74 6f 20 70 75 74 20 74 65   which to put te
26260 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a  mporary files..*
26270 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65  * If no suitable
26280 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
26290 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65  directory can be
262a0 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e   found, return N
262b0 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ULL..*/.static c
262c0 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54  onst char *unixT
262d0 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29  empFileDir(void)
262e0 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
262f0 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
26300 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20  = {.     0,.    
26310 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74   0,.     "/var/t
26320 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f  mp",.     "/usr/
26330 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70  tmp",.     "/tmp
26340 22 2c 0a 20 20 20 20 20 30 20 20 20 20 20 20 20  ",.     0       
26350 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61   /* List termina
26360 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e  tor */.  };.  un
26370 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
26380 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
26390 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
263a0 44 69 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69  Dir = 0;..  azDi
263b0 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f  rs[0] = sqlite3_
263c0 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a  temp_directory;.
263d0 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d    if( !azDirs[1]
263e0 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67   ) azDirs[1] = g
263f0 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b  etenv("TMPDIR");
26400 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
26410 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
26420 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20  eof(azDirs[0]); 
26430 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d  zDir=azDirs[i++]
26440 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d  ){.    if( zDir=
26450 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
26460 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44     if( osStat(zD
26470 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74  ir, &buf) ) cont
26480 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53  inue;.    if( !S
26490 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f  _ISDIR(buf.st_mo
264a0 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  de) ) continue;.
264b0 20 20 20 20 69 66 28 20 6f 73 41 63 63 65 73 73      if( osAccess
264c0 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e  (zDir, 07) ) con
264d0 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b  tinue;.    break
264e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
264f0 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  Dir;.}../*.** Cr
26500 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
26510 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42   file name in zB
26520 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62  uf.  zBuf must b
26530 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  e allocated.** b
26540 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  y the calling pr
26550 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62  ocess and must b
26560 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  e big enough to 
26570 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a  hold at least.**
26580 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
26590 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  e bytes..*/.stat
265a0 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65  ic int unixGetTe
265b0 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
265c0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
265d0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
265e0 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72  igned char zChar
265f0 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
26600 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
26610 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
26620 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
26630 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
26640 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69  3456789";.  unsi
26650 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  gned int i, j;. 
26660 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
26670 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  r;..  /* It's od
26680 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
26690 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
266a0 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
266b0 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
266c0 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
266d0 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
266e0 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
266f0 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
26700 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
26710 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53  iling. .  */.  S
26720 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
26730 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
26740 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d  ERR );..  zDir =
26750 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72   unixTempFileDir
26760 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d  ();.  if( zDir==
26770 30 20 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a  0 ) zDir = ".";.
26780 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
26790 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
267a0 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
267b0 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
267c0 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20  rary file .  ** 
267d0 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e  name. If it is n
267e0 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ot, return SQLIT
267f0 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20  E_ERROR..  */.  
26800 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72  if( (strlen(zDir
26810 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54  ) + strlen(SQLIT
26820 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
26830 49 58 29 20 2b 20 31 37 29 20 3e 3d 20 28 73 69  IX) + 17) >= (si
26840 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20  ze_t)nBuf ){.   
26850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
26860 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b  RROR;.  }..  do{
26870 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
26880 72 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a  rintf(nBuf-17, z
26890 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45  Buf, "%s/"SQLITE
268a0 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
268b0 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20  X, zDir);.    j 
268c0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42  = (int)strlen(zB
268d0 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  uf);.    sqlite3
268e0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  _randomness(15, 
268f0 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66  &zBuf[j]);.    f
26900 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b  or(i=0; i<15; i+
26910 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  +, j++){.      z
26920 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a  Buf[j] = (char)z
26930 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65  Chars[ ((unsigne
26940 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25  d char)zBuf[j])%
26950 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
26960 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  1) ];.    }.    
26970 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d  zBuf[j] = 0;.  }
26980 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28  while( osAccess(
26990 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20  zBuf,0)==0 );.  
269a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
269b0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
269c0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
269d0 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
269e0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a  __APPLE__)./*.**
269f0 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e   Routine to tran
26a00 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65  sform a unixFile
26a10 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f   into a proxy-lo
26a20 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a  cking unixFile..
26a30 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
26a40 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c  n in the proxy-l
26a50 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75  ock division, bu
26a60 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70  t used by unixOp
26a70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54  en().** if SQLIT
26a80 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
26a90 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65  OCKING is define
26aa0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
26ab0 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
26ac0 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
26ad0 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  *, const char*);
26ae0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
26af0 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75  earch for an unu
26b00 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
26b10 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65  tor that was ope
26b20 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ned on the datab
26b30 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f  ase .** file (no
26b40 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d  t a journal or m
26b50 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
26b60 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64 20 62  le) identified b
26b70 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50  y pathname.** zP
26b80 61 74 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ath with SQLITE_
26b90 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d  OPEN_XXX flags m
26ba0 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61  atching those pa
26bb0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
26bc0 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  nd.** argument t
26bd0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
26be0 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69  .**.** Such a fi
26bf0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61  le descriptor ma
26c00 79 20 65 78 69 73 74 20 69 66 20 61 20 64 61 74  y exist if a dat
26c10 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
26c20 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62   was closed.** b
26c30 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  ut the associate
26c40 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
26c50 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63  r could not be c
26c60 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20 73 6f  losed because so
26c70 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65  me.** other file
26c80 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e   descriptor open
26c90 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   on the same fil
26ca0 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66  e is holding a f
26cb0 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66  ile-lock..** Ref
26cc0 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69  er to comments i
26cd0 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28  n the unixClose(
26ce0 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74  ) function and t
26cf0 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65  he lengthy comme
26d00 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67  nt.** describing
26d10 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79   "Posix Advisory
26d20 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65   Locking" at the
26d30 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 66   start of this f
26d40 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74  ile for .** furt
26d50 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73  her details. Als
26d60 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e  o, ticket #4018.
26d70 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74  .**.** If a suit
26d80 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  able file descri
26d90 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  ptor is found, t
26da0 68 65 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e  hen it is return
26db0 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63  ed. If no.** suc
26dc0 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  h file descripto
26dd0 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31  r is located, -1
26de0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
26df0 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73  .static UnixUnus
26e00 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62  edFd *findReusab
26e10 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20  leFd(const char 
26e20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67  *zPath, int flag
26e30 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  s){.  UnixUnused
26e40 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b  Fd *pUnused = 0;
26e50 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65  ..  /* Do not se
26e60 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73  arch for an unus
26e70 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
26e80 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e  or on vxworks. N
26e90 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20  ot because.  ** 
26ea0 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f  vxworks would no
26eb0 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74  t benefit from t
26ec0 68 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69  he change (it mi
26ed0 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73  ght, we're not s
26ee0 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62  ure),.  ** but b
26ef0 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f  ecause no way to
26f00 20 74 65 73 74 20 69 74 20 69 73 20 63 75 72 72   test it is curr
26f10 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e  ently available.
26f20 20 49 74 20 69 73 20 62 65 74 74 65 72 20 0a 20   It is better . 
26f30 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20   ** not to risk 
26f40 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73  breaking vxworks
26f50 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65   support for the
26f60 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e   sake of such an
26f70 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66   obscure .  ** f
26f80 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20  eature.  */.#if 
26f90 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74  !OS_VXWORKS.  st
26fa0 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
26fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fc0 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66     /* Results of
26fd0 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a   stat() call */.
26fe0 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63  .  /* A stat() c
26ff0 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72  all may fail for
27000 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73   various reasons
27010 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
27020 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c  s, it is.  ** al
27030 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68 61  most certain tha
27040 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c  t an open() call
27050 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74   on the same pat
27060 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c  h will also fail
27070 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20  ..  ** For this 
27080 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72  reason, if an er
27090 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68  ror occurs in th
270a0 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65  e stat() call he
270b0 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69  re, it is.  ** i
270c0 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73  gnored and -1 is
270d0 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63   returned. The c
270e0 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74  aller will try t
270f0 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c  o open a new fil
27100 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f  e.  ** descripto
27110 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61  r on the same pa
27120 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65  th, fail, and re
27130 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f  turn an error to
27140 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20   SQLite..  **.  
27150 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75 62  ** Even if a sub
27160 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63  sequent open() c
27170 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64  all does succeed
27180 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63  , the consequenc
27190 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73  es of.  ** not s
271a0 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72  earching for a r
271b0 65 73 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65  esusable file de
271c0 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74  scriptor are not
271d0 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28   dire.  */.  if(
271e0 20 30 3d 3d 73 74 61 74 28 7a 50 61 74 68 2c 20   0==stat(zPath, 
271f0 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 75  &sStat) ){.    u
27200 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
27210 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78 45  node;..    unixE
27220 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
27230 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
27240 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ist;.    while( 
27250 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f 64  pInode && (pInod
27260 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d 73  e->fileId.dev!=s
27270 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20 20  Stat.st_dev.    
27280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27290 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65   || pInode->file
272a0 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73 74  Id.ino!=sStat.st
272b0 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  _ino) ){.       
272c0 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
272d0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
272e0 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a    if( pInode ){.
272f0 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64        UnixUnused
27300 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66  Fd **pp;.      f
27310 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70  or(pp=&pInode->p
27320 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28  Unused; *pp && (
27330 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61  *pp)->flags!=fla
27340 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e  gs; pp=&((*pp)->
27350 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70  pNext));.      p
27360 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20  Unused = *pp;.  
27370 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20      if( pUnused 
27380 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d  ){.        *pp =
27390 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b   pUnused->pNext;
273a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
273b0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
273c0 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  x();.  }.#endif 
273d0 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57     /* if !OS_VXW
273e0 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ORKS */.  return
273f0 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a   pUnused;.}../*.
27400 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
27410 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75 6e   is called by un
27420 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74 65  ixOpen() to dete
27430 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20 70  rmine the unix p
27440 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f  ermissions.** to
27450 20 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c 65   create new file
27460 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65 72  s with. If no er
27470 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
27480 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
27490 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20  turned.** and a 
274a0 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66  value suitable f
274b0 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20 74 68  or passing as th
274c0 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
274d0 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a   to open(2) is.*
274e0 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d  * written to *pM
274f0 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ode. If an IO er
27500 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
27510 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
27520 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
27530 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
27540 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20  f *pMode is not 
27550 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
27560 49 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  If the file bein
27570 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20 74 65  g opened is a te
27580 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 69 74  mporary file, it
27590 20 69 73 20 61 6c 77 61 79 73 20 63 72 65 61 74   is always creat
275a0 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6f  ed with.** the o
275b0 63 74 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73  ctal permissions
275c0 20 30 36 30 30 20 28 72 65 61 64 2f 77 72 69 74   0600 (read/writ
275d0 61 62 6c 65 20 62 79 20 6f 77 6e 65 72 20 6f 6e  able by owner on
275e0 6c 79 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65  ly). If the file
275f0 0a 2a 2a 20 69 73 20 61 20 64 61 74 61 62 61 73  .** is a databas
27600 65 20 6f 72 20 6d 61 73 74 65 72 20 6a 6f 75 72  e or master jour
27610 6e 61 6c 20 66 69 6c 65 2c 20 69 74 20 69 73 20  nal file, it is 
27620 63 72 65 61 74 65 64 20 77 69 74 68 20 74 68 65  created with the
27630 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a   permissions .**
27640 20 6d 61 73 6b 20 53 51 4c 49 54 45 5f 44 45 46   mask SQLITE_DEF
27650 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
27660 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e  SIONS..**.** Fin
27670 61 6c 6c 79 2c 20 69 66 20 74 68 65 20 66 69 6c  ally, if the fil
27680 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69  e being opened i
27690 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c  s a WAL or regul
276a0 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ar journal file,
276b0 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66   then .** this f
276c0 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20  unction queries 
276d0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
276e0 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69  for the permissi
276f0 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63  ons on the .** c
27700 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74  orresponding dat
27710 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73  abase file and s
27720 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68  ets *pMode to th
27730 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76  is value. Whenev
27740 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c  er .** possible,
27750 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c   WAL and journal
27760 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
27770 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
27780 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a  e permissions .*
27790 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61  * as the associa
277a0 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
277b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
277c0 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d   findCreateFileM
277d0 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ode(.  const cha
277e0 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
277f0 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f         /* Path o
27800 66 20 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79  f file (possibly
27810 29 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20  ) being created 
27820 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
27830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27840 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
27850 73 73 65 64 20 61 73 20 34 74 68 20 61 72 67 75  ssed as 4th argu
27860 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20  ment to xOpen() 
27870 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f  */.  mode_t *pMo
27880 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  de              
27890 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72       /* OUT: Per
278a0 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e  missions to open
278b0 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 29 7b   file with */.){
278c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
278d0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
278e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
278f0 65 20 2a 2f 0a 20 20 69 66 28 20 66 6c 61 67 73  e */.  if( flags
27900 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & (SQLITE_OPEN_
27910 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  WAL|SQLITE_OPEN_
27920 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b  MAIN_JOURNAL) ){
27930 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b 4d 41  .    char zDb[MA
27940 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20  X_PATHNAME+1];  
27950 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
27960 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20  ile path */.    
27970 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20  int nDb;        
27980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27990 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   Number of valid
279a0 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f   bytes in zDb */
279b0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
279c0 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
279d0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20     /* Output of 
279e0 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61 62 61  stat() on databa
279f0 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
27a00 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70 61  /* zPath is a pa
27a10 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a  th to a WAL or j
27a20 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
27a30 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
27a40 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20   derives.    ** 
27a50 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20  the path to the 
27a60 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  associated datab
27a70 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50  ase file from zP
27a80 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ath. This block 
27a90 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74  handles.    ** t
27aa0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d  he following nam
27ab0 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a  ing conventions:
27ac0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
27ad0 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a   "<path to db>-j
27ae0 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20  ournal".    **  
27af0 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77   "<path to db>-w
27b00 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70  al".    **   "<p
27b10 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e  ath to db>-journ
27b20 61 6c 2d 4e 4e 4e 4e 22 0a 20 20 20 20 2a 2a 20  al-NNNN".    ** 
27b30 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
27b40 77 61 6c 2d 4e 4e 4e 4e 22 0a 20 20 20 20 2a 2a  wal-NNNN".    **
27b50 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e  .    ** where NN
27b60 4e 4e 20 69 73 20 61 20 34 20 64 69 67 69 74 20  NN is a 4 digit 
27b70 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20  decimal number. 
27b80 54 68 65 20 4e 4e 4e 4e 20 6e 61 6d 69 6e 67 20  The NNNN naming 
27b90 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20  schemes are .   
27ba0 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20   ** used by the 
27bb0 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63  test_multiplex.c
27bc0 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a   module..    */.
27bd0 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65      nDb = sqlite
27be0 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29  3Strlen30(zPath)
27bf0 20 2d 20 31 3b 20 0a 20 20 20 20 77 68 69 6c 65   - 1; .    while
27c00 28 20 6e 44 62 3e 30 20 26 26 20 7a 50 61 74 68  ( nDb>0 && zPath
27c10 5b 6e 44 62 5d 21 3d 27 6c 27 20 29 20 6e 44 62  [nDb]!='l' ) nDb
27c20 2d 2d 3b 0a 20 20 20 20 6e 44 62 20 2d 3d 20 28  --;.    nDb -= (
27c30 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
27c40 4f 50 45 4e 5f 57 41 4c 29 20 3f 20 33 20 3a 20  OPEN_WAL) ? 3 : 
27c50 37 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  7);.    memcpy(z
27c60 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b  Db, zPath, nDb);
27c70 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20  .    zDb[nDb] = 
27c80 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20 30  '\0';..    if( 0
27c90 3d 3d 73 74 61 74 28 7a 44 62 2c 20 26 73 53 74  ==stat(zDb, &sSt
27ca0 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d  at) ){.      *pM
27cb0 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d  ode = sStat.st_m
27cc0 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20  ode & 0777;.    
27cd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
27ce0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  = SQLITE_IOERR_F
27cf0 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  STAT;.    }.  }e
27d00 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
27d10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
27d20 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20  TEONCLOSE ){.   
27d30 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a   *pMode = 0600;.
27d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 4d    }else{.    *pM
27d50 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ode = SQLITE_DEF
27d60 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
27d70 53 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20 72 65 74  SIONS;.  }.  ret
27d80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27d90 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a   Open the file z
27da0 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65  Path..** .** Pre
27db0 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c  viously, the SQL
27dc0 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65  ite OS layer use
27dd0 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  d three function
27de0 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  s in place of th
27df0 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a  is.** one:.**.**
27e00 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
27e10 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a  enReadWrite();.*
27e20 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
27e30 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a  penReadOnly();.*
27e40 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
27e50 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a  penExclusive();.
27e60 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
27e70 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  s correspond to 
27e80 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
27e90 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c  mbinations of fl
27ea0 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52  ags:.**.**     R
27eb0 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20  eadWrite() ->   
27ec0 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43    (READWRITE | C
27ed0 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65  REATE).**     Re
27ee0 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20  adOnly()  ->    
27ef0 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20   (READONLY) .** 
27f00 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76      OpenExclusiv
27f10 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54  e() -> (READWRIT
27f20 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43  E | CREATE | EXC
27f30 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68  LUSIVE).**.** Th
27f40 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73  e old OpenExclus
27f50 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61  ive() accepted a
27f60 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e   boolean argumen
27f70 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49  t - "delFlag". I
27f80 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66  f.** true, the f
27f90 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72  ile was configur
27fa0 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74  ed to be automat
27fb0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77  ically deleted w
27fc0 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  hen the.** file 
27fd0 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54  handle closed. T
27fe0 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61  o achieve the sa
27ff0 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20  me effect using 
28000 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74  this new .** int
28010 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20  erface, add the 
28020 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c  DELETEONCLOSE fl
28030 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63  ag to those spec
28040 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20  ified above for 
28050 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  .** OpenExclusiv
28060 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
28070 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73  nt unixOpen(.  s
28080 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
28090 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
280a0 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63 68  he VFS for which
280b0 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f 70   this is the xOp
280c0 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  en method */.  c
280d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
280e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
280f0 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20  athname of file 
28100 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
28110 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
28120 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  pFile,         /
28130 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
28140 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c  iptor to be fill
28150 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66  ed in */.  int f
28160 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
28170 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
28180 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f   flags to contro
28190 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f  l the opening */
281a0 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67  .  int *pOutFlag
281b0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
281c0 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20  /* Output flags 
281d0 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
281e0 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20  te core */.){.  
281f0 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75  unixFile *p = (u
28200 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  nixFile *)pFile;
28210 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20  .  int fd = -1; 
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28230 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
28240 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79  ptor returned by
28250 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74   open() */.  int
28260 20 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20 20   dirfd = -1;    
28270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
28280 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
28290 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e  scriptor */.  in
282a0 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b  t openFlags = 0;
282b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
282c0 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
282d0 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74   open() */.  int
282e0 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30   eType = flags&0
282f0 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54  xFFFFFF00;  /* T
28300 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f  ype of file to o
28310 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c  pen */.  int noL
28320 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
28330 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
28340 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20  to omit locking 
28350 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20  primitives */.  
28360 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
28370 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
28380 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72  * Function Retur
28390 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 69 6e 74  n Code */..  int
283a0 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20   isExclusive  = 
283b0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
283c0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b  OPEN_EXCLUSIVE);
283d0 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20  .  int isDelete 
283e0 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
283f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
28400 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74  EONCLOSE);.  int
28410 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20   isCreate     = 
28420 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
28430 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
28440 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20  int isReadonly  
28450 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
28460 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
28470 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57  );.  int isReadW
28480 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26  rite  = (flags &
28490 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
284a0 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51 4c  DWRITE);.#if SQL
284b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
284c0 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 69  NG_STYLE.  int i
284d0 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28 66  sAutoProxy  = (f
284e0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
284f0 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23  EN_AUTOPROXY);.#
28500 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63  endif..  /* If c
28510 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72  reating a master
28520 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f   or main-file jo
28530 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63  urnal, this func
28540 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20  tion will open. 
28550 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72   ** a file-descr
28560 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72  iptor on the dir
28570 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20  ectory too. The 
28580 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53  first time unixS
28590 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61  ync().  ** is ca
285a0 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63 74 6f  lled the directo
285b0 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
285c0 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63  or will be fsync
285d0 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29  ()ed and close()
285e0 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 73  d..  */.  int is
285f0 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 3d 20  OpenDirectory = 
28600 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20  (isCreate && (. 
28610 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51         eType==SQ
28620 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
28630 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
28640 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
28650 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
28660 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
28670 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
28680 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  L.  ));..  /* If
28690 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20   argument zPath 
286a0 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
286b0 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
286c0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
286d0 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70  open.  ** a temp
286e0 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20  orary file. Use 
286f0 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73  this buffer to s
28700 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61  tore the file na
28710 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68  me in..  */.  ch
28720 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f  ar zTmpname[MAX_
28730 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63  PATHNAME+1];.  c
28740 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
28750 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20   = zPath;..  /* 
28760 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77  Check the follow
28770 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ing statements a
28780 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20  re true: .  **. 
28790 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
287a0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
287b0 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
287c0 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
287d0 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a  e set, and .  **
287e0 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
287f0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
28800 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
28810 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
28820 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
28830 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
28840 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
28850 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
28860 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
28870 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
28880 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
28890 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
288a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
288b0 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
288c0 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
288d0 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
288e0 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
288f0 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
28900 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
28910 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
28920 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
28930 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
28940 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
28950 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
28960 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
28970 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57   main journal, W
28980 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74  AL file and mast
28990 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e  er journal are n
289a0 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d  ever .  ** autom
289b0 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
289c0 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65  . Nor are they e
289d0 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ver temporary fi
289e0 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  les.  */.  asser
289f0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
28a00 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
28a10 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
28a20 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  IN_DB );.  asser
28a30 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
28a40 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
28a50 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
28a60 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
28a70 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
28a80 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
28a90 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
28aa0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
28ab0 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
28ac0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
28ad0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
28ae0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b  LITE_OPEN_WAL );
28af0 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
28b00 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  at the upper lay
28b10 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f  er has set one o
28b20 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65  f the "file-type
28b30 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73  " flags. */.  as
28b40 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
28b50 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
28b60 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
28b70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
28b80 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  _DB .       || e
28b90 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
28ba0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
28bb0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
28bc0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
28bd0 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
28be0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
28bf0 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20  SUBJOURNAL   || 
28c00 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
28c10 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
28c20 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
28c30 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
28c40 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20  TRANSIENT_DB || 
28c50 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
28c60 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 6d  EN_WAL.  );..  m
28c70 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
28c80 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a  of(unixFile));..
28c90 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
28ca0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
28cb0 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73   ){.    UnixUnus
28cc0 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20  edFd *pUnused;. 
28cd0 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e     pUnused = fin
28ce0 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d  dReusableFd(zNam
28cf0 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  e, flags);.    i
28d00 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
28d10 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64      fd = pUnused
28d20 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->fd;.    }else{
28d30 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
28d40 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
28d50 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29  sizeof(*pUnused)
28d60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 55  );.      if( !pU
28d70 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20  nused ){.       
28d80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
28d90 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
28da0 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73    }.    p->pUnus
28db0 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20  ed = pUnused;.  
28dc0 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65  }else if( !zName
28dd0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e   ){.    /* If zN
28de0 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ame is NULL, the
28df0 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73 20   upper layer is 
28e00 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d  requesting a tem
28e10 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  p file. */.    a
28e20 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26  ssert(isDelete &
28e30 26 20 21 69 73 4f 70 65 6e 44 69 72 65 63 74 6f  & !isOpenDirecto
28e40 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e  ry);.    rc = un
28e50 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41  ixGetTempname(MA
28e60 58 5f 50 41 54 48 4e 41 4d 45 2b 31 2c 20 7a 54  X_PATHNAME+1, zT
28e70 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
28e80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28e90 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
28ea0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61  c;.    }.    zNa
28eb0 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20  me = zTmpname;. 
28ec0 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69   }..  /* Determi
28ed0 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ne the value of 
28ee0 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
28ef0 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f  ter passed to PO
28f00 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  SIX function.  *
28f10 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20  * open(). These 
28f20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74  must be calculat
28f30 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28  ed even if open(
28f40 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c  ) is not called,
28f50 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61   as.  ** they ma
28f60 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 70  y be stored as p
28f70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20  art of the file 
28f80 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20  handle and used 
28f90 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f  by the .  ** 'co
28fa0 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e  nch file' lockin
28fb0 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65  g functions late
28fc0 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20  r on.  */.  if( 
28fd0 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70  isReadonly )  op
28fe0 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f  enFlags |= O_RDO
28ff0 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61  NLY;.  if( isRea
29000 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61  dWrite ) openFla
29010 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20  gs |= O_RDWR;.  
29020 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20  if( isCreate )  
29030 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
29040 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73  _CREAT;.  if( is
29050 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e  Exclusive ) open
29060 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c  Flags |= (O_EXCL
29070 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20  |O_NOFOLLOW);.  
29080 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f  openFlags |= (O_
29090 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41  LARGEFILE|O_BINA
290a0 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30  RY);..  if( fd<0
290b0 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f   ){.    mode_t o
290c0 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  penMode;        
290d0 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73        /* Permiss
290e0 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66  ions to create f
290f0 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20 20  ile with */.    
29100 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46  rc = findCreateF
29110 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66  ileMode(zName, f
29120 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 29  lags, &openMode)
29130 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
29140 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29150 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 55 6e   assert( !p->pUn
29160 75 73 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73  used );.      as
29170 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
29180 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20  ITE_OPEN_WAL || 
29190 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
291a0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
291b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
291c0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64  rc;.    }.    fd
291d0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
291e0 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  Name, openFlags,
291f0 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20   openMode);.    
29200 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20  OSTRACE(("OPENX 
29210 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22    %-3d %s 0%o\n"
29220 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65  , fd, zName, ope
29230 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 69 66  nFlags));.    if
29240 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21  ( fd<0 && errno!
29250 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65 61  =EISDIR && isRea
29260 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63  dWrite && !isExc
29270 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  lusive ){.      
29280 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* Failed to ope
29290 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72  n the file for r
292a0 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
292b0 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e  . Try read-only.
292c0 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73 20   */.      flags 
292d0 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e  &= ~(SQLITE_OPEN
292e0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
292f0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
29300 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
29310 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52  &= ~(O_RDWR|O_CR
29320 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61 67  EAT);.      flag
29330 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
29340 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
29350 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
29360 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69 73  RDONLY;.      is
29370 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
29380 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
29390 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e  open(zName, open
293a0 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29  Flags, openMode)
293b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
293c0 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  fd<0 ){.      rc
293d0 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
293e0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
293f0 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e  BKPT, "open", zN
29400 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
29410 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
29420 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
29430 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69  rt( fd>=0 );.  i
29440 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a  f( pOutFlags ){.
29450 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
29460 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
29470 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b  f( p->pUnused ){
29480 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d  .    p->pUnused-
29490 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d  >fd = fd;.    p-
294a0 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20  >pUnused->flags 
294b0 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
294c0 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a  if( isDelete ){.
294d0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
294e0 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65     zPath = zName
294f0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 6e 6c 69  ;.#else.    unli
29500 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69  nk(zName);.#endi
29510 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  f.  }.#if SQLITE
29520 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
29530 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20  STYLE.  else{.  
29540 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d    p->openFlags =
29550 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a   openFlags;.  }.
29560 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73  #endif..  if( is
29570 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 29 7b  OpenDirectory ){
29580 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69  .    rc = openDi
29590 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26  rectory(zPath, &
295a0 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20  dirfd);.    if( 
295b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
295c0 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
295d0 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 20 66 64  safe to close fd
295e0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
295f0 62 65 63 61 75 73 65 20 69 74 20 69 73 20 67 75  because it is gu
29600 61 72 61 6e 74 65 65 64 20 6e 6f 74 0a 20 20 20  aranteed not.   
29610 20 20 20 2a 2a 20 74 6f 20 62 65 20 6f 70 65 6e     ** to be open
29620 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 66   on a database f
29630 69 6c 65 2e 20 49 66 20 69 74 20 77 65 72 65 20  ile. If it were 
29640 6f 70 65 6e 20 6f 6e 20 61 20 64 61 74 61 62 61  open on a databa
29650 73 65 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 2a  se file,.      *
29660 2a 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62  * it would not b
29670 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 20  e safe to close 
29680 61 73 20 74 68 69 73 20 77 6f 75 6c 64 20 72 65  as this would re
29690 6c 65 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20  lease any locks 
296a0 68 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  held.      ** on
296b0 20 74 68 65 20 66 69 6c 65 20 62 79 20 74 68 69   the file by thi
296c0 73 20 70 72 6f 63 65 73 73 2e 20 20 2a 2f 0a 20  s process.  */. 
296d0 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
296e0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
296f0 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 20 20 20  MAIN_DB );.     
29700 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c   robust_close(p,
29710 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
29720 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
29730 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
29740 20 20 7d 0a 0a 23 69 66 64 65 66 20 46 44 5f 43    }..#ifdef FD_C
29750 4c 4f 45 58 45 43 0a 20 20 6f 73 46 63 6e 74 6c  LOEXEC.  osFcntl
29760 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73  (fd, F_SETFD, os
29770 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  Fcntl(fd, F_GETF
29780 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
29790 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e  EC);.#endif..  n
297a0 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53  oLock = eType!=S
297b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
297c0 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66 69  DB;..  .#if defi
297d0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
297e0 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
297f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
29800 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
29810 49 6e 66 6f 3b 0a 20 20 69 66 28 20 66 73 74 61  Info;.  if( fsta
29820 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29  tfs(fd, &fsInfo)
29830 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28 28   == -1 ){.    ((
29840 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
29850 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
29860 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 64 69 72  rno;.    if( dir
29870 66 64 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63  fd>=0 ) robust_c
29880 6c 6f 73 65 28 70 2c 20 64 69 72 66 64 2c 20 5f  lose(p, dirfd, _
29890 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 6f  _LINE__);.    ro
298a0 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64  bust_close(p, fd
298b0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
298c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
298d0 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d  OERR_ACCESS;.  }
298e0 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e  .  if (0 == strn
298f0 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49  cmp("msdos", fsI
29900 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
29910 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e  , 5)) {.    ((un
29920 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
29930 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  fsFlags |= SQLIT
29940 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
29950 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  OS;.  }.#endif. 
29960 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41   .#if SQLITE_ENA
29970 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
29980 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45  E.#if SQLITE_PRE
29990 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
299a0 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20  G.  isAutoProxy 
299b0 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 1;.#endif.  if
299c0 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26  ( isAutoProxy &&
299d0 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26   (zPath!=NULL) &
299e0 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70  & (!noLock) && p
299f0 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20  Vfs->xOpen ){.  
29a00 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65    char *envforce
29a10 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54   = getenv("SQLIT
29a20 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
29a30 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74  CKING");.    int
29a40 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a   useProxy = 0;..
29a50 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f      /* SQLITE_FO
29a60 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
29a70 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65  G==1 means force
29a80 20 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78   always use prox
29a90 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20  y, 0 means .    
29aa0 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f  ** never use pro
29ab0 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75  xy, NULL means u
29ac0 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e  se proxy for non
29ad0 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c  -local files onl
29ae0 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  y.  */.    if( e
29af0 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b  nvforce!=NULL ){
29b00 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
29b10 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29  = atoi(envforce)
29b20 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  >0;.    }else{. 
29b30 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
29b40 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20  fs fsInfo;.     
29b50 20 69 66 28 20 73 74 61 74 66 73 28 7a 50 61 74   if( statfs(zPat
29b60 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  h, &fsInfo) == -
29b70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  1 ){.        /* 
29b80 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63  In theory, the c
29b90 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c 20 69 73  lose(fd) call is
29ba0 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e 20 49 66   sub-optimal. If
29bb0 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
29bc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68  .        ** with
29bd0 20 66 64 20 69 73 20 61 20 64 61 74 61 62 61 73   fd is a databas
29be0 65 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72  e file, and ther
29bf0 65 20 61 72 65 20 6f 74 68 65 72 20 63 6f 6e 6e  e are other conn
29c00 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a 20 20 20  ections open.   
29c10 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 61 74 20       ** on that 
29c20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 63 75  file that are cu
29c30 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20  rrently holding 
29c40 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6f  advisory locks o
29c50 6e 20 69 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a  n it,.        **
29c60 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 20 74   then the call t
29c70 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c 6c 20 63  o close() will c
29c80 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c 6f 63 6b  ancel those lock
29c90 73 2e 20 49 6e 20 70 72 61 63 74 69 63 65 2c 0a  s. In practice,.
29ca0 20 20 20 20 20 20 20 20 2a 2a 20 77 65 27 72 65          ** we're
29cb0 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 73   assuming that s
29cc0 74 61 74 66 73 28 29 20 64 6f 65 73 6e 27 74 20  tatfs() doesn't 
29cd0 66 61 69 6c 20 76 65 72 79 20 6f 66 74 65 6e 2e  fail very often.
29ce0 20 41 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20   At least.      
29cf0 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c 65 20 6f    ** not while o
29d00 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
29d10 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 62 79 20  ptors opened by 
29d20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
29d30 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   on.        ** t
29d40 68 65 20 73 61 6d 65 20 66 69 6c 65 20 61 72 65  he same file are
29d50 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20   working.  */.  
29d60 20 20 20 20 20 20 70 2d 3e 6c 61 73 74 45 72 72        p->lastErr
29d70 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
29d80 20 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30      if( dirfd>=0
29d90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 6f   ){.          ro
29da0 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 64 69  bust_close(p, di
29db0 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  rfd, __LINE__);.
29dc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29dd0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
29de0 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
29df0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
29e00 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
29e10 53 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  S;.        goto 
29e20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  open_finished;. 
29e30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 73 65       }.      use
29e40 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f  Proxy = !(fsInfo
29e50 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43  .f_flags&MNT_LOC
29e60 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  AL);.    }.    i
29e70 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20  f( useProxy ){. 
29e80 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e       rc = fillIn
29e90 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66  UnixFile(pVfs, f
29ea0 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c  d, dirfd, pFile,
29eb0 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 0a   zPath, noLock,.
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ed0 20 20 20 20 20 20 20 20 20 20 69 73 44 65 6c 65            isDele
29ee0 74 65 2c 20 69 73 52 65 61 64 6f 6e 6c 79 29 3b  te, isReadonly);
29ef0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
29f00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29f10 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72      rc = proxyTr
29f20 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
29f30 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
29f40 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20  , ":auto:");.   
29f50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29f60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29f70 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43      /* Use unixC
29f80 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70  lose to clean up
29f90 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61   the resources a
29fa0 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e  dded in fillInUn
29fb0 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20  ixFile .        
29fc0 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61    ** and clear a
29fd0 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ll the structure
29fe0 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20  's references.  
29ff0 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20  Specifically, . 
2a000 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c           ** pFil
2a010 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c  e->pMethods will
2a020 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69   be NULL so sqli
2a030 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20  te3OsClose will 
2a040 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20  be a no-op .    
2a050 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2a060 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69     unixClose(pFi
2a070 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  le);.          r
2a080 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2a090 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2a0a0 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
2a0b0 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
2a0c0 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d  #endif.  .  rc =
2a0d0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
2a0e0 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c  pVfs, fd, dirfd,
2a0f0 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e   pFile, zPath, n
2a100 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  oLock,.         
2a110 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 44               isD
2a120 65 6c 65 74 65 2c 20 69 73 52 65 61 64 6f 6e 6c  elete, isReadonl
2a130 79 29 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65  y);.open_finishe
2a140 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
2a150 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2a160 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55  lite3_free(p->pU
2a170 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65  nused);.  }.  re
2a180 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2a190 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69  ** Delete the fi
2a1a0 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20  le at zPath. If 
2a1b0 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75  the dirSync argu
2a1c0 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73  ment is true, fs
2a1d0 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72  ync().** the dir
2a1e0 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
2a1f0 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a  eting the file..
2a200 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2a210 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69  ixDelete(.  sqli
2a220 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2a230 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e  ,     /* VFS con
2a240 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20  taining this as 
2a250 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68  the xDelete meth
2a260 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
2a270 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
2a280 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
2a290 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
2a2a0 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63  */.  int dirSync
2a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a2c0 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63  * If true, fsync
2a2d0 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  () directory aft
2a2e0 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65  er deleting file
2a2f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
2a300 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55  = SQLITE_OK;.  U
2a310 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a320 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
2a330 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
2a340 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2a350 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 75  DELETE);.  if( u
2a360 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d  nlink(zPath)==(-
2a370 31 29 20 26 26 20 65 72 72 6e 6f 21 3d 45 4e 4f  1) && errno!=ENO
2a380 45 4e 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ENT ){.    retur
2a390 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
2a3a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
2a3b0 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50  TE, "unlink", zP
2a3c0 61 74 68 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  ath);.  }.#ifnde
2a3d0 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
2a3e0 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20 64  _DIRSYNC.  if( d
2a3f0 69 72 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e  irSync ){.    in
2a400 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f  t fd;.    rc = o
2a410 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61  penDirectory(zPa
2a420 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66  th, &fd);.    if
2a430 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a440 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
2a450 53 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e  S.      if( fsyn
2a460 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73  c(fd)==-1 ).#els
2a470 65 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e  e.      if( fsyn
2a480 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66 0a 20  c(fd) ).#endif. 
2a490 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72       {.        r
2a4a0 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
2a4b0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49  (SQLITE_IOERR_DI
2a4c0 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e 63 22  R_FSYNC, "fsync"
2a4d0 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  , zPath);.      
2a4e0 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  }.      robust_c
2a4f0 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49  lose(0, fd, __LI
2a500 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NE__);.    }.  }
2a510 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
2a520 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65   rc;.}../*.** Te
2a530 73 74 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  st the existance
2a540 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65   of or access pe
2a550 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c  rmissions of fil
2a560 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20  e zPath. The.** 
2a570 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64  test performed d
2a580 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
2a590 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  lue of flags:.**
2a5a0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
2a5b0 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65  CCESS_EXISTS: Re
2a5c0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
2a5d0 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20  le exists.**    
2a5e0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
2a5f0 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e  EADWRITE: Return
2a600 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
2a610 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61  s read and writa
2a620 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ble..**     SQLI
2a630 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e  TE_ACCESS_READON
2a640 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  LY: Return 1 if 
2a650 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
2a660 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  able..**.** Othe
2a670 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a  rwise return 0..
2a680 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2a690 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  ixAccess(.  sqli
2a6a0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2a6b0 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63  ,   /* The VFS c
2a6c0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78  ontaining this x
2a6d0 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f  Access method */
2a6e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2a6f0 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61  Path,      /* Pa
2a700 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  th of the file t
2a710 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69  o examine */.  i
2a720 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2a730 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64         /* What d
2a740 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61  o we want to lea
2a750 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61  rn about the zPa
2a760 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e  th file? */.  in
2a770 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20  t *pResOut      
2a780 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
2a790 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65  esult boolean he
2a7a0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  re */.){.  int a
2a7b0 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53  mode = 0;.  UNUS
2a7c0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2a7d0 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
2a7e0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
2a7f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
2a800 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63  CESS; );.  switc
2a810 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
2a820 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
2a830 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
2a840 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20   amode = F_OK;. 
2a850 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a860 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
2a870 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
2a880 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b      amode = W_OK
2a890 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65  |R_OK;.      bre
2a8a0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2a8b0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a  ITE_ACCESS_READ:
2a8c0 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52  .      amode = R
2a8d0 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
2a8e0 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  ;..    default:.
2a8f0 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
2a900 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
2a910 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
2a920 70 52 65 73 4f 75 74 20 3d 20 28 6f 73 41 63 63  pResOut = (osAcc
2a930 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65  ess(zPath, amode
2a940 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c 61  )==0);.  if( fla
2a950 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
2a960 53 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52 65  S_EXISTS && *pRe
2a970 73 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72 75  sOut ){.    stru
2a980 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
2a990 20 69 66 28 20 30 3d 3d 73 74 61 74 28 7a 50 61   if( 0==stat(zPa
2a9a0 74 68 2c 20 26 62 75 66 29 20 26 26 20 62 75 66  th, &buf) && buf
2a9b0 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20  .st_size==0 ){. 
2a9c0 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20       *pResOut = 
2a9d0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
2a9e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a9f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20  .}.../*.** Turn 
2aa00 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
2aa10 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20  ame into a full 
2aa20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65  pathname. The re
2aa30 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69  lative path.** i
2aa40 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75  s stored as a nu
2aa50 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
2aa60 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66 65  ing in the buffe
2aa70 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a  r pointed to by.
2aa80 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a  ** zPath. .**.**
2aa90 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20   zOut points to 
2aaa0 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c  a buffer of at l
2aab0 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73  east sqlite3_vfs
2aac0 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65  .mxPathname byte
2aad0 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63  s .** (in this c
2aae0 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d  ase, MAX_PATHNAM
2aaf0 45 20 62 79 74 65 73 29 2e 20 54 68 65 20 66 75  E bytes). The fu
2ab00 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74 74  ll-path is writt
2ab10 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75  en to.** this bu
2ab20 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74 75  ffer before retu
2ab30 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
2ab40 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74   int unixFullPat
2ab50 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33  hname(.  sqlite3
2ab60 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2ab70 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2ab80 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
2ab90 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2aba0 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
2abb0 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72     /* Possibly r
2abc0 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61  elative input pa
2abd0 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74  th */.  int nOut
2abe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2abf0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2ac00 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
2ac10 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
2ac20 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20  r *zOut         
2ac30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
2ac40 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29  tput buffer */.)
2ac50 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  {..  /* It's odd
2ac60 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
2ac70 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
2ac80 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
2ac90 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
2aca0 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
2acb0 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
2acc0 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
2acd0 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
2ace0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
2acf0 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74  ling. This funct
2ad00 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69  ion could fail i
2ad10 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  f, for example, 
2ad20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
2ad30 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
2ad40 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69  ry has been unli
2ad50 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  nked..  */.  Sim
2ad60 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
2ad70 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2ad80 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  R );..  assert( 
2ad90 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2ada0 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29  ==MAX_PATHNAME )
2adb0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2adc0 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a  ETER(pVfs);..  z
2add0 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c  Out[nOut-1] = '\
2ade0 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b  0';.  if( zPath[
2adf0 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73  0]=='/' ){.    s
2ae00 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2ae10 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22  nOut, zOut, "%s"
2ae20 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  , zPath);.  }els
2ae30 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64 3b  e{.    int nCwd;
2ae40 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 63 77  .    if( osGetcw
2ae50 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d  d(zOut, nOut-1)=
2ae60 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
2ae70 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
2ae80 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
2ae90 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c 20  BKPT, "getcwd", 
2aea0 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
2aeb0 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29 73 74    nCwd = (int)st
2aec0 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20  rlen(zOut);.    
2aed0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2aee0 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75  (nOut-nCwd, &zOu
2aef0 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20  t[nCwd], "/%s", 
2af00 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65  zPath);.  }.  re
2af10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2af20 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
2af30 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
2af40 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
2af50 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
2af60 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
2af70 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
2af80 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
2af90 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
2afa0 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
2afb0 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
2afc0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63  library..*/.#inc
2afd0 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73  lude <dlfcn.h>.s
2afe0 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78  tatic void *unix
2aff0 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
2b000 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e  fs *NotUsed, con
2b010 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2b020 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me){.  UNUSED_PA
2b030 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2b040 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65  ;.  return dlope
2b050 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c  n(zFilename, RTL
2b060 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f  D_NOW | RTLD_GLO
2b070 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  BAL);.}../*.** S
2b080 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73  QLite calls this
2b090 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69   function immedi
2b0a0 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61  ately after a ca
2b0b0 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28  ll to unixDlSym(
2b0c0 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70  ) or.** unixDlOp
2b0d0 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75  en() fails (retu
2b0e0 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74  rns a null point
2b0f0 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64  er). If a more d
2b100 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a  etailed error.**
2b110 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69   message is avai
2b120 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69  lable, it is wri
2b130 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e  tten to zBufOut.
2b140 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73   If no error mes
2b150 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  sage.** is avail
2b160 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73  able, zBufOut is
2b170 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64   left unmodified
2b180 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73   and SQLite uses
2b190 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72   a default.** er
2b1a0 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
2b1b0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
2b1c0 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
2b1d0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
2b1e0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2b1f0 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20  ufOut){.  const 
2b200 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e  char *zErr;.  UN
2b210 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2b220 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45  otUsed);.  unixE
2b230 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a  nterMutex();.  z
2b240 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b  Err = dlerror();
2b250 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20  .  if( zErr ){. 
2b260 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2b270 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75  ntf(nBuf, zBufOu
2b280 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a  t, "%s", zErr);.
2b290 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
2b2a0 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63  utex();.}.static
2b2b0 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79   void (*unixDlSy
2b2c0 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  m(sqlite3_vfs *N
2b2d0 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c  otUsed, void *p,
2b2e0 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d   const char*zSym
2b2f0 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a  ))(void){.  /* .
2b300 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70    ** GCC with -p
2b310 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73  edantic-errors s
2b320 61 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65  ays that C90 doe
2b330 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f  s not allow a vo
2b340 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63  id* to be.  ** c
2b350 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  ast into a point
2b360 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
2b370 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c  .  And yet the l
2b380 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72  ibrary dlsym() r
2b390 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75  outine.  ** retu
2b3a0 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63  rns a void* whic
2b3b0 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f  h is really a po
2b3c0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
2b3d0 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20  ion.  So how do 
2b3e0 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79  we.  ** use dlsy
2b3f0 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74  m() with -pedant
2b400 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a  ic-errors?.  **.
2b410 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20    ** Variable x 
2b420 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64  below is defined
2b430 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72   to be a pointer
2b440 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
2b450 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d  aking.  ** param
2b460 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20  eters void* and 
2b470 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20  const char* and 
2b480 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e  returning a poin
2b490 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
2b4a0 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69  n..  ** We initi
2b4b0 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67  alize x by assig
2b4c0 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65  ning it a pointe
2b4d0 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29  r to the dlsym()
2b4e0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20   function..  ** 
2b4f0 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74  (That assignment
2b500 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74   requires a cast
2b510 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c  .)  Then we call
2b520 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68   the function th
2b530 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73  at.  ** x points
2b540 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a   to.  .  **.  **
2b550 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e   This work-aroun
2b560 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f  d is unlikely to
2b570 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20   work correctly 
2b580 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68  on any system wh
2b590 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61  ere.  ** you rea
2b5a0 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20  lly cannot cast 
2b5b0 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
2b5c0 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20  er into void*.  
2b5d0 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65  But then, on the
2b5e0 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64  .  ** other hand
2b5f0 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e  , dlsym() will n
2b600 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20  ot work on such 
2b610 61 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c  a system either,
2b620 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a   so we have.  **
2b630 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74   not really lost
2b640 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a   anything..  */.
2b650 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f    void (*(*x)(vo
2b660 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
2b670 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45  )(void);.  UNUSE
2b680 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2b690 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69  sed);.  x = (voi
2b6a0 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e  d(*(*)(void*,con
2b6b0 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29  st char*))(void)
2b6c0 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e  )dlsym;.  return
2b6d0 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a   (*x)(p, zSym);.
2b6e0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
2b6f0 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  ixDlClose(sqlite
2b700 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2b710 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
2b720 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2b730 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64  ER(NotUsed);.  d
2b740 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b  lclose(pHandle);
2b750 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
2b760 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
2b770 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
2b780 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
2b790 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30  ne unixDlOpen  0
2b7a0 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
2b7b0 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
2b7c0 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30  ne unixDlSym   0
2b7d0 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
2b7e0 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
2b7f0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75  ./*.** Write nBu
2b800 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
2b810 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75  m data to the su
2b820 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42  pplied buffer zB
2b830 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
2b840 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73  t unixRandomness
2b850 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2b860 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
2b870 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
2b880 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2b890 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73  (NotUsed);.  ass
2b8a0 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66  ert((size_t)nBuf
2b8b0 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74  >=(sizeof(time_t
2b8c0 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b  )+sizeof(int)));
2b8d0 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74  ..  /* We have t
2b8e0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75  o initialize zBu
2b8f0 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c  f to prevent val
2b900 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72  grind from repor
2b910 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73  ting.  ** errors
2b920 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69  .  The reports i
2b930 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e  ssued by valgrin
2b940 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20  d are incorrect 
2b950 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  - we would.  ** 
2b960 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20  prefer that the 
2b970 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e  randomness be in
2b980 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e  creased by makin
2b990 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  g use of the.  *
2b9a0 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  * uninitialized 
2b9b0 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20  space in zBuf - 
2b9c0 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72  but valgrind err
2b9d0 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72  ors tend to worr
2b9e0 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72  y.  ** some user
2b9f0 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20  s.  Rather than 
2ba00 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20  argue, it seems 
2ba10 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69  easier just to i
2ba20 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74  nitialize.  ** t
2ba30 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61  he whole array a
2ba40 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72  nd silence valgr
2ba50 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61  ind, even if tha
2ba60 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e  t means less ran
2ba70 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20  domness.  ** in 
2ba80 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e  the random seed.
2ba90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
2baa0 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c  testing, initial
2bab0 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20  izing zBuf[] to 
2bac0 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64  zero is all we d
2bad0 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20  o.  That means. 
2bae0 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61   ** that we alwa
2baf0 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ys use the same 
2bb00 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65  random number se
2bb10 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61  quence.  This ma
2bb20 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73  kes the.  ** tes
2bb30 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20  ts repeatable.. 
2bb40 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75   */.  memset(zBu
2bb50 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66  f, 0, nBuf);.#if
2bb60 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2bb70 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69  _TEST).  {.    i
2bb80 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20 20  nt pid, fd;.    
2bb90 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
2bba0 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c  ("/dev/urandom",
2bbb0 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20   O_RDONLY, 0);. 
2bbc0 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
2bbd0 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20       time_t t;. 
2bbe0 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20       time(&t);. 
2bbf0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66       memcpy(zBuf
2bc00 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29  , &t, sizeof(t))
2bc10 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67 65  ;.      pid = ge
2bc20 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65  tpid();.      me
2bc30 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f  mcpy(&zBuf[sizeo
2bc40 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a  f(t)], &pid, siz
2bc50 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 20  eof(pid));.     
2bc60 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
2bc70 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d  t)+sizeof(pid)<=
2bc80 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a  (size_t)nBuf );.
2bc90 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a        nBuf = siz
2bca0 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28  eof(t) + sizeof(
2bcb0 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pid);.    }else{
2bcc0 0a 20 20 20 20 20 20 64 6f 7b 20 6e 42 75 66 20  .      do{ nBuf 
2bcd0 3d 20 6f 73 52 65 61 64 28 66 64 2c 20 7a 42 75  = osRead(fd, zBu
2bce0 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65  f, nBuf); }while
2bcf0 28 20 6e 42 75 66 3c 30 20 26 26 20 65 72 72 6e  ( nBuf<0 && errn
2bd00 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20  o==EINTR );.    
2bd10 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30    robust_close(0
2bd20 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
2bd30 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2bd40 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b  f.  return nBuf;
2bd50 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  .}.../*.** Sleep
2bd60 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
2bd70 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
2bd80 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
2bd90 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72  slept..** The ar
2bda0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75  gument is the nu
2bdb0 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63  mber of microsec
2bdc0 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20  onds we want to 
2bdd0 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65  sleep..** The re
2bde0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
2bdf0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
2be00 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65  oseconds of slee
2be10 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65  p actually.** re
2be20 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
2be30 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72   underlying oper
2be40 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20  ating system, a 
2be50 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20  number which.** 
2be60 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72  might be greater
2be70 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
2be80 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20  o the argument, 
2be90 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20  but not less.** 
2bea0 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  than the argumen
2beb0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2bec0 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74   unixSleep(sqlit
2bed0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2bee0 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64   int microsecond
2bef0 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  s){.#if OS_VXWOR
2bf00 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  KS.  struct time
2bf10 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74  spec sp;..  sp.t
2bf20 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63  v_sec = microsec
2bf30 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a  onds / 1000000;.
2bf40 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28    sp.tv_nsec = (
2bf50 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31  microseconds % 1
2bf60 30 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a  000000) * 1000;.
2bf70 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c    nanosleep(&sp,
2bf80 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44   NULL);.  UNUSED
2bf90 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2bfa0 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ed);.  return mi
2bfb0 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69  croseconds;.#eli
2bfc0 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55  f defined(HAVE_U
2bfd0 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55  SLEEP) && HAVE_U
2bfe0 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d  SLEEP.  usleep(m
2bff0 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20  icroseconds);.  
2c000 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2c010 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
2c020 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  urn microseconds
2c030 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65  ;.#else.  int se
2c040 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65  conds = (microse
2c050 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30  conds+999999)/10
2c060 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73  00000;.  sleep(s
2c070 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45  econds);.  UNUSE
2c080 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2c090 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  sed);.  return s
2c0a0 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a  econds*1000000;.
2c0b0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
2c0c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
2c0d0 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74  riable, if set t
2c0e0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
2c0f0 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74  ue, is interpret
2c100 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  ed as.** the num
2c110 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73  ber of seconds s
2c120 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73  ince 1970 and is
2c130 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65   used to set the
2c140 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71   result of.** sq
2c150 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69  lite3OsCurrentTi
2c160 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74  me() during test
2c170 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
2c180 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
2c190 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
2c1a0 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b  ime = 0;  /* Fak
2c1b0 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e  e system time in
2c1c0 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
2c1d0 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  970. */.#endif..
2c1e0 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
2c1f0 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
2c200 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
2c210 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
2c220 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a  ite into *piNow.
2c230 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ** the current t
2c240 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
2c250 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
2c260 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30  ber times 86_400
2c270 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68  _000.  In.** oth
2c280 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20  er words, write 
2c290 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20  into *piNow the 
2c2a0 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
2c2b0 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65  econds since the
2c2c0 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68   Julian.** epoch
2c2d0 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65   of noon in Gree
2c2e0 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65  nwich on Novembe
2c2f0 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61  r 24, 4714 B.C a
2c300 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a  ccording to the.
2c310 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65  ** proleptic Gre
2c320 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e  gorian calendar.
2c330 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
2c340 73 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  s, return 0.  Re
2c350 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69  turn 1 if the ti
2c360 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e  me and date cann
2c370 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
2c380 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
2c390 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
2c3a0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2c3b0 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e  Used, sqlite3_in
2c3c0 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73  t64 *piNow){.  s
2c3d0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2c3e0 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70  te3_int64 unixEp
2c3f0 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28  och = 24405875*(
2c400 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
2c410 34 30 30 30 30 3b 0a 23 69 66 20 64 65 66 69 6e  40000;.#if defin
2c420 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20  ed(NO_GETTOD).  
2c430 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65  time_t t;.  time
2c440 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d  (&t);.  *piNow =
2c450 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   ((sqlite3_int64
2c460 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45  )t)*1000 + unixE
2c470 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56  poch;.#elif OS_V
2c480 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
2c490 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20  timespec sNow;. 
2c4a0 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43   clock_gettime(C
2c4b0 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26  LOCK_REALTIME, &
2c4c0 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  sNow);.  *piNow 
2c4d0 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30  = unixEpoch + 10
2c4e0 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
2c4f0 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20  4)sNow.tv_sec + 
2c500 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30  sNow.tv_nsec/100
2c510 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74  0000;.#else.  st
2c520 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f  ruct timeval sNo
2c530 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61  w;.  gettimeofda
2c540 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a  y(&sNow, 0);.  *
2c550 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63  piNow = unixEpoc
2c560 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65  h + 1000*(sqlite
2c570 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f  3_int64)sNow.tv_
2c580 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73  sec + sNow.tv_us
2c590 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a  ec/1000;.#endif.
2c5a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2c5b0 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
2c5c0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
2c5d0 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31  {.    *piNow = 1
2c5e0 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
2c5f0 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65  64)sqlite3_curre
2c600 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70  nt_time + unixEp
2c610 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  och;.  }.#endif.
2c620 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2c630 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
2c640 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2c650 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
2c660 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
2c670 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
2c680 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
2c690 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
2c6a0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
2c6b0 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
2c6c0 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
2c6d0 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
2c6e0 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
2c6f0 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
2c700 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
2c710 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2c720 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73  nixCurrentTime(s
2c730 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2c740 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e  sed, double *prN
2c750 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ow){.  sqlite3_i
2c760 6e 74 36 34 20 69 3b 0a 20 20 55 4e 55 53 45 44  nt64 i;.  UNUSED
2c770 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2c780 65 64 29 3b 0a 20 20 75 6e 69 78 43 75 72 72 65  ed);.  unixCurre
2c790 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26  ntTimeInt64(0, &
2c7a0 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69  i);.  *prNow = i
2c7b0 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72  /86400000.0;.  r
2c7c0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2c7d0 2a 20 57 65 20 61 64 64 65 64 20 74 68 65 20 78  * We added the x
2c7e0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d  GetLastError() m
2c7f0 65 74 68 6f 64 20 77 69 74 68 20 74 68 65 20 69  ethod with the i
2c800 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76  ntention of prov
2c810 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20  iding.** better 
2c820 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20  low-level error 
2c830 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70  messages when op
2c840 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70  erating-system p
2c850 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a  roblems come up.
2c860 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65  ** during SQLite
2c870 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74   operation.  But
2c880 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66   so far, none of
2c890 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 69   that has been i
2c8a0 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e  mplemented.** in
2c8b0 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74   the core.  So t
2c8c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
2c8d0 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f  ever called.  Fo
2c8e0 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72  r now, it is mer
2c8f0 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68  ely.** a place-h
2c900 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  older..*/.static
2c910 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74   int unixGetLast
2c920 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
2c930 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
2c940 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a  NotUsed2, char *
2c950 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55  NotUsed3){.  UNU
2c960 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2c970 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44  tUsed);.  UNUSED
2c980 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2c990 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2);.  UNUSED_P
2c9a0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2c9b0 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  3);.  return 0;.
2c9c0 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../*.*********
2c9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2c9e0 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76  End of sqlite3_v
2c9f0 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
2ca00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca10 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
2ca20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca60 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
2ca70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2caa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cab0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
2cac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cad0 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c  ** Begin Proxy L
2cae0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
2caf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cb00 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72  *******.**.** Pr
2cb10 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
2cb20 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d   "uber-locking-m
2cb30 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73  ethod" in this s
2cb40 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20 74  ense:  It uses t
2cb50 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b  he.** other lock
2cb60 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73  ing methods on s
2cb70 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69  econdary lock fi
2cb80 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b  les.  Proxy lock
2cb90 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61  ing is a.** meta
2cba0 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20  -layer over top 
2cbb0 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76 65  of the primitive
2cbc0 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
2cbd0 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72  nted above.  For
2cbe0 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  .** this reason,
2cbf0 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
2cc00 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66  at implements of
2cc10 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
2cc20 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e  s deferred.** un
2cc30 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20  til late in the 
2cc40 66 69 6c 65 20 28 68 65 72 65 29 20 61 66 74 65  file (here) afte
2cc50 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68  r all of the oth
2cc60 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68  er I/O methods h
2cc70 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69  ave.** been defi
2cc80 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68  ned - so that th
2cc90 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b  e primitive lock
2cca0 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20  ing methods are 
2ccb0 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20  available.** as 
2ccc0 73 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70  services to help
2ccd0 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d   with the implem
2cce0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78  entation of prox
2ccf0 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a  y locking..**.**
2cd00 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  **.**.** The def
2cd10 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68  ault locking sch
2cd20 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75  emes in SQLite u
2cd30 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  se byte-range lo
2cd40 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61  cks on the.** da
2cd50 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
2cd60 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20  oordinate safe, 
2cd70 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73  concurrent acces
2cd80 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65  s by multiple re
2cd90 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69  aders.** and wri
2cda0 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c  ters [http://sql
2cdb0 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76  ite.org/lockingv
2cdc0 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69  3.html].  The fi
2cdd0 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a  ve file locking.
2cde0 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43  ** states (UNLOC
2cdf0 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48  KED, PENDING, SH
2ce00 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
2ce10 45 58 43 4c 55 53 49 56 45 29 20 61 72 65 20 69  EXCLUSIVE) are i
2ce20 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73  mplemented.** as
2ce30 20 50 4f 53 49 58 20 72 65 61 64 20 26 20 77 72   POSIX read & wr
2ce40 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66  ite locks over f
2ce50 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61  ixed set of loca
2ce60 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c  tions (via fsctl
2ce70 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64  ),.** on AFP and
2ce80 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73   SMB only exclus
2ce90 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  ive byte-range l
2cea0 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62  ocks are availab
2ceb0 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20  le via fsctl.** 
2cec0 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20  with _IOWR('z', 
2ced0 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52  23, struct ByteR
2cee0 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20  angeLockPB2) to 
2cef0 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35  track the same 5
2cf00 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73   states..** To s
2cf10 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43  imulate a F_RDLC
2cf20 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20  K on the shared 
2cf30 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20  range, on AFP a 
2cf40 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65  randomly selecte
2cf50 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20  d.** address in 
2cf60 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65  the shared range
2cf70 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20   is taken for a 
2cf80 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
2cf90 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65   entire.** share
2cfa0 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e  d range is taken
2cfb0 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56   for an EXCLUSIV
2cfc0 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20  E lock):.**.**  
2cfd0 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45      PENDING_BYTE
2cfe0 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30          0x400000
2cff0 30 30 09 09 20 20 20 09 0a 2a 2a 20 20 20 20 20  00..   ..**     
2d000 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20   RESERVED_BYTE  
2d010 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a       0x40000001.
2d020 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52  **      SHARED_R
2d030 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30  ANGE        0x40
2d040 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30  000002 -> 0x4000
2d050 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  0200.**.** This 
2d060 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68  works well on th
2d070 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  e local file sys
2d080 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61  tem, but shows a
2d090 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20   nearly 100x.** 
2d0a0 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64  slowdown in read
2d0b0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20   performance on 
2d0c0 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20  AFP because the 
2d0d0 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62  AFP client disab
2d0e0 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20  les.** the read 
2d0f0 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d  cache when byte-
2d100 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
2d110 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69  present.  Enabli
2d120 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63  ng the read.** c
2d130 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63  ache exposes a c
2d140 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70  ache coherency p
2d150 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70  roblem that is p
2d160 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53  resent on all OS
2d170 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20   X.** supported 
2d180 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73  network file sys
2d190 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41  tems.  NFS and A
2d1a0 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20  FP both observe 
2d1b0 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d  the.** close-to-
2d1c0 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66  open semantics f
2d1d0 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68  or ensuring cach
2d1e0 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b  e coherency.** [
2d1f0 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63  http://nfs.sourc
2d200 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f  eforge.net/#faq_
2d210 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20  a8], which does 
2d220 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a  not effectively.
2d230 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72  ** address the r
2d240 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20  equirements for 
2d250 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62  concurrent datab
2d260 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75  ase access by mu
2d270 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72  ltiple.** reader
2d280 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a  s and writers.**
2d290 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62   [http://www.nab
2d2a0 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f  ble.com/SQLite-o
2d2b0 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65  n-NFS-cache-cohe
2d2c0 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31  rency-td15655701
2d2d0 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f  .html]..**.** To
2d2e0 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72   address the per
2d2f0 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63  formance and cac
2d300 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73  he coherency iss
2d310 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20  ues, proxy file 
2d320 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67  locking.** chang
2d330 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62  es the way datab
2d340 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f  ase access is co
2d350 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69  ntrolled by limi
2d360 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61  ting access to a
2d370 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20  .** single host 
2d380 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f  at a time and mo
2d390 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ving file locks 
2d3a0 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62  off of the datab
2d3b0 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  ase file.** and 
2d3c0 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c  onto a proxy fil
2d3d0 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66  e on the local f
2d3e0 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a  ile system.  .**
2d3f0 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f  .**.** Using pro
2d400 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d  xy locks.** ----
2d410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
2d420 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a  .** C APIs.**.**
2d430 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
2d440 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
2d450 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  e, SQLITE_SET_LO
2d460 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20  CKPROXYFILE,.** 
2d470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d480 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74        <proxy_pat
2d490 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a  h> | ":auto:");.
2d4a0 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
2d4b0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
2d4c0 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f  ame, SQLITE_GET_
2d4d0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26  LOCKPROXYFILE, &
2d4e0 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a  <proxy_path>);.*
2d4f0 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67  *.**.** SQL prag
2d500 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d  mas.**.**  PRAGM
2d510 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63  A [database.]loc
2d520 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72  k_proxy_file=<pr
2d530 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74  oxy_path> | :aut
2d540 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  o:.**  PRAGMA [d
2d550 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72  atabase.]lock_pr
2d560 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53  oxy_file.**.** S
2d570 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f  pecifying ":auto
2d580 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  :" means that if
2d590 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63   there is a conc
2d5a0 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61  h file with a ma
2d5b0 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49  tching.** host I
2d5c0 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f  D in it, the pro
2d5d0 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20 63  xy path in the c
2d5e0 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62  onch file will b
2d5f0 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73  e used, otherwis
2d600 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74  e.** a proxy pat
2d610 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75  h based on the u
2d620 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a  ser's temp dir.*
2d630 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f  * (via confstr(_
2d640 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
2d650 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69  EMP_DIR,...)) wi
2d660 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20 74  ll be used and t
2d670 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f  he.** actual pro
2d680 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  xy file name is 
2d690 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
2d6a0 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68  he name and path
2d6b0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
2d6c0 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65  ase file.  For e
2d6d0 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
2d6e0 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65      For database
2d6f0 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65   path "/Users/me
2d700 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20  /foo.db" .**    
2d710 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68     The lock path
2d720 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69   will be "<tmpdi
2d730 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f  r>/sqliteplocks/
2d740 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62  _Users_me_foo.db
2d750 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f  :auto:").**.** O
2d760 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79  nce a lock proxy
2d770 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66   is configured f
2d780 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
2d790 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e  nnection, it can
2d7a0 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76   not.** be remov
2d7b0 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d  ed, however it m
2d7c0 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20 74  ay be switched t
2d7d0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72  o a different pr
2d7e0 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20  oxy path via.** 
2d7f0 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20 28  the above APIs (
2d800 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e  assuming the con
2d810 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62  ch file is not b
2d820 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f  eing held by ano
2d830 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ther.** connecti
2d840 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20  on or process). 
2d850 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72  .**.**.** How pr
2d860 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  oxy locking work
2d870 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
2d880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
2d890 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f  ** Proxy file lo
2d8a0 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69  cking relies pri
2d8b0 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65  marily on two ne
2d8c0 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c  w supporting fil
2d8d0 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  es: .**.**   *  
2d8e0 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69  conch file to li
2d8f0 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74 68  mit access to th
2d900 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2d910 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74  to a single host
2d920 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74 69  .**      at a ti
2d930 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72  me.**.**   *  pr
2d940 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20  oxy file to act 
2d950 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74  as a proxy for t
2d960 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  he advisory lock
2d970 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20  s normally.**   
2d980 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20     taken on the 
2d990 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54  database.**.** T
2d9a0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20  he conch file - 
2d9b0 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20 66  to use a proxy f
2d9c0 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74  ile, sqlite must
2d9d0 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65   first "hold the
2d9e0 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61   conch".** by ta
2d9f0 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73  king an sqlite-s
2da00 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b  tyle shared lock
2da10 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   on the conch fi
2da20 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a  le, reading the.
2da30 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20  ** contents and 
2da40 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f  comparing the ho
2da50 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74  st's unique host
2da60 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20   ID (see below) 
2da70 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78  and lock.** prox
2da80 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20 74  y path against t
2da90 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
2daa0 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20   in the conch.  
2dab0 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69  The conch file i
2dac0 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74  s.** stored in t
2dad0 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
2dae0 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  y as the databas
2daf0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
2db00 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70  ile name.** is p
2db10 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20 74  atterned after t
2db20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2db30 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61   name as ".<data
2db40 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22  basename>-conch"
2db50 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63  ..** If the conc
2db60 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  h file does not 
2db70 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63  exist, or it's c
2db80 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d  ontents do not m
2db90 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74  atch the.** host
2dba0 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79   ID and/or proxy
2dbb0 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20   path, then the 
2dbc0 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65  lock is escalate
2dbd0 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  d to an exclusiv
2dbe0 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68  e.** lock and th
2dbf0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e  e conch file con
2dc00 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64  tents is updated
2dc10 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49   with the host I
2dc20 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70  D and proxy.** p
2dc30 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ath and the lock
2dc40 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74   is downgraded t
2dc50 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  o a shared lock 
2dc60 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63  again.  If the c
2dc70 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20  onch.** is held 
2dc80 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  by another proce
2dc90 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65  ss (with a share
2dca0 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63  d lock), the exc
2dcb0 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77  lusive lock.** w
2dcc0 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c  ill fail and SQL
2dcd0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
2dce0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
2dcf0 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73  proxy file - a s
2dd00 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20  ingle-byte file 
2dd10 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76  used for all adv
2dd20 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73  isory file locks
2dd30 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b  .** normally tak
2dd40 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
2dd50 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20  se file.   This 
2dd60 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20  allows for safe 
2dd70 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68  sharing.** of th
2dd80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2dd90 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61  for multiple rea
2dda0 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73  ders and writers
2ddb0 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
2ddc0 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20  host (the conch 
2ddd0 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
2dde0 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61  y all use the sa
2ddf0 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  me local lock fi
2de00 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65  le)..**.** Reque
2de10 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70  sting the lock p
2de20 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d  roxy does not im
2de30 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74  mediately take t
2de40 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a  he conch, it is.
2de50 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68  ** only taken wh
2de60 65 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71  en the first req
2de70 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74  uest to lock dat
2de80 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61  abase file is ma
2de90 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61  de.  .** This ma
2dea0 74 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74  tches the semant
2deb0 69 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69  ics of the tradi
2dec0 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62  tional locking b
2ded0 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a  ehavior, where.*
2dee0 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e  * opening a conn
2def0 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61  ection to a data
2df00 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e  base file does n
2df10 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f  ot take a lock o
2df20 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61  n it..** The sha
2df30 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20  red lock and an 
2df40 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  open file descri
2df50 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69  ptor are maintai
2df60 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68  ned until .** th
2df70 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
2df80 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2df90 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  closed. .**.** T
2dfa0 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e  he proxy file an
2dfb0 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  d the lock file 
2dfc0 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65  are never delete
2dfd0 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e  d so they only n
2dfe0 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65  eed.** to be cre
2dff0 61 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74  ated the first t
2e000 69 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65  ime they are use
2e010 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  d..**.** Configu
2e020 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a  ration options.*
2e030 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
2e040 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53  -------.**.**  S
2e050 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
2e060 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a  XY_LOCKING.**.**
2e070 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65 20         Database 
2e080 66 69 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f  files accessed o
2e090 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65  n non-local file
2e0a0 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20   systems are.** 
2e0b0 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61        automatica
2e0c0 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66  lly configured f
2e0d0 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
2e0e0 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65  , lock files are
2e0f0 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20  .**       named 
2e100 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73  automatically us
2e110 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67  ing the same log
2e120 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50  ic as.**       P
2e130 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79  RAGMA lock_proxy
2e140 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a  _file=":auto:".*
2e150 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45  *    .**  SQLITE
2e160 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a  _PROXY_DEBUG.**.
2e170 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73  **       Enables
2e180 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20   the logging of 
2e190 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64  error messages d
2e1a0 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69  uring host id fi
2e1b0 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72  le.**       retr
2e1c0 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69  ieval and creati
2e1d0 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52  on.**.**  LOCKPR
2e1e0 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20  OXYDIR.**.**    
2e1f0 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65     Overrides the
2e200 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f   default directo
2e210 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ry used for lock
2e220 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61   proxy files tha
2e230 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e  t.**       are n
2e240 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
2e250 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 74  ly via the ":aut
2e260 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a  o:" setting.**.*
2e270 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  *  SQLITE_DEFAUL
2e280 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
2e290 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20  SSIONS.**.**    
2e2a0 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74     Permissions t
2e2b0 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74  o use when creat
2e2c0 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20  ing a directory 
2e2d0 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a  for storing the.
2e2e0 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72  **       lock pr
2e2f0 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20  oxy files, only 
2e300 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52  used when LOCKPR
2e310 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65  OXYDIR is not se
2e320 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20  t..**    .**    
2e330 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64  .** As mentioned
2e340 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d   above, when com
2e350 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
2e360 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
2e370 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69  OCKING,.** setti
2e380 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65  ng the environme
2e390 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49  nt variable SQLI
2e3a0 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
2e3b0 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c  OCKING to 1 will
2e3c0 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20  .** force proxy 
2e3d0 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73  locking to be us
2e3e0 65 64 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  ed for every dat
2e3f0 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65  abase file opene
2e400 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c  d, and 0.** will
2e410 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63   force automatic
2e420 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74   proxy locking t
2e430 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f  o be disabled fo
2e440 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a  r all database.*
2e450 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69  * files (explici
2e460 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53  ty calling the S
2e470 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
2e480 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f  OXYFILE pragma o
2e490 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65  r.** sqlite_file
2e4a0 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20  _control API is 
2e4b0 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20  not affected by 
2e4c0 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
2e4d0 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a  XY_LOCKING)..*/.
2e4e0 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63  ./*.** Proxy loc
2e4f0 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
2e500 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58  ilable on MacOSX
2e510 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64   .*/.#if defined
2e520 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2e530 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2e540 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a  KING_STYLE../*.*
2e550 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69  * The proxyLocki
2e560 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68  ngContext has th
2e570 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20  e path and file 
2e580 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74  structures for t
2e590 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e  he remote .** an
2e5a0 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69  d local proxy fi
2e5b0 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70  les in it.*/.typ
2e5c0 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78  edef struct prox
2e5d0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2e5e0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2e5f0 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78  ext;.struct prox
2e600 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2e610 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f  {.  unixFile *co
2e620 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  nchFile;        
2e630 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66   /* Open conch f
2e640 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63  ile */.  char *c
2e650 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20  onchFilePath;   
2e660 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2e670 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
2e680 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c  */.  unixFile *l
2e690 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20  ockProxy;       
2e6a0 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20    /* Open proxy 
2e6b0 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
2e6c0 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61  har *lockProxyPa
2e6d0 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  th;         /* N
2e6e0 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79  ame of the proxy
2e6f0 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
2e700 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
2e710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e720 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Name of the open
2e730 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63   file */.  int c
2e740 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20  onchHeld;       
2e750 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20          /* 1 if 
2e760 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c  the conch is hel
2e770 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73  d, -1 if lockles
2e780 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64  s */.  void *old
2e790 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  LockingContext; 
2e7a0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
2e7b0 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74  lockingcontext t
2e7c0 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f  o restore on clo
2e7d0 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
2e7e0 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
2e7f0 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20   *pOldMethod;   
2e800 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f    /* Original I/
2e810 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c  O methods for cl
2e820 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a  ose */.};../* .*
2e830 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
2e840 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74   file path for t
2e850 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64  he database at d
2e860 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  bPath is written
2e870 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a   into lPath, .**
2e880 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e   which must poin
2e890 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74  t to valid, writ
2e8a0 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67  able memory larg
2e8b0 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d  e enough for a m
2e8c0 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20  axLen length.** 
2e8d0 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73  file path. .*/.s
2e8e0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
2e8f0 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  etLockPath(const
2e900 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63   char *dbPath, c
2e910 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65  har *lPath, size
2e920 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e  _t maxLen){.  in
2e930 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c  t len;.  int dbL
2e940 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  en;.  int i;..#i
2e950 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49  fdef LOCKPROXYDI
2e960 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  R.  len = strlcp
2e970 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f  y(lPath, LOCKPRO
2e980 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a  XYDIR, maxLen);.
2e990 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43  #else.# ifdef _C
2e9a0 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
2e9b0 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69  MP_DIR.  {.    i
2e9c0 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f  f( !confstr(_CS_
2e9d0 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
2e9e0 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78  _DIR, lPath, max
2e9f0 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53  Len) ){.      OS
2ea00 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50  TRACE(("GETLOCKP
2ea10 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65  ATH  failed %s e
2ea20 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e  rrno=%d pid=%d\n
2ea30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2ea40 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20    lPath, errno, 
2ea50 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20  getpid()));.    
2ea60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ea70 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
2ea80 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  }.    len = strl
2ea90 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69  cat(lPath, "sqli
2eaa0 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65  teplocks", maxLe
2eab0 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c  n);    .  }.# el
2eac0 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  se.  len = strlc
2ead0 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f  py(lPath, "/tmp/
2eae0 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e  ", maxLen);.# en
2eaf0 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  dif.#endif..  if
2eb00 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d  ( lPath[len-1]!=
2eb10 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d  '/' ){.    len =
2eb20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
2eb30 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  "/", maxLen);.  
2eb40 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66  }.  .  /* transf
2eb50 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20  orm the db path 
2eb60 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68  to a unique cach
2eb70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65  e name */.  dbLe
2eb80 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
2eb90 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20  dbPath);.  for( 
2eba0 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20  i=0; i<dbLen && 
2ebb0 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d  (i+len+7)<(int)m
2ebc0 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  axLen; i++){.   
2ebd0 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74 68   char c = dbPath
2ebe0 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69  [i];.    lPath[i
2ebf0 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29  +len] = (c=='/')
2ec00 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50  ?'_':c;.  }.  lP
2ec10 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b  ath[i+len]='\0';
2ec20 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68  .  strlcat(lPath
2ec30 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c  , ":auto:", maxL
2ec40 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  en);.  OSTRACE((
2ec50 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72  "GETLOCKPATH  pr
2ec60 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
2ec70 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74   pid=%d\n", lPat
2ec80 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
2ec90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2eca0 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72  K;.}../* . ** Cr
2ecb0 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66  eates the lock f
2ecc0 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73  ile and any miss
2ecd0 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 20  ing directories 
2ece0 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a  in lockPath. */.
2ecf0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2ed00 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63  CreateLockPath(c
2ed10 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50  onst char *lockP
2ed20 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c  ath){.  int i, l
2ed30 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d  en;.  char buf[M
2ed40 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e  AXPATHLEN];.  in
2ed50 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a  t start = 0;.  .
2ed60 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74    assert(lockPat
2ed70 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74  h!=NULL);.  /* t
2ed80 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c  ry to create all
2ed90 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
2eda0 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f  e directories */
2edb0 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74  .  len = (int)st
2edc0 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a  rlen(lockPath);.
2edd0 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50    buf[0] = lockP
2ede0 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69  ath[0];.  for( i
2edf0 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29  =1; i<len; i++ )
2ee00 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61  {.    if( lockPa
2ee10 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20  th[i] == '/' && 
2ee20 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20  (i - start > 0) 
2ee30 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79  ){.      /* only
2ee40 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64   mkdir if leaf d
2ee50 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22  ir != "." or "/"
2ee60 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20   or ".." */.    
2ee70 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20    if( i-start>2 
2ee80 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26  || (i-start==1 &
2ee90 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
2eea0 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74  '.' && buf[start
2eeb0 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20  ] != '/') .     
2eec0 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d      || (i-start=
2eed0 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  =2 && buf[start]
2eee0 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73   != '.' && buf[s
2eef0 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20  tart+1] != '.') 
2ef00 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69  ){.        buf[i
2ef10 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  ]='\0';.        
2ef20 69 66 28 20 6d 6b 64 69 72 28 62 75 66 2c 20 53  if( mkdir(buf, S
2ef30 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
2ef40 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
2ef50 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NS) ){.         
2ef60 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a   int err=errno;.
2ef70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72            if( er
2ef80 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20 20  r!=EEXIST ) {.  
2ef90 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
2efa0 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41  E(("CREATELOCKPA
2efb0 54 48 20 20 46 41 49 4c 45 44 20 63 72 65 61 74  TH  FAILED creat
2efc0 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20 20  ing %s, ".      
2efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2efe0 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20  '%s' proxy lock 
2eff0 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
2f000 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2f010 20 20 20 20 20 20 20 20 62 75 66 2c 20 73 74 72          buf, str
2f020 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b  error(err), lock
2f030 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29  Path, getpid()))
2f040 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
2f050 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20 20  turn err;.      
2f060 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2f070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
2f080 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20  art=i+1;.    }. 
2f090 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b     buf[i] = lock
2f0a0 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f  Path[i];.  }.  O
2f0b0 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45 4c  STRACE(("CREATEL
2f0c0 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c  OCKPATH  proxy l
2f0d0 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
2f0e0 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68 2c  %d\n", lockPath,
2f0f0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72   getpid()));.  r
2f100 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2f110 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 56  * Create a new V
2f120 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  FS file descript
2f130 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65  or (stored in me
2f140 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
2f150 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
2f160 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74  lloc) and open t
2f170 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70  he file named "p
2f180 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65  ath" in the file
2f190 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a   descriptor..**.
2f1a0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  ** The caller is
2f1b0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74   responsible not
2f1c0 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e   only for closin
2f1d0 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  g the file descr
2f1e0 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73  iptor.** but als
2f1f0 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  o for freeing th
2f200 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  e memory associa
2f210 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6c  ted with the fil
2f220 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f  e descriptor..*/
2f230 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2f240 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
2f250 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2f260 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a  *path,        /*
2f270 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65   path for the ne
2f280 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20  w unixFile */.  
2f290 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46    unixFile **ppF
2f2a0 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e  ile,       /* un
2f2b0 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20 61  ixFile created a
2f2c0 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 72  nd returned by r
2f2d0 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  ef */.    int is
2f2e0 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20  lockfile        
2f2f0 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72     /* if non zer
2f300 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77  o missing dirs w
2f310 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a  ill be created *
2f320 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d  /.) {.  int fd =
2f330 20 2d 31 3b 0a 20 20 69 6e 74 20 64 69 72 66 64   -1;.  int dirfd
2f340 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c   = -1;.  unixFil
2f350 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  e *pNew;.  int r
2f360 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2f370 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
2f380 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
2f390 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  T;.  sqlite3_vfs
2f3a0 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74   dummyVfs;.  int
2f3b0 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55   terrno = 0;.  U
2f3c0 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
2f3d0 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  used = NULL;..  
2f3e0 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79 20  /* 1. first try 
2f3f0 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
2f400 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20  he file.  ** 2. 
2f410 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61  if that fails, a
2f420 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63  nd this is a loc
2f430 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63  k file (not-conc
2f440 68 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67  h), try creating
2f450 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74  .  ** the parent
2f460 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64   directories and
2f470 20 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e   then try again.
2f480 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74  .  ** 3. if that
2f490 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f   fails, try to o
2f4a0 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61  pen the file rea
2f4b0 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65  d-only.  ** othe
2f4c0 72 77 69 73 65 20 72 65 74 75 72 6e 20 42 55 53  rwise return BUS
2f4d0 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29  Y (if lock file)
2f4e0 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72   or CANTOPEN for
2f4f0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a   the conch file.
2f500 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d    */.  pUnused =
2f510 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28   findReusableFd(
2f520 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29  path, openFlags)
2f530 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64 20  ;.  if( pUnused 
2f540 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75  ){.    fd = pUnu
2f550 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65  sed->fd;.  }else
2f560 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  {.    pUnused = 
2f570 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
2f580 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29  izeof(*pUnused))
2f590 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75 73  ;.    if( !pUnus
2f5a0 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ed ){.      retu
2f5b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2f5c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2f5d0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20   fd<0 ){.    fd 
2f5e0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61  = robust_open(pa
2f5f0 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53  th, openFlags, S
2f600 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
2f610 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
2f620 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72  .    terrno = er
2f630 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  rno;.    if( fd<
2f640 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45  0 && errno==ENOE
2f650 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65  NT && islockfile
2f660 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72   ){.      if( pr
2f670 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74  oxyCreateLockPat
2f680 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54  h(path) == SQLIT
2f690 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2f6a0 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
2f6b0 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
2f6c0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
2f6d0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
2f6e0 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  S);.      }.    
2f6f0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  }.  }.  if( fd<0
2f700 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67   ){.    openFlag
2f710 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20  s = O_RDONLY;.  
2f720 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
2f730 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
2f740 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  gs, SQLITE_DEFAU
2f750 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
2f760 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f  ONS);.    terrno
2f770 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20   = errno;.  }.  
2f780 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
2f790 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29  if( islockfile )
2f7a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2f7b0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
2f7c0 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 74 65  }.    switch (te
2f7d0 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61  rrno) {.      ca
2f7e0 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20  se EACCES:.     
2f7f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f800 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73  _PERM;.      cas
2f810 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20  e EIO: .        
2f820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2f830 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65  ERR_LOCK; /* eve
2f840 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 74  n though it is t
2f850 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20  he conch */.    
2f860 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
2f870 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f880 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
2f890 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70      }.  }.  .  p
2f8a0 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  New = (unixFile 
2f8b0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
2f8c0 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b  (sizeof(*pNew));
2f8d0 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c  .  if( pNew==NUL
2f8e0 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  L ){.    rc = SQ
2f8f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2f900 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f  goto end_create_
2f910 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d  proxy;.  }.  mem
2f920 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
2f930 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
2f940 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67    pNew->openFlag
2f950 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
2f960 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 56 66   memset(&dummyVf
2f970 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d  s, 0, sizeof(dum
2f980 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79  myVfs));.  dummy
2f990 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28  Vfs.pAppData = (
2f9a0 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49  void*)&autolockI
2f9b0 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79  oFinder;.  dummy
2f9c0 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d  Vfs.zName = "dum
2f9d0 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e  my";.  pUnused->
2f9e0 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73  fd = fd;.  pUnus
2f9f0 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e  ed->flags = open
2fa00 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70  Flags;.  pNew->p
2fa10 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64  Unused = pUnused
2fa20 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c  ;.  .  rc = fill
2fa30 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d  InUnixFile(&dumm
2fa40 79 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c  yVfs, fd, dirfd,
2fa50 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2fa60 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 2c 20 30  pNew, path, 0, 0
2fa70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
2fa80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fa90 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b   *ppFile = pNew;
2faa0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2fab0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63  TE_OK;.  }.end_c
2fac0 72 65 61 74 65 5f 70 72 6f 78 79 3a 20 20 20 20  reate_proxy:    
2fad0 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28  .  robust_close(
2fae0 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  pNew, fd, __LINE
2faf0 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  __);.  sqlite3_f
2fb00 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 73 71 6c  ree(pNew);.  sql
2fb10 69 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73 65  ite3_free(pUnuse
2fb20 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
2fb30 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
2fb40 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61  E_TEST./* simula
2fb50 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74  te multiple host
2fb60 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e  s by creating un
2fb70 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65  ique hostid file
2fb80 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71   paths */.int sq
2fb90 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
2fba0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 64   = 0;.#endif..#d
2fbb0 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53 54  efine PROXY_HOST
2fbc0 49 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a 20  IDLEN    16  /* 
2fbd0 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74 20  conch file host 
2fbe0 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a  id length */../*
2fbf0 20 4e 6f 74 20 61 6c 77 61 79 73 20 64 65 66 69   Not always defi
2fc00 6e 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  ned in the heade
2fc10 72 73 20 61 73 20 69 74 20 6f 75 67 68 74 20 74  rs as it ought t
2fc20 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72 6e 20 69  o be */.extern i
2fc30 6e 74 20 67 65 74 68 6f 73 74 75 75 69 64 28 75  nt gethostuuid(u
2fc40 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e 73 74 20  uid_t id, const 
2fc50 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
2fc60 2a 77 61 69 74 29 3b 0a 0a 2f 2a 20 67 65 74 20  *wait);../* get 
2fc70 74 68 65 20 68 6f 73 74 20 49 44 20 76 69 61 20  the host ID via 
2fc80 67 65 74 68 6f 73 74 75 75 69 64 28 29 2c 20 70  gethostuuid(), p
2fc90 48 6f 73 74 49 44 20 6d 75 73 74 20 70 6f 69 6e  HostID must poin
2fca0 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49  t to PROXY_HOSTI
2fcb0 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f  DLEN .** bytes o
2fcc0 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72  f writable memor
2fcd0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
2fce0 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28   proxyGetHostID(
2fcf0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2fd00 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70 45 72  HostID, int *pEr
2fd10 72 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 50  ror){.  assert(P
2fd20 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d  ROXY_HOSTIDLEN =
2fd30 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29  = sizeof(uuid_t)
2fd40 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f 73  );.  memset(pHos
2fd50 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f  tID, 0, PROXY_HO
2fd60 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66 20 64 65  STIDLEN);.#if de
2fd70 66 69 6e 65 64 28 5f 5f 4d 41 58 5f 4f 53 5f 58  fined(__MAX_OS_X
2fd80 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51  _VERSION_MIN_REQ
2fd90 55 49 52 45 44 29 5c 0a 20 20 20 20 20 20 20 20  UIRED)\.        
2fda0 20 20 20 20 20 20 20 26 26 20 5f 5f 4d 41 43 5f         && __MAC_
2fdb0 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e  OS_X_VERSION_MIN
2fdc0 5f 52 45 51 55 49 52 45 44 3c 31 30 35 30 0a 20  _REQUIRED<1050. 
2fdd0 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f   {.    static co
2fde0 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73  nst struct times
2fdf0 70 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31  pec timeout = {1
2fe00 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74  , 0}; /* 1 sec t
2fe10 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 20 20 69 66  imeout */.    if
2fe20 28 20 67 65 74 68 6f 73 74 75 75 69 64 28 70 48  ( gethostuuid(pH
2fe30 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f 75 74 29  ostID, &timeout)
2fe40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72   ){.      int er
2fe50 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  r = errno;.     
2fe60 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20   if( pError ){. 
2fe70 20 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d         *pError =
2fe80 20 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20   err;.      }.  
2fe90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2fea0 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
2feb0 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
2fec0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f   SQLITE_TEST.  /
2fed0 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69  * simulate multi
2fee0 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65  ple hosts by cre
2fef0 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73  ating unique hos
2ff00 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a  tid file paths *
2ff10 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
2ff20 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29  hostid_num != 0)
2ff30 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30 5d  {.    pHostID[0]
2ff40 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74 49   = (char)(pHostI
2ff50 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73 71  D[0] + (char)(sq
2ff60 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
2ff70 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23   & 0xFF));.  }.#
2ff80 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72  endif.  .  retur
2ff90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2ffa0 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  /* The conch fil
2ffb0 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 68  e contains the h
2ffc0 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20 61  eader, host id a
2ffd0 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  nd lock file pat
2ffe0 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  h. */.#define PR
2fff0 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
30000 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20 68   2   /* 1-byte h
30010 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20 68  eader, 16-byte h
30020 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a  ost id, path */.
30030 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 45  #define PROXY_HE
30040 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20 2f  ADERLEN    1   /
30050 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65 61  * conch file hea
30060 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64  der length */.#d
30070 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54 48  efine PROXY_PATH
30080 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59 5f  INDEX    (PROXY_
30090 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
300a0 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66 69  HOSTIDLEN).#defi
300b0 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  ne PROXY_MAXCONC
300c0 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45 41  HLEN  (PROXY_HEA
300d0 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53  DERLEN+PROXY_HOS
300e0 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45  TIDLEN+MAXPATHLE
300f0 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73  N)../* .** Takes
30100 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66   an open conch f
30110 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65 20  ile, copies the 
30120 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e 65  contents to a ne
30130 77 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e 20  w path and then 
30140 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61 63  moves .** it bac
30150 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63 72  k.  The newly cr
30160 65 61 74 65 64 20 66 69 6c 65 27 73 20 66 69 6c  eated file's fil
30170 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
30180 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0a  assigned to the.
30190 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73 74  ** conch file st
301a0 72 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e 61  ructure and fina
301b0 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  lly the original
301c0 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73 63   conch file desc
301d0 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c  riptor is .** cl
301e0 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20 7a  osed.  Returns z
301f0 65 72 6f 20 69 66 20 73 75 63 63 65 73 73 66 75  ero if successfu
30200 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
30210 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68   proxyBreakConch
30220 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
30230 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48  File, uuid_t myH
30240 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c  ostID){.  proxyL
30250 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
30260 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
30270 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
30280 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
30290 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt; .  unixFile 
302a0 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74  *conchFile = pCt
302b0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  x->conchFile;.  
302c0 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50 41  char tPath[MAXPA
302d0 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62  THLEN];.  char b
302e0 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
302f0 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63  HLEN];.  char *c
30300 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  Path = pCtx->con
30310 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73 69  chFilePath;.  si
30320 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20 30  ze_t readLen = 0
30330 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c  ;.  size_t pathL
30340 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65  en = 0;.  char e
30350 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a  rrmsg[64] = "";.
30360 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
30370 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20   int rc = -1;.  
30380 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
30390 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f  (myHostID);..  /
303a0 2a 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70  * create a new p
303b0 61 74 68 20 62 79 20 72 65 70 6c 61 63 65 20 74  ath by replace t
303c0 68 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f  he trailing '-co
303d0 6e 63 68 27 20 77 69 74 68 20 27 2d 62 72 65 61  nch' with '-brea
303e0 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20  k' */.  pathLen 
303f0 3d 20 73 74 72 6c 63 70 79 28 74 50 61 74 68 2c  = strlcpy(tPath,
30400 20 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c   cPath, MAXPATHL
30410 45 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68 4c  EN);.  if( pathL
30420 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c  en>MAXPATHLEN ||
30430 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20   pathLen<6 || . 
30440 20 20 20 20 28 73 74 72 6c 63 70 79 28 26 74 50      (strlcpy(&tP
30450 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20  ath[pathLen-5], 
30460 22 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20 35  "break", 6) != 5
30470 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
30480 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
30490 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c  (errmsg),errmsg,
304a0 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65 6e  "path error (len
304b0 20 25 64 29 22 2c 28 69 6e 74 29 70 61 74 68 4c   %d)",(int)pathL
304c0 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  en);.    goto en
304d0 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
304e0 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 63  .  /* read the c
304f0 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  onch content */.
30500 20 20 72 65 61 64 4c 65 6e 20 3d 20 6f 73 50 72    readLen = osPr
30510 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ead(conchFile->h
30520 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58  , buf, PROXY_MAX
30530 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20  CONCHLEN, 0);.  
30540 69 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58  if( readLen<PROX
30550 59 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20  Y_PATHINDEX ){. 
30560 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
30570 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
30580 67 29 2c 65 72 72 6d 73 67 2c 22 72 65 61 64 20  g),errmsg,"read 
30590 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
305a0 28 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20  (int)readLen);. 
305b0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
305c0 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20  klock;.  }.  /* 
305d0 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
305e0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62 72  the temporary br
305f0 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64  eak file */.  fd
30600 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 74   = robust_open(t
30610 50 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f  Path, (O_RDWR|O_
30620 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 0a 20  CREAT|O_EXCL),. 
30630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30640 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
30650 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
30660 53 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29  S);.  if( fd<0 )
30670 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
30680 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
30690 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22  rmsg), errmsg, "
306a0 63 72 65 61 74 65 20 66 61 69 6c 65 64 20 28 25  create failed (%
306b0 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
306c0 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
306d0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ock;.  }.  if( o
306e0 73 50 77 72 69 74 65 28 66 64 2c 20 62 75 66 2c  sPwrite(fd, buf,
306f0 20 72 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20   readLen, 0) != 
30700 28 73 73 69 7a 65 5f 74 29 72 65 61 64 4c 65 6e  (ssize_t)readLen
30710 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
30720 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
30730 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c  errmsg), errmsg,
30740 20 22 77 72 69 74 65 20 66 61 69 6c 65 64 20 28   "write failed (
30750 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  %d)", errno);.  
30760 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
30770 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lock;.  }.  if( 
30780 72 65 6e 61 6d 65 28 74 50 61 74 68 2c 20 63 50  rename(tPath, cP
30790 61 74 68 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ath) ){.    sqli
307a0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
307b0 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72  eof(errmsg), err
307c0 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20 66 61 69  msg, "rename fai
307d0 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
307e0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
307f0 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
30800 20 72 63 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e   rc = 0;.  fprin
30810 74 66 28 73 74 64 65 72 72 2c 20 22 62 72 6f 6b  tf(stderr, "brok
30820 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20  e stale lock on 
30830 25 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20  %s\n", cPath);. 
30840 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
30850 69 6c 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  ile, conchFile->
30860 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
30870 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66  conchFile->h = f
30880 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  d;.  conchFile->
30890 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
308a0 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65  WR | O_CREAT;..e
308b0 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20  nd_breaklock:.  
308c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
308d0 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ( fd>=0 ){.     
308e0 20 75 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a   unlink(tPath);.
308f0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
30900 73 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f  se(pFile, fd, __
30910 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20  LINE__);.    }. 
30920 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
30930 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 62 72  r, "failed to br
30940 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f  eak stale lock o
30950 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61  n %s, %s\n", cPa
30960 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d  th, errmsg);.  }
30970 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30980 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65 71  ./* Take the req
30990 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  uested lock on t
309a0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e  he conch file an
309b0 64 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65 20  d break a stale 
309c0 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20  lock if the .** 
309d0 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2e  host id matches.
309e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
309f0 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e  roxyConchLock(un
30a00 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  ixFile *pFile, u
30a10 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20  uid_t myHostID, 
30a20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20  int lockType){. 
30a30 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
30a40 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
30a50 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
30a60 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
30a70 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e  ngContext; .  un
30a80 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
30a90 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
30aa0 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ile;.  int rc = 
30ab0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
30ac0 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20 20 73   nTries = 0;.  s
30ad0 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 63  truct timespec c
30ae0 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a  onchModTime;.  .
30af0 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20    do {.    rc = 
30b00 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
30b10 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
30b20 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
30b30 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20  le, lockType);. 
30b40 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20     nTries ++;.  
30b50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30b60 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 2f  _BUSY ){.      /
30b70 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66 61  * If the lock fa
30b80 69 6c 65 64 20 28 62 75 73 79 29 3a 0a 20 20 20  iled (busy):.   
30b90 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a 20 67      * 1st try: g
30ba0 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  et the mod time 
30bb0 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20 77 61  of the conch, wa
30bc0 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72 79 20  it 0.5s and try 
30bd0 61 67 61 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a  again. .       *
30be0 20 32 6e 64 20 74 72 79 3a 20 66 61 69 6c 20 69   2nd try: fail i
30bf0 66 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 63  f the mod time c
30c00 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 74 20 69  hanged or host i
30c10 64 20 69 73 20 64 69 66 66 65 72 65 6e 74 2c 20  d is different, 
30c20 77 61 69 74 20 0a 20 20 20 20 20 20 20 2a 20 20  wait .       *  
30c30 20 20 20 20 20 20 20 20 20 31 30 20 73 65 63 20           10 sec 
30c40 61 6e 64 20 74 72 79 20 61 67 61 69 6e 0a 20 20  and try again.  
30c50 20 20 20 20 20 2a 20 33 72 64 20 74 72 79 3a 20       * 3rd try: 
30c60 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75  break the lock u
30c70 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64 20 74 69  nless the mod ti
30c80 6d 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a  me has changed..
30c90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30ca0 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
30cb0 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
30cc0 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  at(conchFile->h,
30cd0 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20   &buf) ){.      
30ce0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
30cf0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
30d00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30d10 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
30d20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
30d30 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 31     if( nTries==1
30d40 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63   ){.        conc
30d50 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73  hModTime = buf.s
30d60 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20 20  t_mtimespec;.   
30d70 20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30 30       usleep(5000
30d80 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35  00); /* wait 0.5
30d90 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65   sec and try the
30da0 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20   lock again*/.  
30db0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
30dc0 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20   .      }..     
30dd0 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3e   assert( nTries>
30de0 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  1 );.      if( c
30df0 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73  onchModTime.tv_s
30e00 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69  ec != buf.st_mti
30e10 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c  mespec.tv_sec ||
30e20 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63 68   .         conch
30e30 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20  ModTime.tv_nsec 
30e40 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73  != buf.st_mtimes
30e50 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20  pec.tv_nsec ){. 
30e60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
30e70 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
30e80 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
30e90 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b  if( nTries==2 ){
30ea0 20 20 0a 20 20 20 20 20 20 20 20 63 68 61 72 20    .        char 
30eb0 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  tBuf[PROXY_MAXCO
30ec0 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20  NCHLEN];.       
30ed0 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65   int len = osPre
30ee0 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ad(conchFile->h,
30ef0 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58   tBuf, PROXY_MAX
30f00 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20  CONCHLEN, 0);.  
30f10 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20        if( len<0 
30f20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
30f30 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
30f40 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
30f50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
30f60 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
30f70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
30f80 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49   len>PROXY_PATHI
30f90 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d 3d  NDEX && tBuf[0]=
30fa0 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e  =(char)PROXY_CON
30fb0 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20  CHVERSION){.    
30fc0 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62        /* don't b
30fd0 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66  reak the lock if
30fe0 20 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f 65   the host id doe
30ff0 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20  sn't match */.  
31000 20 20 20 20 20 20 20 20 69 66 28 20 30 21 3d 6d          if( 0!=m
31010 65 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f 58  emcmp(&tBuf[PROX
31020 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79  Y_HEADERLEN], my
31030 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f  HostID, PROXY_HO
31040 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20  STIDLEN) ){.    
31050 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
31060 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
31070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31080 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31090 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20   /* don't break 
310a0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72  the lock on shor
310b0 74 20 72 65 61 64 20 6f 72 20 61 20 76 65 72 73  t read or a vers
310c0 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a  ion mismatch */.
310d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
310e0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
310f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31100 75 73 6c 65 65 70 28 31 30 30 30 30 30 30 30 29  usleep(10000000)
31110 3b 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65 63  ; /* wait 10 sec
31120 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63   and try the loc
31130 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20  k again */.     
31140 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20     continue; .  
31150 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
31160 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65     assert( nTrie
31170 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66  s==3 );.      if
31180 28 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43  ( 0==proxyBreakC
31190 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  onchLock(pFile, 
311a0 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20 20  myHostID) ){.   
311b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
311c0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
311d0 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55   lockType==EXCLU
311e0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
311f0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63         rc = conc
31200 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
31210 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
31220 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
31230 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20  SHARED_LOCK);   
31240 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
31250 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 72  }.        if( !r
31260 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
31270 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
31280 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
31290 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
312a0 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65  chFile, lockType
312b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
312c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77     }.    }.  } w
312d0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
312e0 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c  _BUSY && nTries<
312f0 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e  3 );.  .  return
31300 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73   rc;.}../* Takes
31310 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61   the conch by ta
31320 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  king a shared lo
31330 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65 20  ck and read the 
31340 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20  contents conch, 
31350 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20  if .** lockPath 
31360 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
31370 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63   host ID and loc
31380 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74  k file path must
31390 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20   match.  A NULL 
313a0 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61  .** lockPath mea
313b0 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ns that the lock
313c0 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63  Path in the conc
313d0 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  h file will be u
313e0 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68  sed if the .** h
313f0 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f  ost IDs match, o
31400 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74  r a new lock pat
31410 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  h will be genera
31420 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
31430 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65  y .** and writte
31440 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66  n to the conch f
31450 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
31460 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63  nt proxyTakeConc
31470 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  h(unixFile *pFil
31480 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  e){.  proxyLocki
31490 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
314a0 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
314b0 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
314c0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
314d0 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e  .  .  if( pCtx->
314e0 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a  conchHeld!=0 ){.
314f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31500 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
31510 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e     unixFile *con
31520 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
31530 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75  onchFile;.    uu
31540 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20  id_t myHostID;. 
31550 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20     int pError = 
31560 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61 64  0;.    char read
31570 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  Buf[PROXY_MAXCON
31580 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  CHLEN];.    char
31590 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54   lockPath[MAXPAT
315a0 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
315b0 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20  *tempLockPath = 
315c0 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63  NULL;.    int rc
315d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
315e0 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63    int createConc
315f0 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68  h = 0;.    int h
31600 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a  ostIdMatch = 0;.
31610 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20      int readLen 
31620 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79  = 0;.    int try
31630 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b  OldLockPath = 0;
31640 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65  .    int forceNe
31650 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  wLockPath = 0;. 
31660 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45 28     .    OSTRACE(
31670 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20  ("TAKECONCH  %d 
31680 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22  for %s pid=%d\n"
31690 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
316a0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43               (pC
316b0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
316c0 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h ? pCtx->lockPr
316d0 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f  oxyPath : ":auto
316e0 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b  :"), getpid()));
316f0 0a 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79  ..    rc = proxy
31700 47 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74  GetHostID(myHost
31710 49 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20  ID, &pError);.  
31720 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d    if( (rc&0xff)=
31730 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
31740 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
31750 73 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72  stErrno = pError
31760 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
31770 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
31780 7d 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79  }.    rc = proxy
31790 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c  ConchLock(pFile,
317a0 20 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45   myHostID, SHARE
317b0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
317c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
317d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
317e0 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
317f0 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74 68  }.    /* read th
31800 65 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63 68  e existing conch
31810 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61   file */.    rea
31820 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65  dLen = seekAndRe
31830 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f  ad((unixFile*)co
31840 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61 64  nchFile, 0, read
31850 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f  Buf, PROXY_MAXCO
31860 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28  NCHLEN);.    if(
31870 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20   readLen<0 ){.  
31880 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72      /* I/O error
31890 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  : lastErrno set 
318a0 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a  by seekAndRead *
318b0 2f 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  /.      pFile->l
318c0 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68  astErrno = conch
318d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
318e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
318f0 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20  TE_IOERR_READ;. 
31900 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
31910 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c  keconch;.    }el
31920 73 65 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d  se if( readLen<=
31930 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
31940 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
31950 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ) || .          
31960 20 20 20 72 65 61 64 42 75 66 5b 30 5d 21 3d 28     readBuf[0]!=(
31970 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48  char)PROXY_CONCH
31980 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20  VERSION ){.     
31990 20 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64   /* a short read
319a0 20 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d   or version form
319b0 61 74 20 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e  at mismatch mean
319c0 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65  s we need to cre
319d0 61 74 65 20 61 20 6e 65 77 20 0a 20 20 20 20 20  ate a new .     
319e0 20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20   ** conch file. 
319f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31a00 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b  createConch = 1;
31a10 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66  .    }.    /* if
31a20 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74   the host id mat
31a30 63 68 65 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  ches and the loc
31a40 6b 20 70 61 74 68 20 61 6c 72 65 61 64 79 20 65  k path already e
31a50 78 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f 6e  xists in the con
31a60 63 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20  ch.    ** we'll 
31a70 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 70  try to use the p
31a80 61 74 68 20 74 68 65 72 65 2c 20 69 66 20 77 65  ath there, if we
31a90 20 63 61 6e 27 74 20 6f 70 65 6e 20 74 68 61 74   can't open that
31aa0 20 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20   path, we'll .  
31ab0 20 20 2a 2a 20 72 65 74 72 79 20 77 69 74 68 20    ** retry with 
31ac0 61 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65 72  a new auto-gener
31ad0 61 74 65 64 20 70 61 74 68 20 0a 20 20 20 20 2a  ated path .    *
31ae0 2f 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e  /.    do { /* in
31af0 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f   case we need to
31b00 20 74 72 79 20 61 67 61 69 6e 20 66 6f 72 20 61   try again for a
31b10 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c  n :auto: named l
31b20 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ock file */..   
31b30 20 20 20 69 66 28 20 21 63 72 65 61 74 65 43 6f     if( !createCo
31b40 6e 63 68 20 26 26 20 21 66 6f 72 63 65 4e 65 77  nch && !forceNew
31b50 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20  LockPath ){.    
31b60 20 20 20 20 68 6f 73 74 49 64 4d 61 74 63 68 20      hostIdMatch 
31b70 3d 20 21 6d 65 6d 63 6d 70 28 26 72 65 61 64 42  = !memcmp(&readB
31b80 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  uf[PROXY_HEADERL
31b90 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a  EN], myHostID, .
31ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31bc0 20 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45    PROXY_HOSTIDLE
31bd0 4e 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69  N);.        /* i
31be0 66 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73 20  f the conch has 
31bf0 64 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68 65  data compare the
31c00 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20   contents */.   
31c10 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e       if( !pCtx->
31c20 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
31c30 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6f  .          /* fo
31c40 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63  r auto-named loc
31c50 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75  al lock file, ju
31c60 73 74 20 63 68 65 63 6b 20 74 68 65 20 68 6f 73  st check the hos
31c70 74 20 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20  t ID and we'll. 
31c80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
31c90 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20   the local lock 
31ca0 66 69 6c 65 20 70 61 74 68 20 74 68 61 74 27 73  file path that's
31cb0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 72   already in ther
31cc0 65 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e.           */.
31cd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 68 6f            if( ho
31ce0 73 74 49 64 4d 61 74 63 68 20 29 7b 0a 20 20 20  stIdMatch ){.   
31cf0 20 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20           size_t 
31d00 70 61 74 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c  pathLen = (readL
31d10 65 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54 48 49  en - PROXY_PATHI
31d20 4e 44 45 58 29 3b 0a 20 20 20 20 20 20 20 20 20  NDEX);.         
31d30 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20     .            
31d40 69 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58  if( pathLen>=MAX
31d50 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20  PATHLEN ){.     
31d60 20 20 20 20 20 20 20 20 20 70 61 74 68 4c 65 6e           pathLen
31d70 3d 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20  =MAXPATHLEN-1;. 
31d80 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
31d90 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
31da0 6c 6f 63 6b 50 61 74 68 2c 20 26 72 65 61 64 42  lockPath, &readB
31db0 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  uf[PROXY_PATHIND
31dc0 45 58 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20  EX], pathLen);. 
31dd0 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 50             lockP
31de0 61 74 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30  ath[pathLen] = 0
31df0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
31e00 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63  mpLockPath = loc
31e10 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 20  kPath;.         
31e20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74     tryOldLockPat
31e30 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  h = 1;.         
31e40 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63     /* create a c
31e50 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  opy of the lock 
31e60 70 61 74 68 20 69 66 20 74 68 65 20 63 6f 6e 63  path if the conc
31e70 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20  h is taken */.  
31e80 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
31e90 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
31ea0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31eb0 20 20 7d 65 6c 73 65 20 69 66 28 20 68 6f 73 74    }else if( host
31ec0 49 64 4d 61 74 63 68 0a 20 20 20 20 20 20 20 20  IdMatch.        
31ed0 20 20 20 20 20 20 20 26 26 20 21 73 74 72 6e 63         && !strnc
31ee0 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  mp(pCtx->lockPro
31ef0 78 79 50 61 74 68 2c 20 26 72 65 61 64 42 75 66  xyPath, &readBuf
31f00 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
31f10 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
31f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
31f30 61 64 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48  adLen-PROXY_PATH
31f40 49 4e 44 45 58 29 0a 20 20 20 20 20 20 20 20 29  INDEX).        )
31f50 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63  {.          /* c
31f60 6f 6e 63 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f  onch host and lo
31f70 63 6b 20 70 61 74 68 20 6d 61 74 63 68 20 2a 2f  ck path match */
31f80 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
31f90 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a  end_takeconch; .
31fa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31fb0 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f  }.      .      /
31fc0 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69  * if the conch i
31fd0 73 6e 27 74 20 77 72 69 74 61 62 6c 65 20 61 6e  sn't writable an
31fe0 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c  d doesn't match,
31ff0 20 77 65 20 63 61 6e 27 74 20 74 61 6b 65 20 69   we can't take i
32000 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  t */.      if( (
32010 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46  conchFile->openF
32020 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20  lags&O_RDWR) == 
32030 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
32040 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
32050 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
32060 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20  takeconch;.     
32070 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
32080 2f 2a 20 65 69 74 68 65 72 20 74 68 65 20 63 6f  /* either the co
32090 6e 63 68 20 64 69 64 6e 27 74 20 6d 61 74 63 68  nch didn't match
320a0 20 6f 72 20 77 65 20 6e 65 65 64 20 74 6f 20 63   or we need to c
320b0 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
320c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 43  */.      if( !pC
320d0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
320e0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f  h ){.        pro
320f0 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70 43  xyGetLockPath(pC
32100 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b  tx->dbPath, lock
32110 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
32120 29 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 4c  );.        tempL
32130 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61  ockPath = lockPa
32140 74 68 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63  th;.        /* c
32150 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20  reate a copy of 
32160 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f  the lock path _o
32170 6e 6c 79 5f 20 69 66 20 74 68 65 20 63 6f 6e 63  nly_ if the conc
32180 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20  h is taken */.  
32190 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
321a0 20 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e     /* update con
321b0 63 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e 64  ch with host and
321c0 20 70 61 74 68 20 28 74 68 69 73 20 77 69 6c 6c   path (this will
321d0 20 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20 70   fail if other p
321e0 72 6f 63 65 73 73 0a 20 20 20 20 20 20 2a 2a 20  rocess.      ** 
321f0 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63  has a shared loc
32200 6b 20 61 6c 72 65 61 64 79 29 2c 20 69 66 20 74  k already), if t
32210 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68  he host id match
32220 65 73 2c 20 75 73 65 20 74 68 65 20 62 69 67 0a  es, use the big.
32230 20 20 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a        ** stick..
32240 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66        */.      f
32250 75 74 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65  utimes(conchFile
32260 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  ->h, NULL);.    
32270 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63    if( hostIdMatc
32280 68 20 26 26 20 21 63 72 65 61 74 65 43 6f 6e 63  h && !createConc
32290 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  h ){.        if(
322a0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f   conchFile->pIno
322b0 64 65 20 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d  de && conchFile-
322c0 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
322d0 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
322e0 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
322f0 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
32300 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
32310 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
32320 73 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s.           ** 
32330 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
32340 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
32350 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
32360 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
32370 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
32380 20 20 20 20 7d 20 65 6c 73 65 20 7b 20 20 20 20      } else {    
32390 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
323a0 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68   rc = proxyConch
323b0 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f  Lock(pFile, myHo
323c0 73 74 49 44 2c 20 45 58 43 4c 55 53 49 56 45 5f  stID, EXCLUSIVE_
323d0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d  LOCK);.        }
323e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
323f0 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
32400 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
32410 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
32420 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45  le*)conchFile, E
32430 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
32440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
32450 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32460 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
32470 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
32480 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  Y_MAXCONCHLEN];.
32490 20 20 20 20 20 20 20 20 69 6e 74 20 77 72 69 74          int writ
324a0 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20  eSize = 0;.     
324b0 20 20 20 0a 20 20 20 20 20 20 20 20 77 72 69 74     .        writ
324c0 65 42 75 66 66 65 72 5b 30 5d 20 3d 20 28 63 68  eBuffer[0] = (ch
324d0 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45  ar)PROXY_CONCHVE
324e0 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 6d  RSION;.        m
324f0 65 6d 63 70 79 28 26 77 72 69 74 65 42 75 66 66  emcpy(&writeBuff
32500 65 72 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  er[PROXY_HEADERL
32510 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50  EN], myHostID, P
32520 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b  ROXY_HOSTIDLEN);
32530 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74  .        if( pCt
32540 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
32550 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  !=NULL ){.      
32560 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72 69      strlcpy(&wri
32570 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50  teBuffer[PROXY_P
32580 41 54 48 49 4e 44 45 58 5d 2c 20 70 43 74 78 2d  ATHINDEX], pCtx-
32590 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20  >lockProxyPath, 
325a0 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
325b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
325c0 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 77        strlcpy(&w
325d0 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59  riteBuffer[PROXY
325e0 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 74 65 6d  _PATHINDEX], tem
325f0 70 4c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41  pLockPath, MAXPA
32600 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20  THLEN);.        
32610 7d 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 53  }.        writeS
32620 69 7a 65 20 3d 20 50 52 4f 58 59 5f 50 41 54 48  ize = PROXY_PATH
32630 49 4e 44 45 58 20 2b 20 73 74 72 6c 65 6e 28 26  INDEX + strlen(&
32640 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
32650 59 5f 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a 20  Y_PATHINDEX]);. 
32660 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 66 74         robust_ft
32670 72 75 6e 63 61 74 65 28 63 6f 6e 63 68 46 69 6c  runcate(conchFil
32680 65 2d 3e 68 2c 20 77 72 69 74 65 53 69 7a 65 29  e->h, writeSize)
32690 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  ;.        rc = u
326a0 6e 69 78 57 72 69 74 65 28 28 73 71 6c 69 74 65  nixWrite((sqlite
326b0 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69  3_file *)conchFi
326c0 6c 65 2c 20 77 72 69 74 65 42 75 66 66 65 72 2c  le, writeBuffer,
326d0 20 77 72 69 74 65 53 69 7a 65 2c 20 30 29 3b 0a   writeSize, 0);.
326e0 20 20 20 20 20 20 20 20 66 73 79 6e 63 28 63 6f          fsync(co
326f0 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  nchFile->h);.   
32700 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 72       /* If we cr
32710 65 61 74 65 64 20 61 20 6e 65 77 20 63 6f 6e 63  eated a new conc
32720 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a 75 73 74  h file (not just
32730 20 75 70 64 61 74 65 64 20 74 68 65 20 63 6f 6e   updated the con
32740 74 65 6e 74 73 20 6f 66 20 61 20 0a 20 20 20 20  tents of a .    
32750 20 20 20 20 20 2a 2a 20 76 61 6c 69 64 20 63 6f       ** valid co
32760 6e 63 68 20 66 69 6c 65 29 2c 20 74 72 79 20 74  nch file), try t
32770 6f 20 6d 61 74 63 68 20 74 68 65 20 70 65 72 6d  o match the perm
32780 69 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 64  issions of the d
32790 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 20  atabase .       
327a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
327b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
327c0 26 20 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b  & createConch ){
327d0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
327e0 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
327f0 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20        int err = 
32800 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  osFstat(pFile->h
32810 2c 20 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20  , &buf);.       
32820 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29 7b     if( err==0 ){
32830 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64  .            mod
32840 65 5f 74 20 63 6d 6f 64 65 20 3d 20 62 75 66 2e  e_t cmode = buf.
32850 73 74 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53 52  st_mode&(S_IRUSR
32860 7c 53 5f 49 57 55 53 52 20 7c 20 53 5f 49 52 47  |S_IWUSR | S_IRG
32870 52 50 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20 20  RP|S_IWGRP |.   
32880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328a0 20 20 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f 49       S_IROTH|S_I
328b0 57 4f 54 48 29 3b 0a 20 20 20 20 20 20 20 20 20  WOTH);.         
328c0 20 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74     /* try to mat
328d0 63 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ch the database 
328e0 66 69 6c 65 20 52 2f 57 20 70 65 72 6d 69 73 73  file R/W permiss
328f0 69 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61 69  ions, ignore fai
32900 6c 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  lure */.#ifndef 
32910 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42  SQLITE_PROXY_DEB
32920 55 47 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  UG.            o
32930 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c  sFchmod(conchFil
32940 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 23 65  e->h, cmode);.#e
32950 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  lse.            
32960 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  do{.            
32970 20 20 72 63 20 3d 20 6f 73 46 63 68 6d 6f 64 28    rc = osFchmod(
32980 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d  conchFile->h, cm
32990 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ode);.          
329a0 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 28 2d    }while( rc==(-
329b0 31 29 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  1) && errno==EIN
329c0 54 52 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TR );.          
329d0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
329e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
329f0 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20   code = errno;. 
32a00 20 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72               fpr
32a10 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63  intf(stderr, "fc
32a20 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45 44 20 77  hmod %o FAILED w
32a30 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20  ith %d %s\n",.  
32a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a50 20 20 20 20 63 6d 6f 64 65 2c 20 63 6f 64 65 2c      cmode, code,
32a60 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29   strerror(code))
32a70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ;.            } 
32a80 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
32a90 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
32aa0 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20  err, "fchmod %o 
32ab0 53 55 43 43 45 44 45 44 5c 6e 22 2c 63 6d 6f 64  SUCCEDED\n",cmod
32ac0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
32ad0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
32ae0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
32af0 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b  nt code = errno;
32b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72  .            fpr
32b10 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 54  intf(stderr, "ST
32b20 41 54 20 46 41 49 4c 45 44 5b 25 64 5d 20 77 69  AT FAILED[%d] wi
32b30 74 68 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20  th %d %s\n", .  
32b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b50 20 20 65 72 72 2c 20 63 6f 64 65 2c 20 73 74 72    err, code, str
32b60 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 23 65  error(code));.#e
32b70 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 7d  ndif.          }
32b80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32b90 20 7d 0a 20 20 20 20 20 20 63 6f 6e 63 68 46 69   }.      conchFi
32ba0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  le->pMethod->xUn
32bb0 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  lock((sqlite3_fi
32bc0 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53  le*)conchFile, S
32bd0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
32be0 20 20 20 0a 20 20 20 20 65 6e 64 5f 74 61 6b 65     .    end_take
32bf0 63 6f 6e 63 68 3a 0a 20 20 20 20 20 20 4f 53 54  conch:.      OST
32c00 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58  RACE(("TRANSPROX
32c10 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22 2c  Y: CLOSE  %d\n",
32c20 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
32c30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
32c40 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f  E_OK && pFile->o
32c50 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  penFlags ){.    
32c60 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68      if( pFile->h
32c70 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
32c80 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
32c90 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f  ile, pFile->h, _
32ca0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
32cb0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 69 6c    }.        pFil
32cc0 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20  e->h = -1;.     
32cd0 20 20 20 69 6e 74 20 66 64 20 3d 20 72 6f 62 75     int fd = robu
32ce0 73 74 5f 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62  st_open(pCtx->db
32cf0 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 6f 70 65  Path, pFile->ope
32d00 6e 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  nFlags,.        
32d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
32d20 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
32d30 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
32d40 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
32d50 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 4f 50  ("TRANSPROXY: OP
32d60 45 4e 20 20 25 64 5c 6e 22 2c 20 66 64 29 29 3b  EN  %d\n", fd));
32d70 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 64 3e  .        if( fd>
32d80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
32d90 70 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20  pFile->h = fd;. 
32da0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
32db0 20 20 20 20 20 20 20 20 72 63 3d 53 51 4c 49 54          rc=SQLIT
32dc0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
32dd0 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 3f   /* SQLITE_BUSY?
32de0 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 20   proxyTakeConch 
32df0 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 20 20 20  called.         
32e00 20 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67    during locking
32e10 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
32e20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
32e30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
32e40 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   !pCtx->lockProx
32e50 79 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  y ){.        cha
32e60 72 20 2a 70 61 74 68 20 3d 20 74 65 6d 70 4c 6f  r *path = tempLo
32e70 63 6b 50 61 74 68 20 3f 20 74 65 6d 70 4c 6f 63  ckPath ? tempLoc
32e80 6b 50 61 74 68 20 3a 20 70 43 74 78 2d 3e 6c 6f  kPath : pCtx->lo
32e90 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20  ckProxyPath;.   
32ea0 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43       rc = proxyC
32eb0 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70 61  reateUnixFile(pa
32ec0 74 68 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b 50  th, &pCtx->lockP
32ed0 72 6f 78 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  roxy, 1);.      
32ee0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32ef0 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
32f00 45 5f 4e 4f 4d 45 4d 20 26 26 20 74 72 79 4f 6c  E_NOMEM && tryOl
32f10 64 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20  dLockPath ){.   
32f20 20 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75         /* we cou
32f30 6c 64 6e 27 74 20 63 72 65 61 74 65 20 74 68 65  ldn't create the
32f40 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
32f50 20 77 69 74 68 20 74 68 65 20 6f 6c 64 20 6c 6f   with the old lo
32f60 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 20 20  ck file path.   
32f70 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 72          ** so tr
32f80 79 20 61 67 61 69 6e 20 76 69 61 20 61 75 74 6f  y again via auto
32f90 2d 6e 61 6d 69 6e 67 20 0a 20 20 20 20 20 20 20  -naming .       
32fa0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
32fb0 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74   forceNewLockPat
32fc0 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  h = 1;.         
32fd0 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20   tryOldLockPath 
32fe0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63  = 0;.          c
32ff0 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 67 6f 20 62  ontinue; /* go b
33000 61 63 6b 20 74 6f 20 74 68 65 20 64 6f 20 7b 7d  ack to the do {}
33010 20 77 68 69 6c 65 20 73 74 61 72 74 20 70 6f 69   while start poi
33020 6e 74 2c 20 74 72 79 20 61 67 61 69 6e 20 2a 2f  nt, try again */
33030 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33040 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
33050 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33060 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
33070 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
33080 70 61 74 68 20 69 66 20 77 65 20 65 78 74 72 61  path if we extra
33090 63 74 65 64 20 74 68 65 20 76 61 6c 75 65 0a 20  cted the value. 
330a0 20 20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20          ** from 
330b0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 6f  the conch file o
330c0 72 20 74 68 65 20 70 61 74 68 20 77 61 73 20 61  r the path was a
330d0 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20  llocated on the 
330e0 73 74 61 63 6b 0a 20 20 20 20 20 20 20 20 20 2a  stack.         *
330f0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 65  /.        if( te
33100 6d 70 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20  mpLockPath ){.  
33110 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f          pCtx->lo
33120 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71  ckProxyPath = sq
33130 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
33140 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 29 3b 0a   tempLockPath);.
33150 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
33160 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
33170 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
33180 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
33190 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  MEM;.          }
331a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
331b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
331c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
331d0 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63        pCtx->conc
331e0 68 48 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  hHeld = 1;.     
331f0 20 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20     .        if( 
33200 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d  pCtx->lockProxy-
33210 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70  >pMethod == &afp
33220 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
33230 20 20 20 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e         afpLockin
33240 67 43 6f 6e 74 65 78 74 20 2a 61 66 70 43 74 78  gContext *afpCtx
33250 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 43  ;.          afpC
33260 74 78 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  tx = (afpLocking
33270 43 6f 6e 74 65 78 74 20 2a 29 70 43 74 78 2d 3e  Context *)pCtx->
33280 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69  lockProxy->locki
33290 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  ngContext;.     
332a0 20 20 20 20 20 61 66 70 43 74 78 2d 3e 64 62 50       afpCtx->dbP
332b0 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  ath = pCtx->lock
332c0 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20  ProxyPath;.     
332d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73     }.      } els
332e0 65 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63  e {.        conc
332f0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
33300 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
33310 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
33320 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
33330 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
33340 45 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25  E(("TAKECONCH  %
33350 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69  d %s\n", conchFi
33360 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
33370 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
33380 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c 65 64  _OK?"ok":"failed
33390 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
333a0 6e 20 72 63 3b 0a 20 20 20 20 7d 20 77 68 69 6c  n rc;.    } whil
333b0 65 20 28 31 29 3b 20 2f 2a 20 69 6e 20 63 61 73  e (1); /* in cas
333c0 65 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74  e we need to ret
333d0 72 79 20 74 68 65 20 3a 61 75 74 6f 3a 20 6c 6f  ry the :auto: lo
333e0 63 6b 20 66 69 6c 65 20 2d 20 0a 20 20 20 20 20  ck file - .     
333f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
33400 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 67  e should never g
33410 65 74 20 68 65 72 65 20 65 78 63 65 70 74 20 76  et here except v
33420 69 61 20 74 68 65 20 27 63 6f 6e 74 69 6e 75 65  ia the 'continue
33430 27 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d  ' call. */.  }.}
33440 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c 65  ../*.** If pFile
33450 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e   holds a lock on
33460 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 74   a conch file, t
33470 68 65 6e 20 72 65 6c 65 61 73 65 20 74 68 61 74  hen release that
33480 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   lock..*/.static
33490 20 69 6e 74 20 70 72 6f 78 79 52 65 6c 65 61 73   int proxyReleas
334a0 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20  eConch(unixFile 
334b0 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
334c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
334d0 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75         /* Subrou
334e0 74 69 6e 65 20 72 65 74 75 72 6e 20 63 6f 64 65  tine return code
334f0 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69   */.  proxyLocki
33500 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
33510 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67    /* The locking
33520 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65   context for the
33530 20 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20   proxy lock */. 
33540 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
33550 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  File;        /* 
33560 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63  Name of the conc
33570 68 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43 74  h file */..  pCt
33580 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
33590 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
335a0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
335b0 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d 20  ;.  conchFile = 
335c0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
335d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 4c  .  OSTRACE(("REL
335e0 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 66 6f  EASECONCH  %d fo
335f0 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  r %s pid=%d\n", 
33600 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20  conchFile->h,.  
33610 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e           (pCtx->
33620 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20  lockProxyPath ? 
33630 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
33640 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c  ath : ":auto:"),
33650 20 0a 20 20 20 20 20 20 20 20 20 20 20 67 65 74   .           get
33660 70 69 64 28 29 29 29 3b 0a 20 20 69 66 28 20 70  pid()));.  if( p
33670 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30  Ctx->conchHeld>0
33680 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e   ){.    rc = con
33690 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
336a0 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
336b0 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
336c0 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  e, NO_LOCK);.  }
336d0 0a 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  .  pCtx->conchHe
336e0 6c 64 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43  ld = 0;.  OSTRAC
336f0 45 28 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48  E(("RELEASECONCH
33700 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63    %d %s\n", conc
33710 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
33720 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45       (rc==SQLITE
33730 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
33740 69 6c 65 64 22 29 29 29 3b 0a 20 20 72 65 74 75  iled")));.  retu
33750 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
33760 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  Given the name o
33770 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
33780 65 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e  e, compute the n
33790 61 6d 65 20 6f 66 20 69 74 73 20 63 6f 6e 63 68  ame of its conch
337a0 20 66 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65 20   file..** Store 
337b0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61  the conch filena
337c0 6d 65 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  me in memory obt
337d0 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
337e0 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
337f0 4d 61 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74 68  Make *pConchPath
33800 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
33810 77 20 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20  w name.  Return 
33820 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
33830 63 65 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  cess.** or SQLIT
33840 45 5f 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62 6c  E_NOMEM if unabl
33850 65 20 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d 6f  e to obtain memo
33860 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ry..**.** The ca
33870 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
33880 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67  ble for ensuring
33890 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
338a0 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70  ted memory.** sp
338b0 61 63 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ace is eventuall
338c0 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a  y freed..**.** *
338d0 70 43 6f 6e 63 68 50 61 74 68 20 69 73 20 73 65  pConchPath is se
338e0 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20 6d  t to NULL if a m
338f0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
33900 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
33910 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
33920 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74  xyCreateConchPat
33930 68 6e 61 6d 65 28 63 68 61 72 20 2a 64 62 50 61  hname(char *dbPa
33940 74 68 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63  th, char **pConc
33950 68 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b  hPath){.  int i;
33960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33970 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
33980 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
33990 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c   len = (int)strl
339a0 65 6e 28 64 62 50 61 74 68 29 3b 20 2f 2a 20 4c  en(dbPath); /* L
339b0 65 6e 67 74 68 20 6f 66 20 64 61 74 61 62 61 73  ength of databas
339c0 65 20 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62 50  e filename - dbP
339d0 61 74 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63  ath */.  char *c
339e0 6f 6e 63 68 50 61 74 68 3b 20 20 20 20 20 20 20  onchPath;       
339f0 20 20 20 20 20 20 20 2f 2a 20 62 75 66 66 65 72         /* buffer
33a00 20 69 6e 20 77 68 69 63 68 20 74 6f 20 63 6f 6e   in which to con
33a10 73 74 72 75 63 74 20 63 6f 6e 63 68 20 6e 61 6d  struct conch nam
33a20 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  e */..  /* Alloc
33a30 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
33a40 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65  e conch filename
33a50 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
33a60 74 68 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a  the name to.  **
33a70 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
33a80 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
33a90 73 65 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20 20  se file. */  .  
33aa0 2a 70 43 6f 6e 63 68 50 61 74 68 20 3d 20 63 6f  *pConchPath = co
33ab0 6e 63 68 50 61 74 68 20 3d 20 28 63 68 61 72 20  nchPath = (char 
33ac0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
33ad0 28 6c 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66 28  (len + 8);.  if(
33ae0 20 63 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29 7b   conchPath==0 ){
33af0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
33b00 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
33b10 6d 65 6d 63 70 79 28 63 6f 6e 63 68 50 61 74 68  memcpy(conchPath
33b20 2c 20 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31 29  , dbPath, len+1)
33b30 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e  ;.  .  /* now in
33b40 73 65 72 74 20 61 20 22 2e 22 20 62 65 66 6f 72  sert a "." befor
33b50 65 20 74 68 65 20 6c 61 73 74 20 2f 20 63 68 61  e the last / cha
33b60 72 61 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28  racter */.  for(
33b70 20 69 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30   i=(len-1); i>=0
33b80 3b 20 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28  ; i-- ){.    if(
33b90 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d 27   conchPath[i]=='
33ba0 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b  /' ){.      i++;
33bb0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
33bc0 20 20 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50    }.  }.  conchP
33bd0 61 74 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77 68  ath[i]='.';.  wh
33be0 69 6c 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a 20  ile ( i<len ){. 
33bf0 20 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31     conchPath[i+1
33c00 5d 3d 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20  ]=dbPath[i];.   
33c10 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   i++;.  }..  /* 
33c20 61 70 70 65 6e 64 20 74 68 65 20 22 2d 63 6f 6e  append the "-con
33c30 63 68 22 20 73 75 66 66 69 78 20 74 6f 20 74 68  ch" suffix to th
33c40 65 20 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63  e file */.  memc
33c50 70 79 28 26 63 6f 6e 63 68 50 61 74 68 5b 69 2b  py(&conchPath[i+
33c60 31 5d 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37 29  1], "-conch", 7)
33c70 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 74  ;.  assert( (int
33c80 29 73 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61 74  )strlen(conchPat
33c90 68 29 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a  h) == len+7 );..
33ca0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33cb0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73  OK;.}.../* Takes
33cc0 20 61 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75   a fully configu
33cd0 72 65 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  red proxy lockin
33ce0 67 2d 73 74 79 6c 65 20 75 6e 69 78 20 66 69 6c  g-style unix fil
33cf0 65 20 61 6e 64 20 73 77 69 74 63 68 65 73 0a 2a  e and switches.*
33d00 2a 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  * the local lock
33d10 20 66 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73   file path .*/.s
33d20 74 61 74 69 63 20 69 6e 74 20 73 77 69 74 63 68  tatic int switch
33d30 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 75 6e  LockProxyPath(un
33d40 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63  ixFile *pFile, c
33d50 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29  onst char *path)
33d60 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   {.  proxyLockin
33d70 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
33d80 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
33d90 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f  ntext*)pFile->lo
33da0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
33db0 63 68 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20  char *oldPath = 
33dc0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
33dd0 61 74 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ath;.  int rc = 
33de0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
33df0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
33e00 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  ck!=NO_LOCK ){. 
33e10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
33e20 5f 42 55 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20  _BUSY;.  }  ..  
33e30 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* nothing to do
33e40 20 69 66 20 74 68 65 20 70 61 74 68 20 69 73 20   if the path is 
33e50 4e 55 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20  NULL, :auto: or 
33e60 6d 61 74 63 68 65 73 20 74 68 65 20 65 78 69 73  matches the exis
33e70 74 69 6e 67 20 70 61 74 68 20 2a 2f 0a 20 20 69  ting path */.  i
33e80 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68  f( !path || path
33e90 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74  [0]=='\0' || !st
33ea0 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74  rcmp(path, ":aut
33eb0 6f 3a 22 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64  o:") ||.    (old
33ec0 50 61 74 68 20 26 26 20 21 73 74 72 6e 63 6d 70  Path && !strncmp
33ed0 28 6f 6c 64 50 61 74 68 2c 20 70 61 74 68 2c 20  (oldPath, path, 
33ee0 4d 41 58 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a  MAXPATHLEN)) ){.
33ef0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33f00 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
33f10 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63     unixFile *loc
33f20 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  kProxy = pCtx->l
33f30 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 70 43  ockProxy;.    pC
33f40 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55  tx->lockProxy=NU
33f50 4c 4c 3b 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f  LL;.    pCtx->co
33f60 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20  nchHeld = 0;.   
33f70 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d   if( lockProxy!=
33f80 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63  NULL ){.      rc
33f90 3d 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74  =lockProxy->pMet
33fa0 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
33fb0 69 74 65 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b  ite3_file *)lock
33fc0 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66  Proxy);.      if
33fd0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
33fe0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
33ff0 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b  free(lockProxy);
34000 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
34010 65 33 5f 66 72 65 65 28 6f 6c 64 50 61 74 68 29  e3_free(oldPath)
34020 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b  ;.    pCtx->lock
34030 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69  ProxyPath = sqli
34040 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 70  te3DbStrDup(0, p
34050 61 74 68 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72  ath);.  }.  .  r
34060 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
34070 2a 2a 20 70 46 69 6c 65 20 69 73 20 61 20 66 69  ** pFile is a fi
34080 6c 65 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  le that has been
34090 20 6f 70 65 6e 65 64 20 62 79 20 61 20 70 72 69   opened by a pri
340a0 6f 72 20 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 20  or xOpen call.  
340b0 64 62 50 61 74 68 0a 2a 2a 20 69 73 20 61 20 73  dbPath.** is a s
340c0 74 72 69 6e 67 20 62 75 66 66 65 72 20 61 74 20  tring buffer at 
340d0 6c 65 61 73 74 20 4d 41 58 50 41 54 48 4c 45 4e  least MAXPATHLEN
340e0 2b 31 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  +1 characters in
340f0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   size..**.** Thi
34100 73 20 72 6f 75 74 69 6e 65 20 66 69 6e 64 20 74  s routine find t
34110 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 73 73 6f  he filename asso
34120 63 69 61 74 65 64 20 77 69 74 68 20 70 46 69 6c  ciated with pFil
34130 65 20 61 6e 64 20 77 72 69 74 65 73 20 69 74 0a  e and writes it.
34140 2a 2a 20 69 6e 74 20 64 62 50 61 74 68 2e 0a 2a  ** int dbPath..*
34150 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
34160 78 79 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e  xyGetDbPathForUn
34170 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  ixFile(unixFile 
34180 2a 70 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62  *pFile, char *db
34190 50 61 74 68 29 7b 0a 23 69 66 20 64 65 66 69 6e  Path){.#if defin
341a0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
341b0 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  if( pFile->pMeth
341c0 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68  od == &afpIoMeth
341d0 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 61 66  ods ){.    /* af
341e0 70 20 73 74 79 6c 65 20 6b 65 65 70 73 20 61 20  p style keeps a 
341f0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
34200 20 64 62 20 70 61 74 68 20 69 6e 20 74 68 65 20   db path in the 
34210 66 69 6c 65 50 61 74 68 20 66 69 65 6c 64 20 0a  filePath field .
34220 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 74      ** of the st
34230 72 75 63 74 20 2a 2f 0a 20 20 20 20 61 73 73 65  ruct */.    asse
34240 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  rt( (int)strlen(
34250 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f  (char*)pFile->lo
34260 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d  ckingContext)<=M
34270 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20  AXPATHLEN );.   
34280 20 73 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c   strlcpy(dbPath,
34290 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e   ((afpLockingCon
342a0 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
342b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 64  ckingContext)->d
342c0 62 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  bPath, MAXPATHLE
342d0 4e 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 23 65 6e  N);.  } else.#en
342e0 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  dif.  if( pFile-
342f0 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 64 6f 74  >pMethod == &dot
34300 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b  lockIoMethods ){
34310 0a 20 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b  .    /* dot lock
34320 20 73 74 79 6c 65 20 75 73 65 73 20 74 68 65 20   style uses the 
34330 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
34340 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64 6f 74  to store the dot
34350 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 66 69 6c   lock.    ** fil
34360 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e  e path */.    in
34370 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28  t len = strlen((
34380 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
34390 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20  ckingContext) - 
343a0 73 74 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53  strlen(DOTLOCK_S
343b0 55 46 46 49 58 29 3b 0a 20 20 20 20 6d 65 6d 63  UFFIX);.    memc
343c0 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72  py(dbPath, (char
343d0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
343e0 67 43 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20  gContext, len + 
343f0 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
34400 20 2f 2a 20 61 6c 6c 20 6f 74 68 65 72 20 73 74   /* all other st
34410 79 6c 65 73 20 75 73 65 20 74 68 65 20 6c 6f 63  yles use the loc
34420 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20  king context to 
34430 73 74 6f 72 65 20 74 68 65 20 64 62 20 66 69 6c  store the db fil
34440 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 61 73  e path */.    as
34450 73 65 72 74 28 20 73 74 72 6c 65 6e 28 28 63 68  sert( strlen((ch
34460 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
34470 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50  ngContext)<=MAXP
34480 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74  ATHLEN );.    st
34490 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28 63  rlcpy(dbPath, (c
344a0 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
344b0 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 4d 41 58  kingContext, MAX
344c0 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 0a 20 20  PATHLEN);.  }.  
344d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
344e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73  ;.}../*.** Takes
344f0 20 61 6e 20 61 6c 72 65 61 64 79 20 66 69 6c 6c   an already fill
34500 65 64 20 69 6e 20 75 6e 69 78 20 66 69 6c 65 20  ed in unix file 
34510 61 6e 64 20 61 6c 74 65 72 73 20 69 74 20 73 6f  and alters it so
34520 20 61 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b 69 6e   all file lockin
34530 67 20 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 70 65  g .** will be pe
34540 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 6c  rformed on the l
34550 6f 63 61 6c 20 70 72 6f 78 79 20 6c 6f 63 6b 20  ocal proxy lock 
34560 66 69 6c 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  file.  The follo
34570 77 69 6e 67 20 66 69 65 6c 64 73 0a 2a 2a 20 61  wing fields.** a
34580 72 65 20 70 72 65 73 65 72 76 65 64 20 69 6e 20  re preserved in 
34590 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
345a0 65 78 74 20 73 6f 20 74 68 61 74 20 74 68 65 79  ext so that they
345b0 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
345c0 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 75 6e 69   and .** the uni
345d0 78 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 70  x structure prop
345e0 65 72 6c 79 20 63 6c 65 61 6e 65 64 20 75 70 20  erly cleaned up 
345f0 61 74 20 63 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a  at close time:.*
34600 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  *  ->lockingCont
34610 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f  ext.**  ->pMetho
34620 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  d.*/.static int 
34630 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
34640 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  ixFile(unixFile 
34650 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68  *pFile, const ch
34660 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72  ar *path) {.  pr
34670 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
34680 74 20 2a 70 43 74 78 3b 0a 20 20 63 68 61 72 20  t *pCtx;.  char 
34690 64 62 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  dbPath[MAXPATHLE
346a0 4e 2b 31 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4e  N+1];       /* N
346b0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
346c0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
346d0 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c  ar *lockPath=NUL
346e0 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  L;.  int rc = SQ
346f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66  LITE_OK;.  .  if
34700 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
34710 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  ck!=NO_LOCK ){. 
34720 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34730 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 72 6f  _BUSY;.  }.  pro
34740 78 79 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e  xyGetDbPathForUn
34750 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 64 62  ixFile(pFile, db
34760 50 61 74 68 29 3b 0a 20 20 69 66 28 20 21 70 61  Path);.  if( !pa
34770 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27  th || path[0]=='
34780 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70  \0' || !strcmp(p
34790 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 29  ath, ":auto:") )
347a0 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 4e  {.    lockPath=N
347b0 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
347c0 20 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68 61 72    lockPath=(char
347d0 20 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20 20 0a   *)path;.  }.  .
347e0 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e    OSTRACE(("TRAN
347f0 53 50 52 4f 58 59 20 20 25 64 20 66 6f 72 20 25  SPROXY  %d for %
34800 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69  s pid=%d\n", pFi
34810 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
34820 20 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20 6c 6f    (lockPath ? lo
34830 63 6b 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a  ckPath : ":auto:
34840 22 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  "), getpid()));.
34850 0a 20 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65  .  pCtx = sqlite
34860 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
34870 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 69 66 28  (*pCtx) );.  if(
34880 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20   pCtx==0 ){.    
34890 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
348a0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  MEM;.  }.  memse
348b0 74 28 70 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f  t(pCtx, 0, sizeo
348c0 66 28 2a 70 43 74 78 29 29 3b 0a 0a 20 20 72 63  f(*pCtx));..  rc
348d0 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f   = proxyCreateCo
348e0 6e 63 68 50 61 74 68 6e 61 6d 65 28 64 62 50 61  nchPathname(dbPa
348f0 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68  th, &pCtx->conch
34900 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 69 66 28  FilePath);.  if(
34910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34920 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79  {.    rc = proxy
34930 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70  CreateUnixFile(p
34940 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
34950 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68  th, &pCtx->conch
34960 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  File, 0);.    if
34970 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
34980 54 4f 50 45 4e 20 26 26 20 28 28 70 46 69 6c 65  TOPEN && ((pFile
34990 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44  ->openFlags&O_RD
349a0 57 52 29 20 3d 3d 20 30 29 20 29 7b 0a 20 20 20  WR) == 0) ){.   
349b0 20 20 20 2f 2a 20 69 66 20 28 61 29 20 74 68 65     /* if (a) the
349c0 20 6f 70 65 6e 20 66 6c 61 67 73 20 61 72 65 20   open flags are 
349d0 6e 6f 74 20 4f 5f 52 44 57 52 2c 20 28 62 29 20  not O_RDWR, (b) 
349e0 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20  the conch isn't 
349f0 74 68 65 72 65 2c 20 61 6e 64 0a 20 20 20 20 20  there, and.     
34a00 20 2a 2a 20 28 63 29 20 74 68 65 20 66 69 6c 65   ** (c) the file
34a10 20 73 79 73 74 65 6d 20 69 73 20 72 65 61 64 2d   system is read-
34a20 6f 6e 6c 79 2c 20 74 68 65 6e 20 65 6e 61 62 6c  only, then enabl
34a30 65 20 6e 6f 2d 6c 6f 63 6b 69 6e 67 20 61 63 63  e no-locking acc
34a40 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 67  ess..      ** Ug
34a50 68 2c 20 73 69 6e 63 65 20 4f 5f 52 44 4f 4e 4c  h, since O_RDONL
34a60 59 3d 3d 30 78 30 30 30 30 20 77 65 20 74 65 73  Y==0x0000 we tes
34a70 74 20 66 6f 72 20 21 4f 5f 52 44 57 52 20 73 69  t for !O_RDWR si
34a80 6e 63 65 20 75 6e 69 78 4f 70 65 6e 20 61 73 73  nce unixOpen ass
34a90 65 72 74 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  erts.      ** th
34aa0 61 74 20 6f 70 65 6e 46 6c 61 67 73 20 77 69 6c  at openFlags wil
34ab0 6c 20 68 61 76 65 20 6f 6e 6c 79 20 6f 6e 65 20  l have only one 
34ac0 6f 66 20 4f 5f 52 44 4f 4e 4c 59 20 6f 72 20 4f  of O_RDONLY or O
34ad0 5f 52 44 57 52 2e 0a 20 20 20 20 20 20 2a 2f 0a  _RDWR..      */.
34ae0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
34af0 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20  tfs fsInfo;.    
34b00 20 20 73 74 72 75 63 74 20 73 74 61 74 20 63 6f    struct stat co
34b10 6e 63 68 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  nchInfo;.      i
34b20 6e 74 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20  nt goLockless = 
34b30 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 73  0;..      if( os
34b40 53 74 61 74 28 70 43 74 78 2d 3e 63 6f 6e 63 68  Stat(pCtx->conch
34b50 46 69 6c 65 50 61 74 68 2c 20 26 63 6f 6e 63 68  FilePath, &conch
34b60 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a  Info) == -1 ) {.
34b70 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 20          int err 
34b80 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
34b90 20 69 66 28 20 28 65 72 72 3d 3d 45 4e 4f 45 4e   if( (err==ENOEN
34ba0 54 29 20 26 26 20 28 73 74 61 74 66 73 28 64 62  T) && (statfs(db
34bb0 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21  Path, &fsInfo) !
34bc0 3d 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  = -1) ){.       
34bd0 20 20 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20     goLockless = 
34be0 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26  (fsInfo.f_flags&
34bf0 4d 4e 54 5f 52 44 4f 4e 4c 59 29 20 3d 3d 20 4d  MNT_RDONLY) == M
34c00 4e 54 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  NT_RDONLY;.     
34c10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
34c20 20 20 20 69 66 28 20 67 6f 4c 6f 63 6b 6c 65 73     if( goLockles
34c30 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74  s ){.        pCt
34c40 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 2d  x->conchHeld = -
34c50 31 3b 20 2f 2a 20 72 65 61 64 20 6f 6e 6c 79 20  1; /* read only 
34c60 46 53 2f 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a  FS/ lockless */.
34c70 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
34c80 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
34c90 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 69 66      }.  }  .  if
34ca0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34cb0 26 26 20 6c 6f 63 6b 50 61 74 68 20 29 7b 0a 20  && lockPath ){. 
34cc0 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
34cd0 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  xyPath = sqlite3
34ce0 44 62 53 74 72 44 75 70 28 30 2c 20 6c 6f 63 6b  DbStrDup(0, lock
34cf0 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Path);.  }..  if
34d00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34d10 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e 64 62 50  ){.    pCtx->dbP
34d20 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
34d30 74 72 44 75 70 28 30 2c 20 64 62 50 61 74 68 29  trDup(0, dbPath)
34d40 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  ;.    if( pCtx->
34d50 64 62 50 61 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a  dbPath==NULL ){.
34d60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
34d70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
34d80 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
34d90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
34da0 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 69 73 20 61   all memory is a
34db0 6c 6c 6f 63 61 74 65 64 2c 20 70 72 6f 78 79 73  llocated, proxys
34dc0 20 61 72 65 20 63 72 65 61 74 65 64 20 61 6e 64   are created and
34dd0 20 61 73 73 69 67 6e 65 64 2c 20 0a 20 20 20 20   assigned, .    
34de0 2a 2a 20 73 77 69 74 63 68 20 74 68 65 20 6c 6f  ** switch the lo
34df0 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e  cking context an
34e00 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20 72  d pMethod then r
34e10 65 74 75 72 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  eturn..    */.  
34e20 20 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69    pCtx->oldLocki
34e30 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 46 69 6c  ngContext = pFil
34e40 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
34e50 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  t;.    pFile->lo
34e60 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
34e70 43 74 78 3b 0a 20 20 20 20 70 43 74 78 2d 3e 70  Ctx;.    pCtx->p
34e80 4f 6c 64 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c  OldMethod = pFil
34e90 65 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20 20 20 20  e->pMethod;.    
34ea0 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
34eb0 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73   &proxyIoMethods
34ec0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
34ed0 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  f( pCtx->conchFi
34ee0 6c 65 20 29 7b 20 0a 20 20 20 20 20 20 70 43 74  le ){ .      pCt
34ef0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d  x->conchFile->pM
34f00 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73  ethod->xClose((s
34f10 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 43  qlite3_file *)pC
34f20 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a  tx->conchFile);.
34f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
34f40 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  ee(pCtx->conchFi
34f50 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  le);.    }.    s
34f60 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
34f70 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
34f80 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
34f90 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e  3_free(pCtx->con
34fa0 63 68 46 69 6c 65 50 61 74 68 29 3b 20 0a 20 20  chFilePath); .  
34fb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
34fc0 43 74 78 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  Ctx);.  }.  OSTR
34fd0 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE(("TRANSPROXY
34fe0 20 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c    %d %s\n", pFil
34ff0 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
35000 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
35010 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
35020 22 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ")));.  return r
35030 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
35040 73 20 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65  s routine handle
35050 73 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  s sqlite3_file_c
35060 6f 6e 74 72 6f 6c 28 29 20 63 61 6c 6c 73 20 74  ontrol() calls t
35070 68 61 74 20 61 72 65 20 73 70 65 63 69 66 69 63  hat are specific
35080 0a 2a 2a 20 74 6f 20 70 72 6f 78 79 20 6c 6f 63  .** to proxy loc
35090 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
350a0 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  int proxyFileCon
350b0 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
350c0 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
350d0 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77  oid *pArg){.  sw
350e0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
350f0 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f  case SQLITE_GET_
35100 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
35110 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
35120 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
35130 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 66  le*)id;.      if
35140 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
35150 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68   == &proxyIoMeth
35160 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ods ){.        p
35170 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
35180 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
35190 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
351a0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
351b0 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  ontext;.        
351c0 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70  proxyTakeConch(p
351d0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69  File);.        i
351e0 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  f( pCtx->lockPro
351f0 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
35200 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72      *(const char
35210 20 2a 2a 29 70 41 72 67 20 3d 20 70 43 74 78 2d   **)pArg = pCtx-
35220 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a  >lockProxyPath;.
35230 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
35240 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74           *(const
35250 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20   char **)pArg = 
35260 22 3a 61 75 74 6f 3a 20 28 6e 6f 74 20 68 65 6c  ":auto: (not hel
35270 64 29 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  d)";.        }. 
35280 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
35290 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68        *(const ch
352a0 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 4e 55 4c  ar **)pArg = NUL
352b0 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  L;.      }.     
352c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
352d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
352e0 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  e SQLITE_SET_LOC
352f0 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20  KPROXYFILE: {.  
35300 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
35310 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
35320 29 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  )id;.      int r
35330 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
35340 20 20 20 20 20 69 6e 74 20 69 73 50 72 6f 78 79       int isProxy
35350 53 74 79 6c 65 20 3d 20 28 70 46 69 6c 65 2d 3e  Style = (pFile->
35360 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78  pMethod == &prox
35370 79 49 6f 4d 65 74 68 6f 64 73 29 3b 0a 20 20 20  yIoMethods);.   
35380 20 20 20 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c     if( pArg==NUL
35390 4c 20 7c 7c 20 28 63 6f 6e 73 74 20 63 68 61 72  L || (const char
353a0 20 2a 29 70 41 72 67 3d 3d 30 20 29 7b 0a 20 20   *)pArg==0 ){.  
353b0 20 20 20 20 20 20 69 66 28 20 69 73 50 72 6f 78        if( isProx
353c0 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20  yStyle ){.      
353d0 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20      /* turn off 
353e0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20  proxy locking - 
353f0 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 2a 2f  not supported */
35400 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
35410 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 2f 2a 53  SQLITE_ERROR /*S
35420 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20  QLITE_PROTOCOL? 
35430 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3f 2a 2f  SQLITE_MISUSE?*/
35440 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
35450 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75  .          /* tu
35460 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63  rn off proxy loc
35470 6b 69 6e 67 20 2d 20 61 6c 72 65 61 64 79 20 6f  king - already o
35480 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20  ff - NOOP */.   
35490 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
354a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
354b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
354c0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
354d0 20 2a 70 72 6f 78 79 50 61 74 68 20 3d 20 28 63   *proxyPath = (c
354e0 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72 67  onst char *)pArg
354f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
35500 50 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20  ProxyStyle ){.  
35510 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63          proxyLoc
35520 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
35530 78 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20  x = .           
35540 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
35550 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f  ntext*)pFile->lo
35560 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
35570 20 20 20 20 20 20 20 20 69 66 28 20 21 73 74 72          if( !str
35580 63 6d 70 28 70 41 72 67 2c 20 22 3a 61 75 74 6f  cmp(pArg, ":auto
35590 3a 22 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  :") .           
355a0 7c 7c 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  || (pCtx->lockPr
355b0 6f 78 79 50 61 74 68 20 26 26 0a 20 20 20 20 20  oxyPath &&.     
355c0 20 20 20 20 20 20 20 20 20 20 21 73 74 72 6e 63            !strnc
355d0 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  mp(pCtx->lockPro
355e0 78 79 50 61 74 68 2c 20 70 72 6f 78 79 50 61 74  xyPath, proxyPat
355f0 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 0a  h, MAXPATHLEN)).
35600 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
35610 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
35620 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
35630 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35640 20 20 20 20 20 20 72 63 20 3d 20 73 77 69 74 63        rc = switc
35650 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 70  hLockProxyPath(p
35660 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29  File, proxyPath)
35670 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
35680 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
35690 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f         /* turn o
356a0 6e 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63  n proxy file loc
356b0 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  king */.        
356c0 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e    rc = proxyTran
356d0 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 70 46  sformUnixFile(pF
356e0 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b  ile, proxyPath);
356f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35700 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
35710 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  rc;.    }.    de
35720 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
35730 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20  ssert( 0 );  /* 
35740 54 68 65 20 63 61 6c 6c 20 61 73 73 75 72 65 73  The call assures
35750 20 74 68 61 74 20 6f 6e 6c 79 20 76 61 6c 69 64   that only valid
35760 20 6f 70 63 6f 64 65 73 20 61 72 65 20 73 65 6e   opcodes are sen
35770 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t */.    }.  }. 
35780 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
35790 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
357a0 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
357b0 57 69 74 68 69 6e 20 74 68 69 73 20 64 69 76 69  Within this divi
357c0 73 69 6f 6e 20 28 74 68 65 20 70 72 6f 78 79 69  sion (the proxyi
357d0 6e 67 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  ng locking imple
357e0 6d 65 6e 74 61 74 69 6f 6e 29 20 74 68 65 20 70  mentation) the p
357f0 72 6f 63 65 64 75 72 65 73 0a 2a 2a 20 61 62 6f  rocedures.** abo
35800 76 65 20 74 68 69 73 20 70 6f 69 6e 74 20 61 72  ve this point ar
35810 65 20 61 6c 6c 20 75 74 69 6c 69 74 69 65 73 2e  e all utilities.
35820 20 20 54 68 65 20 6c 6f 63 6b 2d 72 65 6c 61 74    The lock-relat
35830 65 64 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68  ed methods of th
35840 65 0a 2a 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b 69  e.** proxy-locki
35850 6e 67 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ng sqlite3_io_me
35860 74 68 6f 64 20 6f 62 6a 65 63 74 20 66 6f 6c 6c  thod object foll
35870 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ow..*/.../*.** T
35880 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
35890 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
358a0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
358b0 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
358c0 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
358d0 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
358e0 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
358f0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
35900 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
35910 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
35920 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
35930 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
35940 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
35950 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
35960 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
35970 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
35980 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
35990 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
359a0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
359b0 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65  t proxyCheckRese
359c0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
359d0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
359e0 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 75 6e 69  pResOut) {.  uni
359f0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
35a00 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
35a10 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61  int rc = proxyTa
35a20 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  keConch(pFile);.
35a30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35a40 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79  _OK ){.    proxy
35a50 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
35a60 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
35a70 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
35a80 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
35a90 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ext;.    if( pCt
35aa0 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29  x->conchHeld>0 )
35ab0 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  {.      unixFile
35ac0 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e   *proxy = pCtx->
35ad0 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20  lockProxy;.     
35ae0 20 72 65 74 75 72 6e 20 70 72 6f 78 79 2d 3e 70   return proxy->p
35af0 4d 65 74 68 6f 64 2d 3e 78 43 68 65 63 6b 52 65  Method->xCheckRe
35b00 73 65 72 76 65 64 4c 6f 63 6b 28 28 73 71 6c 69  servedLock((sqli
35b10 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c  te3_file*)proxy,
35b20 20 70 52 65 73 4f 75 74 29 3b 0a 20 20 20 20 7d   pResOut);.    }
35b30 65 6c 73 65 7b 20 2f 2a 20 63 6f 6e 63 68 48 65  else{ /* conchHe
35b40 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65  ld < 0 is lockle
35b50 73 73 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73  ss */.      pRes
35b60 4f 75 74 3d 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  Out=0;.    }.  }
35b70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
35b80 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
35b90 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
35ba0 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
35bb0 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
35bc0 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
35bd0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
35be0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
35bf0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
35c00 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
35c10 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
35c20 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
35c30 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
35c40 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
35c50 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
35c60 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
35c70 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
35c80 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
35c90 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
35ca0 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
35cb0 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
35cc0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
35cd0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
35ce0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
35cf0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
35d00 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
35d10 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
35d20 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
35d30 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
35d40 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
35d50 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
35d60 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
35d70 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
35d80 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
35d90 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
35da0 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
35db0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
35dc0 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
35dd0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
35de0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
35df0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
35e00 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
35e10 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
35e20 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
35e30 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
35e40 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
35e50 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
35e60 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
35e70 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
35e80 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
35e90 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
35ea0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35eb0 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65  proxyLock(sqlite
35ec0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
35ed0 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
35ee0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
35ef0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
35f00 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79    int rc = proxy
35f10 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29  TakeConch(pFile)
35f20 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
35f30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f  TE_OK ){.    pro
35f40 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
35f50 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
35f60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
35f70 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
35f80 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  ntext;.    if( p
35f90 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30  Ctx->conchHeld>0
35fa0 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69   ){.      unixFi
35fb0 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78  le *proxy = pCtx
35fc0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20  ->lockProxy;.   
35fd0 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70     rc = proxy->p
35fe0 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
35ff0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f  qlite3_file*)pro
36000 78 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a  xy, eFileLock);.
36010 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
36020 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e  leLock = proxy->
36030 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  eFileLock;.    }
36040 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63  else{.      /* c
36050 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20  onchHeld < 0 is 
36060 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20  lockless */.    
36070 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
36080 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  c;.}.../*.** Low
36090 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
360a0 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
360b0 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
360c0 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
360d0 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
360e0 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
360f0 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
36100 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
36110 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
36120 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
36130 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
36140 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
36150 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
36160 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
36170 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
36180 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
36190 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
361a0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
361b0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
361c0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
361d0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
361e0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72  d;.  int rc = pr
361f0 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69  oxyTakeConch(pFi
36200 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  le);.  if( rc==S
36210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36220 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
36230 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
36240 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
36250 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
36260 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66  gContext;.    if
36270 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
36280 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69  d>0 ){.      uni
36290 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70  xFile *proxy = p
362a0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
362b0 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
362c0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
362d0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
362e0 2a 29 70 72 6f 78 79 2c 20 65 46 69 6c 65 4c 6f  *)proxy, eFileLo
362f0 63 6b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ck);.      pFile
36300 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 72  ->eFileLock = pr
36310 6f 78 79 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a  oxy->eFileLock;.
36320 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36330 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20   /* conchHeld < 
36340 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f  0 is lockless */
36350 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
36360 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
36370 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 74 68   Close a file th
36380 61 74 20 75 73 65 73 20 70 72 6f 78 79 20 6c 6f  at uses proxy lo
36390 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  cks..*/.static i
363a0 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71  nt proxyClose(sq
363b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
363c0 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
363d0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
363e0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
363f0 64 3b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  d;.    proxyLock
36400 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
36410 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
36420 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
36430 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
36440 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c  .    unixFile *l
36450 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d  ockProxy = pCtx-
36460 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20  >lockProxy;.    
36470 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
36480 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
36490 68 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 72  hFile;.    int r
364a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
364b0 20 20 20 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b     .    if( lock
364c0 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72  Proxy ){.      r
364d0 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70  c = lockProxy->p
364e0 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
364f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c  (sqlite3_file*)l
36500 6f 63 6b 50 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43  ockProxy, NO_LOC
36510 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
36520 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
36530 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f      rc = lockPro
36540 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  xy->pMethod->xCl
36550 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
36560 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20  e*)lockProxy);. 
36570 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
36580 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
36590 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b  qlite3_free(lock
365a0 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 70 43  Proxy);.      pC
365b0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d 20  tx->lockProxy = 
365c0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
365d0 20 63 6f 6e 63 68 46 69 6c 65 20 29 7b 0a 20 20   conchFile ){.  
365e0 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f      if( pCtx->co
365f0 6e 63 68 48 65 6c 64 20 29 7b 0a 20 20 20 20 20  nchHeld ){.     
36600 20 20 20 72 63 20 3d 20 70 72 6f 78 79 52 65 6c     rc = proxyRel
36610 65 61 73 65 43 6f 6e 63 68 28 70 46 69 6c 65 29  easeConch(pFile)
36620 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
36630 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
36640 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
36650 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
36660 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
36670 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
36680 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  File);.      if(
36690 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
366a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
366b0 72 65 65 28 63 6f 6e 63 68 46 69 6c 65 29 3b 0a  ree(conchFile);.
366c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
366d0 33 44 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d  3DbFree(0, pCtx-
366e0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b  >lockProxyPath);
366f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
36700 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  e(pCtx->conchFil
36710 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  ePath);.    sqli
36720 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 43 74  te3DbFree(0, pCt
36730 78 2d 3e 64 62 50 61 74 68 29 3b 0a 20 20 20 20  x->dbPath);.    
36740 2f 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 6f  /* restore the o
36750 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20  riginal locking 
36760 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74  context and pMet
36770 68 6f 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69  hod then close i
36780 74 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  t */.    pFile->
36790 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
367a0 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e   pCtx->oldLockin
367b0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 46  gContext;.    pF
367c0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70  ile->pMethod = p
367d0 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b  Ctx->pOldMethod;
367e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
367f0 65 28 70 43 74 78 29 3b 0a 20 20 20 20 72 65 74  e(pCtx);.    ret
36800 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  urn pFile->pMeth
36810 6f 64 2d 3e 78 43 6c 6f 73 65 28 69 64 29 3b 0a  od->xClose(id);.
36820 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
36830 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e  ITE_OK;.}....#en
36840 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
36850 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
36860 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
36870 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
36880 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
36890 69 6e 67 20 73 74 79 6c 65 20 69 73 20 69 6e 74  ing style is int
368a0 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 77 69  ended for use wi
368b0 74 68 20 41 46 50 20 66 69 6c 65 73 79 73 74 65  th AFP filesyste
368c0 6d 73 2e 0a 2a 2a 20 41 6e 64 20 73 69 6e 63 65  ms..** And since
368d0 20 41 46 50 20 69 73 20 6f 6e 6c 79 20 73 75 70   AFP is only sup
368e0 70 6f 72 74 65 64 20 6f 6e 20 4d 61 63 4f 53 58  ported on MacOSX
368f0 2c 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  , the proxy lock
36900 69 6e 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72  ing is also.** r
36910 65 73 74 72 69 63 74 65 64 20 74 6f 20 4d 61 63  estricted to Mac
36920 4f 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a  OSX..** .**.****
36930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
36940 45 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 78 79  End of the proxy
36950 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
36960 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
36970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
36980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
369a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
369b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
369c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
369d0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
369e0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
369f0 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  em interface..**
36a00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
36a10 20 72 65 67 69 73 74 65 72 73 20 61 6c 6c 20 56   registers all V
36a20 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  FS implementatio
36a30 6e 73 20 66 6f 72 20 75 6e 69 78 2d 6c 69 6b 65  ns for unix-like
36a40 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79   operating.** sy
36a50 73 74 65 6d 73 2e 20 20 54 68 69 73 20 72 6f 75  stems.  This rou
36a60 74 69 6e 65 2c 20 61 6e 64 20 74 68 65 20 73 71  tine, and the sq
36a70 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 20 72  lite3_os_end() r
36a80 6f 75 74 69 6e 65 20 74 68 61 74 20 66 6f 6c 6c  outine that foll
36a90 6f 77 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 62  ows,.** should b
36aa0 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69  e the only routi
36ab0 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65  nes in this file
36ac0 20 74 68 61 74 20 61 72 65 20 76 69 73 69 62 6c   that are visibl
36ad0 65 20 66 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20  e from other.** 
36ae0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  files..**.** Thi
36af0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
36b00 6c 65 64 20 6f 6e 63 65 20 64 75 72 69 6e 67 20  led once during 
36b10 53 51 4c 69 74 65 20 69 6e 69 74 69 61 6c 69 7a  SQLite initializ
36b20 61 74 69 6f 6e 20 61 6e 64 20 62 79 20 61 0a 2a  ation and by a.*
36b30 2a 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e  * single thread.
36b40 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c    The memory all
36b50 6f 63 61 74 69 6f 6e 20 61 6e 64 20 6d 75 74 65  ocation and mute
36b60 78 20 73 75 62 73 79 73 74 65 6d 73 20 68 61 76  x subsystems hav
36b70 65 20 6e 6f 74 0a 2a 2a 20 6e 65 63 65 73 73 61  e not.** necessa
36b80 72 69 6c 79 20 62 65 65 6e 20 69 6e 69 74 69 61  rily been initia
36b90 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20  lized when this 
36ba0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
36bb0 64 2c 20 61 6e 64 20 73 6f 20 74 68 65 79 0a 2a  d, and so they.*
36bc0 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  * should not be 
36bd0 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  used..*/.int sql
36be0 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69  ite3_os_init(voi
36bf0 64 29 7b 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  d){ .  /* .  ** 
36c00 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  The following ma
36c10 63 72 6f 20 64 65 66 69 6e 65 73 20 61 6e 20 69  cro defines an i
36c20 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 61  nitializer for a
36c30 6e 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62  n sqlite3_vfs ob
36c40 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e  ject..  ** The n
36c50 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 69  ame of the VFS i
36c60 73 20 4e 41 4d 45 2e 20 20 54 68 65 20 70 41 70  s NAME.  The pAp
36c70 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74  pData is a point
36c80 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 0a  er to a pointer.
36c90 20 20 2a 2a 20 74 6f 20 74 68 65 20 22 66 69 6e    ** to the "fin
36ca0 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20  der" function.  
36cb0 28 70 41 70 70 44 61 74 61 20 69 73 20 61 20 70  (pAppData is a p
36cc0 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 6f 69 6e  ointer to a poin
36cd0 74 65 72 20 62 65 63 61 75 73 65 0a 20 20 2a 2a  ter because.  **
36ce0 20 73 69 6c 6c 79 20 43 39 30 20 72 75 6c 65 73   silly C90 rules
36cf0 20 70 72 6f 68 69 62 69 74 20 61 20 76 6f 69 64   prohibit a void
36d00 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 61 73  * from being cas
36d10 74 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  t to a function 
36d20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 6e 64  pointer.  ** and
36d30 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 67   so we have to g
36d40 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e  o through the in
36d50 74 65 72 6d 65 64 69 61 74 65 20 70 6f 69 6e 74  termediate point
36d60 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62  er to avoid prob
36d70 6c 65 6d 73 0a 20 20 2a 2a 20 77 68 65 6e 20 63  lems.  ** when c
36d80 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 2d 70  ompiling with -p
36d90 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 6f  edantic-errors o
36da0 6e 20 47 43 43 2e 29 0a 20 20 2a 2a 0a 20 20 2a  n GCC.).  **.  *
36db0 2a 20 54 68 65 20 46 49 4e 44 45 52 20 70 61 72  * The FINDER par
36dc0 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 6d  ameter to this m
36dd0 61 63 72 6f 20 69 73 20 74 68 65 20 6e 61 6d 65  acro is the name
36de0 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20   of the pointer 
36df0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 64  to the.  ** find
36e00 65 72 2d 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  er-function.  Th
36e10 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  e finder-functio
36e20 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
36e30 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ter to the.  ** 
36e40 73 71 6c 69 74 65 5f 69 6f 5f 6d 65 74 68 6f 64  sqlite_io_method
36e50 73 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  s object that im
36e60 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 64 65 73  plements the des
36e70 69 72 65 64 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ired locking.  *
36e80 2a 20 62 65 68 61 76 69 6f 72 73 2e 20 20 53 65  * behaviors.  Se
36e90 65 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 61  e the division a
36ea0 62 6f 76 65 20 74 68 61 74 20 63 6f 6e 74 61 69  bove that contai
36eb0 6e 73 20 74 68 65 20 49 4f 4d 45 54 48 4f 44 53  ns the IOMETHODS
36ec0 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 66 6f 72 20  .  ** macro for 
36ed0 61 64 64 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  addition informa
36ee0 74 69 6f 6e 20 6f 6e 20 66 69 6e 64 65 72 2d 66  tion on finder-f
36ef0 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20  unctions..  **. 
36f00 20 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 73   ** Most finders
36f10 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 61   simply return a
36f20 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69   pointer to a fi
36f30 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  xed sqlite3_io_m
36f40 65 74 68 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a 65  ethods.  ** obje
36f50 63 74 2e 20 20 42 75 74 20 74 68 65 20 22 61 75  ct.  But the "au
36f60 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 22 20  tolockIoFinder" 
36f70 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
36f80 4f 53 58 20 64 6f 65 73 20 61 20 6c 69 74 74 6c  OSX does a littl
36f90 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  e.  ** more than
36fa0 20 74 68 61 74 3b 20 69 74 20 6c 6f 6f 6b 73 20   that; it looks 
36fb0 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  at the filesyste
36fc0 6d 20 74 79 70 65 20 74 68 61 74 20 68 6f 73 74  m type that host
36fd0 73 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  s the .  ** data
36fe0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 72  base file and tr
36ff0 69 65 73 20 74 6f 20 63 68 6f 6f 73 65 20 61 6e  ies to choose an
37000 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
37010 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a  appropriate for.
37020 20 20 2a 2a 20 74 68 61 74 20 66 69 6c 65 73 79    ** that filesy
37030 73 74 65 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a  stem time..  */.
37040 20 20 23 64 65 66 69 6e 65 20 55 4e 49 58 56 46    #define UNIXVF
37050 53 28 56 46 53 4e 41 4d 45 2c 20 46 49 4e 44 45  S(VFSNAME, FINDE
37060 52 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  R) {            
37070 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37080 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
37090 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
370a0 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ion */          
370b0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
370c0 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
370d0 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c  ,     /* szOsFil
370e0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
370f0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 4d 41          \.    MA
37100 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20 20 20  X_PATHNAME,     
37110 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d      /* mxPathnam
37120 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
37130 20 20 20 20 20 20 5c 0a 20 20 20 20 30 2c 20 20        \.    0,  
37140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37150 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 20 20 20    /* pNext */   
37160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37170 20 20 20 20 5c 0a 20 20 20 20 56 46 53 4e 41 4d      \.    VFSNAM
37180 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
37190 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 20 20 20 20 20  /* zName */     
371a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
371b0 20 20 5c 0a 20 20 20 20 28 76 6f 69 64 2a 29 26    \.    (void*)&
371c0 46 49 4e 44 45 52 2c 20 20 20 20 20 20 20 2f 2a  FINDER,       /*
371d0 20 70 41 70 70 44 61 74 61 20 2a 2f 20 20 20 20   pAppData */    
371e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
371f0 5c 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20  \.    unixOpen, 
37200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
37210 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  Open */         
37220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
37230 20 20 20 20 75 6e 69 78 44 65 6c 65 74 65 2c 20      unixDelete, 
37240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
37250 6c 65 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lete */         
37260 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37270 20 20 75 6e 69 78 41 63 63 65 73 73 2c 20 20 20    unixAccess,   
37280 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
37290 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ss */           
372a0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
372b0 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  unixFullPathname
372c0 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61  ,     /* xFullPa
372d0 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20  thname */       
372e0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
372f0 69 78 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20  ixDlOpen,       
37300 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
37310 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
37320 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
37330 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
37340 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
37350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37360 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c      \.    unixDl
37370 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
37380 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 20 20 20 20  /* xDlSym */    
37390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
373a0 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c    \.    unixDlCl
373b0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ose,          /*
373c0 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 20 20 20 20   xDlClose */    
373d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
373e0 5c 0a 20 20 20 20 75 6e 69 78 52 61 6e 64 6f 6d  \.    unixRandom
373f0 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  ness,       /* x
37400 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 20 20 20  Randomness */   
37410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
37420 20 20 20 20 75 6e 69 78 53 6c 65 65 70 2c 20 20      unixSleep,  
37430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
37440 65 65 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  eep */          
37450 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37460 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d    unixCurrentTim
37470 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72  e,      /* xCurr
37480 65 6e 74 54 69 6d 65 20 2a 2f 20 20 20 20 20 20  entTime */      
37490 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
374a0 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72  unixGetLastError
374b0 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73  ,     /* xGetLas
374c0 74 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20  tError */       
374d0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
374e0 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  ixCurrentTimeInt
374f0 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  64, /* xCurrentT
37500 69 6d 65 49 6e 74 36 34 20 2a 2f 20 20 20 20 20  imeInt64 */     
37510 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
37520 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  SetSystemCall,  
37530 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43    /* xSetSystemC
37540 61 6c 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20  all */          
37550 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65      \.    unixGe
37560 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
37570 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c  /* xGetSystemCal
37580 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  l */            
37590 20 20 5c 0a 20 20 20 20 75 6e 69 78 4e 65 78 74    \.    unixNext
375a0 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a  SystemCall,   /*
375b0 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c   xNextSystemCall
375c0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
375d0 5c 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  \.  }..  /*.  **
375e0 20 41 6c 6c 20 64 65 66 61 75 6c 74 20 56 46 53   All default VFS
375f0 65 73 20 66 6f 72 20 75 6e 69 78 20 61 72 65 20  es for unix are 
37600 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
37610 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79   following array
37620 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
37630 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
37640 33 5f 76 66 73 2e 70 4e 65 78 74 20 66 69 65 6c  3_vfs.pNext fiel
37650 64 20 6f 66 20 74 68 65 20 56 46 53 20 6f 62 6a  d of the VFS obj
37660 65 63 74 20 69 73 20 6d 6f 64 69 66 69 65 64 0a  ect is modified.
37670 20 20 2a 2a 20 62 79 20 74 68 65 20 53 51 4c 69    ** by the SQLi
37680 74 65 20 63 6f 72 65 20 77 68 65 6e 20 74 68 65  te core when the
37690 20 56 46 53 20 69 73 20 72 65 67 69 73 74 65 72   VFS is register
376a0 65 64 2e 20 20 53 6f 20 74 68 65 20 66 6f 6c 6c  ed.  So the foll
376b0 6f 77 69 6e 67 0a 20 20 2a 2a 20 61 72 72 61 79  owing.  ** array
376c0 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74   cannot be const
376d0 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ..  */.  static 
376e0 73 71 6c 69 74 65 33 5f 76 66 73 20 61 56 66 73  sqlite3_vfs aVfs
376f0 5b 5d 20 3d 20 7b 0a 23 69 66 20 53 51 4c 49 54  [] = {.#if SQLIT
37700 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
37710 5f 53 54 59 4c 45 20 26 26 20 28 4f 53 5f 56 58  _STYLE && (OS_VX
37720 57 4f 52 4b 53 20 7c 7c 20 64 65 66 69 6e 65 64  WORKS || defined
37730 28 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a 20 20 20  (__APPLE__)).   
37740 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22 2c   UNIXVFS("unix",
37750 20 20 20 20 20 20 20 20 20 20 61 75 74 6f 6c 6f            autolo
37760 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  ckIoFinder ),.#e
37770 6c 73 65 0a 20 20 20 20 55 4e 49 58 56 46 53 28  lse.    UNIXVFS(
37780 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20  "unix",         
37790 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29   posixIoFinder )
377a0 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 55 4e 49  ,.#endif.    UNI
377b0 58 56 46 53 28 22 75 6e 69 78 2d 6e 6f 6e 65 22  XVFS("unix-none"
377c0 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69  ,     nolockIoFi
377d0 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58  nder ),.    UNIX
377e0 56 46 53 28 22 75 6e 69 78 2d 64 6f 74 66 69 6c  VFS("unix-dotfil
377f0 65 22 2c 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69  e",  dotlockIoFi
37800 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58  nder ),.    UNIX
37810 56 46 53 28 22 75 6e 69 78 2d 65 78 63 6c 22 2c  VFS("unix-excl",
37820 20 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e 64       posixIoFind
37830 65 72 20 29 2c 0a 23 69 66 20 4f 53 5f 56 58 57  er ),.#if OS_VXW
37840 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58 56 46 53  ORKS.    UNIXVFS
37850 28 22 75 6e 69 78 2d 6e 61 6d 65 64 73 65 6d 22  ("unix-namedsem"
37860 2c 20 73 65 6d 49 6f 46 69 6e 64 65 72 20 29 2c  , semIoFinder ),
37870 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
37880 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
37890 47 5f 53 54 59 4c 45 0a 20 20 20 20 55 4e 49 58  G_STYLE.    UNIX
378a0 56 46 53 28 22 75 6e 69 78 2d 70 6f 73 69 78 22  VFS("unix-posix"
378b0 2c 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e 64  ,    posixIoFind
378c0 65 72 20 29 2c 0a 23 69 66 20 21 4f 53 5f 56 58  er ),.#if !OS_VX
378d0 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58 56 46  WORKS.    UNIXVF
378e0 53 28 22 75 6e 69 78 2d 66 6c 6f 63 6b 22 2c 20  S("unix-flock", 
378f0 20 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72     flockIoFinder
37900 20 29 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69   ),.#endif.#endi
37910 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
37920 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
37930 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
37940 50 50 4c 45 5f 5f 29 0a 20 20 20 20 55 4e 49 58  PPLE__).    UNIX
37950 56 46 53 28 22 75 6e 69 78 2d 61 66 70 22 2c 20  VFS("unix-afp", 
37960 20 20 20 20 20 61 66 70 49 6f 46 69 6e 64 65 72       afpIoFinder
37970 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28   ),.    UNIXVFS(
37980 22 75 6e 69 78 2d 6e 66 73 22 2c 20 20 20 20 20  "unix-nfs",     
37990 20 6e 66 73 49 6f 46 69 6e 64 65 72 20 29 2c 0a   nfsIoFinder ),.
379a0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
379b0 78 2d 70 72 6f 78 79 22 2c 20 20 20 20 70 72 6f  x-proxy",    pro
379c0 78 79 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  xyIoFinder ),.#e
379d0 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 75 6e 73 69  ndif.  };.  unsi
379e0 67 6e 65 64 20 69 6e 74 20 69 3b 20 20 20 20 20  gned int i;     
379f0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
37a00 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f  nter */..  /* Do
37a10 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20  uble-check that 
37a20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61  the aSyscall[] a
37a30 72 72 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f  rray has been co
37a40 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63  nstructed.  ** c
37a50 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74  orrectly.  See t
37a60 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39  icket [bb3a86e89
37a70 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61  0c8e96ab] */.  a
37a80 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65  ssert( ArraySize
37a90 28 61 53 79 73 63 61 6c 6c 29 3d 3d 31 36 20 29  (aSyscall)==16 )
37aa0 3b 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  ;..  /* Register
37ab0 20 61 6c 6c 20 56 46 53 65 73 20 64 65 66 69 6e   all VFSes defin
37ac0 65 64 20 69 6e 20 74 68 65 20 61 56 66 73 5b 5d  ed in the aVfs[]
37ad0 20 61 72 72 61 79 20 2a 2f 0a 20 20 66 6f 72 28   array */.  for(
37ae0 69 3d 30 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61  i=0; i<(sizeof(a
37af0 56 66 73 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69  Vfs)/sizeof(sqli
37b00 74 65 33 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b  te3_vfs)); i++){
37b10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
37b20 5f 72 65 67 69 73 74 65 72 28 26 61 56 66 73 5b  _register(&aVfs[
37b30 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20  i], i==0);.  }. 
37b40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
37b50 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  K; .}../*.** Shu
37b60 74 64 6f 77 6e 20 74 68 65 20 6f 70 65 72 61 74  tdown the operat
37b70 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
37b80 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  face..**.** Some
37b90 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
37ba0 6d 73 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ms might need to
37bb0 20 64 6f 20 73 6f 6d 65 20 63 6c 65 61 6e 75 70   do some cleanup
37bc0 20 69 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   in this routine
37bd0 2c 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65 20  ,.** to release 
37be0 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
37bf0 63 61 74 65 64 20 6f 62 6a 65 63 74 73 2e 20 20  cated objects.  
37c00 42 75 74 20 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e  But not on unix.
37c10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
37c20 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
37c30 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  unix..*/.int sql
37c40 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64  ite3_os_end(void
37c50 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ){ .  return SQL
37c60 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e  ITE_OK; .}. .#en
37c70 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
37c80 5f 55 4e 49 58 20 2a 2f 0a                       _UNIX */.