/ Hex Artifact Content
Login

Artifact dcb42d74044efcf760c3c03c668e9e7314aa2427:


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 23 69 66 64 65 66 20 48 41 56 45 5f  if..#ifdef HAVE_
12c0: 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20  UTIME.# include 
12d0: 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66  <utime.h>.#endif
12e0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
12f0: 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69  values of unixFi
1300: 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64  le.fsFlags.*/.#d
1310: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46  efine SQLITE_FSF
1320: 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20  LAGS_IS_MSDOS   
1330: 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    0x1../*.** If 
1340: 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68 72  we are to be thr
1350: 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64  ead-safe, includ
1360: 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20 68  e the pthreads h
1370: 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65  eader and define
1380: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55  .** the SQLITE_U
1390: 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72  NIX_THREADS macr
13a0: 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  o..*/.#if SQLITE
13b0: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e  _THREADSAFE.# in
13c0: 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68  clude <pthread.h
13d0: 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  >.# define SQLIT
13e0: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31  E_UNIX_THREADS 1
13f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
1400: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1410: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1420: 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23   a new file.*/.#
1430: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
1440: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
1450: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
1460: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
1470: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
1480: 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0644.#endif../*.
1490: 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d   ** Default perm
14a0: 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65  issions when cre
14b0: 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79  ating auto proxy
14c0: 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66   dir. */.#ifndef
14d0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14e0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14f0: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
1500: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
1510: 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
1520: 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f  S 0755.#endif../
1530: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70  *.** Maximum sup
1540: 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67  ported path-leng
1550: 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  th..*/.#define M
1560: 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a  AX_PATHNAME 512.
1570: 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20  ./*.** Only set 
1580: 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66  the lastErrno if
1590: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
15a0: 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20  is a real error 
15b0: 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f  and not .** a no
15c0: 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65  rmal expected re
15d0: 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c  turn code of SQL
15e0: 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49  ITE_BUSY or SQLI
15f0: 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65  TE_OK.*/.#define
1600: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78   IS_LOCK_ERROR(x
1610: 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45  )  ((x != SQLITE
1620: 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51  _OK) && (x != SQ
1630: 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20  LITE_BUSY))../* 
1640: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1650: 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  es */.typedef st
1660: 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69  ruct unixShm uni
1670: 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  xShm;           
1680: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1690: 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
16a0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
16b0: 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e  t unixShmNode un
16c0: 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  ixShmNode;      
16d0: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
16e0: 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79  y instance */.ty
16f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69  pedef struct uni
1700: 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49  xInodeInfo unixI
1710: 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41  nodeInfo;   /* A
1720: 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65  n i-node */.type
1730: 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55  def struct UnixU
1740: 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73  nusedFd UnixUnus
1750: 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20  edFd;     /* An 
1760: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1770: 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  riptor */../*.**
1780: 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65   Sometimes, afte
1790: 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  r a file handle 
17a0: 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c  is closed by SQL
17b0: 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65  ite, the file de
17c0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e  scriptor.** cann
17d0: 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d  ot be closed imm
17e0: 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65  ediately. In the
17f0: 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e  se cases, instan
1800: 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ces of the follo
1810: 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  wing.** structur
1820: 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74  e are used to st
1830: 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ore the file des
1840: 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61  criptor while wa
1850: 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20  iting for an.** 
1860: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65  opportunity to e
1870: 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72  ither close or r
1880: 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75  euse it..*/.stru
1890: 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ct UnixUnusedFd 
18a0: 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  {.  int fd;     
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18c0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
18d0: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69   to close */.  i
18e0: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
18f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1900: 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63  s this file desc
1910: 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65  riptor was opene
1920: 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78  d with */.  Unix
1930: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
1940: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
1950: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1960: 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c  ptor on same fil
1970: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  e */.};../*.** T
1980: 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
1990: 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73  cture is subclas
19a0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
19b0: 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  e specific to th
19c0: 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d  e unix.** VFS im
19d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a  plementations..*
19e0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
19f0: 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69   unixFile unixFi
1a00: 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46  le;.struct unixF
1a10: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile {.  sqlite3_
1a20: 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
1a30: 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41   *pMethod;  /* A
1a40: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1a50: 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e 69 78 49  entry */.  unixI
1a60: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1a70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1a80: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1a90: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1aa0: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ad0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1ae0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1af0: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b10: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b20: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1b40: 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20   ctrlFlags;     
1b50: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1b60: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1b70: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1b80: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1bb0: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1bc0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1bd0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1be0: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1bf0: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1c00: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1c10: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1c20: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c40: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1c50: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1c60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c70: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1c80: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1c90: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1ca0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1cd0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1ce0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1cf0: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d20: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d30: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d40: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d50: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1d60: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d80: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1d90: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1da0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1db0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1dc0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1dd0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1de0: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e10: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e20: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e30: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1e40: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1e70: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1e80: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1e90: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1ea0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
1eb0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
1ec0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ed0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1ee0: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1ef0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1f00: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1f10: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1f20: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1f30: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1f40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1f50: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1f60: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1f70: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1f80: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1f90: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1fa0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1fb0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1fc0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1fd0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
1fe0: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
1ff0: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2000: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2010: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2020: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2030: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2040: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2050: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
2060: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
2070: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
2080: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
2090: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
20a0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
20b0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
20c0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
20d0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
20e0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
20f0: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2100: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2110: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2120: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2130: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2140: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
2150: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2160: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2170: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
2180: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
2190: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
21a0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
21b0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
21c0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
21d0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
21e0: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
21f0: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2200: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2210: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
2220: 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65  for the unixFile
2230: 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61  .ctrlFlags bitma
2240: 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  sk:.*/.#define U
2250: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20  NIXFILE_EXCL    
2260: 20 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20      0x01     /* 
2270: 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  Connections from
2280: 20 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c   one process onl
2290: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
22a0: 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20  XFILE_RDONLY    
22b0: 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f    0x02     /* Co
22c0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64  nnection is read
22d0: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
22e0: 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
22f0: 54 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f  T_WAL 0x04     /
2300: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c  * Persistent WAL
2310: 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66   mode */.#ifndef
2320: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2330: 44 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  DIRSYNC.# define
2340: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2350: 43 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a  C    0x08     /*
2360: 20 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   Directory sync 
2370: 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a  needed */.#else.
2380: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
2390: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
23a0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
23b0: 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61  Include code tha
23c0: 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  t is common to a
23d0: 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a  ll os_*.c files.
23e0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f  */.#include "os_
23f0: 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a  common.h"../*.**
2400: 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20   Define various 
2410: 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20  macros that are 
2420: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d  missing from som
2430: 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69  e systems..*/.#i
2440: 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  fndef O_LARGEFIL
2450: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
2460: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
2470: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
2480: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65  SABLE_LFS.# unde
2490: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
24a0: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
24b0: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  LE 0.#endif.#ifn
24c0: 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23  def O_NOFOLLOW.#
24d0: 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c   define O_NOFOLL
24e0: 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  OW 0.#endif.#ifn
24f0: 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64  def O_BINARY.# d
2500: 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30  efine O_BINARY 0
2510: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
2520: 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63 72  he threadid macr
2530: 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68  o resolves to th
2540: 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74  e thread-id or t
2550: 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a  o 0.  Used for.*
2560: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  * testing and de
2570: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
2580: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
2590: 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74  ADSAFE.#define t
25a0: 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64 5f  hreadid pthread_
25b0: 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65  self().#else.#de
25c0: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a  fine threadid 0.
25d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69  #endif../*.** Di
25e0: 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73  fferent Unix sys
25f0: 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65  tems declare ope
2600: 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74  n() in different
2610: 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65   ways.  Same use
2620: 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63  .** open(const c
2630: 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29  har*,int,mode_t)
2640: 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70  .  Others use op
2650: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  en(const char*,i
2660: 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20  nt,...)..** The 
2670: 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d  difference is im
2680: 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69  portant when usi
2690: 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ng a pointer to 
26a0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  the function..**
26b0: 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77  .** The safest w
26c0: 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ay to deal with 
26d0: 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74  the problem is t
26e0: 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69  o always use thi
26f0: 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69  s wrapper.** whi
2700: 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68  ch always has th
2710: 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69  e same well-defi
2720: 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  ned interface..*
2730: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
2740: 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  ixOpen(const cha
2750: 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c  r *zFile, int fl
2760: 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a  ags, int mode){.
2770: 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46    return open(zF
2780: 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65  ile, flags, mode
2790: 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  );.}../* Forward
27a0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
27b0: 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
27c0: 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
27d0: 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a  r*, int*);../*.*
27e0: 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61  * Many system ca
27f0: 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64  lls are accessed
2800: 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72   through pointer
2810: 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f  -to-functions so
2820: 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61   that.** they ma
2830: 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  y be overridden 
2840: 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61  at runtime to fa
2850: 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69  cilitate fault i
2860: 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a  njection during.
2870: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73  ** testing and s
2880: 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20  andboxing.  The 
2890: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20  following array 
28a0: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20  holds the names 
28b0: 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  and pointers.** 
28c0: 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61  to all overridea
28d0: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
28e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
28f0: 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20  ct unix_syscall 
2900: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2910: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
2920: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2930: 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20   sytem call */. 
2940: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
2950: 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f  _ptr pCurrent; /
2960: 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * Current value 
2970: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
2980: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
2990: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66  syscall_ptr pDef
29a0: 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74  ault; /* Default
29b0: 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73   value */.} aSys
29c0: 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22  call[] = {.  { "
29d0: 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28  open",         (
29e0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
29f0: 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20  ptr)posixOpen,  
2a00: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2a10: 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28  Open      ((int(
2a20: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
2a30: 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  nt,int))aSyscall
2a40: 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [0].pCurrent).. 
2a50: 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20   { "close",     
2a60: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2a70: 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20  all_ptr)close,  
2a80: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2a90: 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28  e osClose     ((
2aa0: 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73  int(*)(int))aSys
2ab0: 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74  call[1].pCurrent
2ac0: 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c  )..  { "access",
2ad0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2ae0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65  syscall_ptr)acce
2af0: 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ss,     0  },.#d
2b00: 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20  efine osAccess  
2b10: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
2b20: 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73   char*,int))aSys
2b30: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
2b40: 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c  )..  { "getcwd",
2b50: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2b60: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63  syscall_ptr)getc
2b70: 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  wd,     0  },.#d
2b80: 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20  efine osGetcwd  
2b90: 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61    ((char*(*)(cha
2ba0: 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  r*,size_t))aSysc
2bb0: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
2bc0: 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20  ..  { "stat",   
2bd0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
2be0: 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c  yscall_ptr)stat,
2bf0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65         0  },.#de
2c00: 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20  fine osStat     
2c10: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
2c20: 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61  char*,struct sta
2c30: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e  t*))aSyscall[4].
2c40: 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a  pCurrent)../*.**
2c50: 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69   The DJGPP compi
2c60: 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ler environment 
2c70: 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b  looks mostly lik
2c80: 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a  e Unix, but it.*
2c90: 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74  * lacks the fcnt
2ca0: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  l() system call.
2cb0: 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63    So redefine fc
2cc0: 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65  ntl() to be some
2cd0: 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c  thing.** that al
2ce0: 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20  ways succeeds.  
2cf0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
2d00: 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74  locking does not
2d10: 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20   occur under.** 
2d20: 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69  DJGPP.  But it i
2d30: 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64  s DOS - what did
2d40: 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a   you expect?.*/.
2d50: 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  #ifdef __DJGPP__
2d60: 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20  .  { "fstat",   
2d70: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
2d80: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64          0  },.#d
2d90: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c  efine osFstat(a,
2da0: 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20  b,c)    0.#else 
2db0: 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22      .  { "fstat"
2dc0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
2dd0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73  3_syscall_ptr)fs
2de0: 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  tat,      0  },.
2df0: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20  #define osFstat 
2e00: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
2e10: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
2e20: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
2e30: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b  ent).#endif..  {
2e40: 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20   "ftruncate",   
2e50: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
2e60: 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c  l_ptr)ftruncate,
2e70: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
2e80: 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e  osFtruncate ((in
2e90: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29  t(*)(int,off_t))
2ea0: 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72  aSyscall[6].pCur
2eb0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74  rent)..  { "fcnt
2ec0: 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  l",        (sqli
2ed0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2ee0: 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d  fcntl,      0  }
2ef0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  ,.#define osFcnt
2f00: 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  l     ((int(*)(i
2f10: 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73  nt,int,...))aSys
2f20: 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74  call[7].pCurrent
2f30: 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20  )..  { "read",  
2f40: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2f50: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64  syscall_ptr)read
2f60: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
2f70: 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20  efine osRead    
2f80: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
2f90: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  nt,void*,size_t)
2fa0: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
2fb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
2fc0: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
2fd0: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
2fe0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2ff0: 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20  { "pread",      
3000: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3010: 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20  ll_ptr)pread,   
3020: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
3030: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
3040: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3050: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3060: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3070: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
3080: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
3090: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
30a0: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
30b0: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
30c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
30d0: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
30e0: 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73  read64",      (s
30f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3100: 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20 30  tr)pread64,    0
3110: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
3120: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3130: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3140: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3150: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3160: 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20 20  fine osPread64  
3170: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3180: 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t,void*,size_t,o
3190: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
31a0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
31b0: 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20 20  { "write",      
31c0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
31d0: 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20  ll_ptr)write,   
31e0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
31f0: 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28 73   osWrite     ((s
3200: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
3210: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
3220: 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70  ))aSyscall[11].p
3230: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3240: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
3250: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
3260: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
3270: 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20    { "pwrite",   
3280: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3290: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c  call_ptr)pwrite,
32a0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
32b0: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
32c0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
32d0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
32e0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
32f0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
3300: 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ite    ((ssize_t
3310: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3320: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3330: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3340: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3350: 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [12].pCurrent)..
3360: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
3370: 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77  PREAD64).  { "pw
3380: 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71  rite64",     (sq
3390: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
33a0: 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30 20  r)pwrite64,   0 
33b0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
33c0: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
33d0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
33e0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
33f0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3400: 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20 20  ine osPwrite64  
3410: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3420: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a  ,const void*,siz
3430: 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20  e_t,off_t))\.   
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43   aSyscall[13].pC
3460: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
3470: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
3480: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 66 63  NG_STYLE.  { "fc
3490: 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71  hmod",       (sq
34a0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
34b0: 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 30 20  r)fchmod,     0 
34c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66   },.#else.  { "f
34d0: 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73  chmod",       (s
34e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
34f0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3500: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3510: 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20  ine osFchmod    
3520: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64  ((int(*)(int,mod
3530: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  e_t))aSyscall[14
3540: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3550: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
3560: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
3570: 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
3580: 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c  LOCATE.  { "fall
3590: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
35a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
35b0: 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c  posix_fallocate,
35c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
35d0: 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20   "fallocate",   
35e0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
35f0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
3600: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3610: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61  dif.#define osFa
3620: 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29  llocate ((int(*)
3630: 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74  (int,off_t,off_t
3640: 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70  ))aSyscall[15].p
3650: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75  Current)..  { "u
3660: 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73  nlink",       (s
3670: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3680: 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20  tr)unlink,      
3690: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
36a0: 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28  e osUnlink    ((
36b0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
36c0: 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  r*))aSyscall[16]
36d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
36e0: 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c  "openDirectory",
36f0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3700: 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72  call_ptr)openDir
3710: 65 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d  ectory,      0 }
3720: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e  ,.#define osOpen
3730: 44 69 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28  Directory ((int(
3740: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
3750: 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37  nt*))aSyscall[17
3760: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3770: 20 22 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20   "mkdir",       
3780: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3790: 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20  l_ptr)mkdir,    
37a0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66         0 },.#def
37b0: 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20  ine osMkdir     
37c0: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
37d0: 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79  har*,mode_t))aSy
37e0: 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65  scall[18].pCurre
37f0: 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22  nt)..  { "rmdir"
3800: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3810: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d  3_syscall_ptr)rm
3820: 64 69 72 2c 20 20 20 20 20 20 20 20 20 20 20 30  dir,           0
3830: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d   },.#define osRm
3840: 64 69 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29  dir     ((int(*)
3850: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53  (const char*))aS
3860: 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72  yscall[19].pCurr
3870: 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20  ent)..}; /* End 
3880: 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61  of the overridea
3890: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
38a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
38b0: 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65  is the xSetSyste
38c0: 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f  mCall() method o
38d0: 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f  f sqlite3_vfs fo
38e0: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  r all of the.** 
38f0: 22 75 6e 69 78 22 20 56 46 53 65 73 2e 20 20 52  "unix" VFSes.  R
3900: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
3910: 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  opon successfull
3920: 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a  y updating the.*
3930: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f  * system call po
3940: 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45  inter, or SQLITE
3950: 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65  _NOTFOUND if the
3960: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75  re is no configu
3970: 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20  rable.** system 
3980: 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  call named zName
3990: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
39a0: 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43 61 6c  unixSetSystemCal
39b0: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
39c0: 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20   *pNotUsed,     
39d0: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f     /* The VFS po
39e0: 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64  inter.  Not used
39f0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3a00: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
3a10: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73      /* Name of s
3a20: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76  ystem call to ov
3a30: 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69  erride */.  sqli
3a40: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3a50: 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69  pNewFunc  /* Poi
3a60: 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74  nter to new syst
3a70: 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f  em call value */
3a80: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
3a90: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
3aa0: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
3ab0: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
3ac0: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
3ad0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
3ae0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ){.    /* If no 
3af0: 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20  zName is given, 
3b00: 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74  restore all syst
3b10: 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69  em calls to thei
3b20: 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  r default.    **
3b30: 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65   settings and re
3b40: 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f  turn NULL.    */
3b50: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
3b60: 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  _OK;.    for(i=0
3b70: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
3b80: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
3b90: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
3ba0: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
3bb0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29  ll[i].pDefault )
3bc0: 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  {.        aSysca
3bd0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
3be0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3bf0: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20  fault;.      }. 
3c00: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
3c10: 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
3c20: 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72   specified, oper
3c30: 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20  ate on only the 
3c40: 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  one system call.
3c50: 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64      ** specified
3c60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
3c70: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
3c80: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
3c90: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
3ca0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
3cb0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
3cc0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
3cd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
3ce0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3cf0: 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20  fault==0 ){.    
3d00: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
3d10: 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79  ].pDefault = aSy
3d20: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
3d30: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
3d40: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
3d50: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
3d60: 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70   pNewFunc==0 ) p
3d70: 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61  NewFunc = aSysca
3d80: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
3d90: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3da0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70  [i].pCurrent = p
3db0: 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  NewFunc;.       
3dc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3dd0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3de0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
3df0: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
3e00: 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c   of a system cal
3e10: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
3e20: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
3e30: 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20  a.** recognized 
3e40: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
3e50: 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20  .  NULL is also 
3e60: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
3e70: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69  system call.** i
3e80: 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  s currently unde
3e90: 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
3ea0: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
3eb0: 5f 70 74 72 20 75 6e 69 78 47 65 74 53 79 73 74  _ptr unixGetSyst
3ec0: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
3ed0: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
3ee0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3ef0: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
3f00: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
3f10: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
3f20: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
3f30: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
3f40: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
3f50: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
3f60: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
3f70: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
3f80: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
3f90: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
3fa0: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
3fb0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3fc0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
3fd0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
3fe0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
3ff0: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
4000: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
4010: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
4020: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
4030: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
4040: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
4050: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
4060: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
4070: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
4080: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
4090: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
40a0: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
40b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
40c0: 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73  NextSystemCall(s
40d0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63  qlite3_vfs *p, c
40e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
40f0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
4100: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
4110: 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a  ETER(p);.  if( z
4120: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
4130: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
4140: 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b  (aSyscall)-1; i+
4150: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
4160: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
4170: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
4180: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
4190: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20  .  }.  for(i++; 
41a0: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
41b0: 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  call); i++){.   
41c0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
41d0: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
41e0: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
41f0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
4200: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4210: 2a 20 52 65 74 72 79 20 6f 70 65 6e 28 29 20 63  * Retry open() c
4220: 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64  alls that fail d
4230: 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73  ue to EINTR.*/.s
4240: 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
4250: 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  _open(const char
4260: 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 69 6e 74 20   *z, int f, int 
4270: 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  m){.  int rc;.  
4280: 64 6f 7b 20 72 63 20 3d 20 6f 73 4f 70 65 6e 28  do{ rc = osOpen(
4290: 7a 2c 66 2c 6d 29 3b 20 7d 77 68 69 6c 65 28 20  z,f,m); }while( 
42a0: 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
42b0: 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e  INTR );.  return
42c0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65   rc;.}../*.** He
42d0: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  lper functions t
42e0: 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c  o obtain and rel
42f0: 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62  inquish the glob
4300: 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a  al mutex. The.**
4310: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73   global mutex is
4320: 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74   used to protect
4330: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
4340: 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b  fo and.** vxwork
4350: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 73 20  sFileId objects 
4360: 75 73 65 64 20 62 79 20 74 68 69 73 20 66 69 6c  used by this fil
4370: 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20  e, all of which 
4380: 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61 72 65  may be .** share
4390: 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68  d by multiple th
43a0: 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e  reads..**.** Fun
43b0: 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65 78 48  ction unixMutexH
43c0: 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f  eld() is used to
43d0: 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
43e0: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  he global mutex 
43f0: 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e  .** is held when
4400: 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
4410: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
4420: 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
4430: 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74   assert() .** st
4440: 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a  atements. e.g..*
4450: 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  *.**   unixEnter
4460: 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61  Mutex().**     a
4470: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
4480: 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 75  Held() );.**   u
4490: 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28 29 0a  nixEnterLeave().
44a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
44b0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 76 6f  nixEnterMutex(vo
44c0: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
44d0: 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
44e0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
44f0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
4500: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61  _MASTER));.}.sta
4510: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61  tic void unixLea
4520: 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  veMutex(void){. 
4530: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
4540: 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65  eave(sqlite3Mute
4550: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
4560: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
4570: 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  R));.}.#ifdef SQ
4580: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
4590: 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65 78 48  c int unixMutexH
45a0: 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65  eld(void) {.  re
45b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
45c0: 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d  ex_held(sqlite3M
45d0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
45e0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
45f0: 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  STER));.}.#endif
4600: 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ...#if defined(S
4610: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
4620: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
4630: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  BUG)./*.** Helpe
4640: 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70  r function for p
4650: 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63  rinting out trac
4660: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  e information fr
4670: 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20  om debugging.** 
4680: 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72  binaries. This r
4690: 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e  eturns the strin
46a0: 67 20 72 65 70 72 65 73 65 74 61 74 69 6f 6e 20  g represetation 
46b0: 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a  of the supplied.
46c0: 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d  ** integer lock-
46d0: 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  type..*/.static 
46e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69  const char *azFi
46f0: 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65  leLock(int eFile
4700: 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28  Lock){.  switch(
4710: 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
4720: 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20    case NO_LOCK: 
4730: 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20  return "NONE";. 
4740: 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c     case SHARED_L
4750: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41  OCK: return "SHA
4760: 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52  RED";.    case R
4770: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65  ESERVED_LOCK: re
4780: 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b  turn "RESERVED";
4790: 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e  .    case PENDIN
47a0: 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  G_LOCK: return "
47b0: 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61  PENDING";.    ca
47c0: 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  se EXCLUSIVE_LOC
47d0: 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55  K: return "EXCLU
47e0: 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74  SIVE";.  }.  ret
47f0: 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23  urn "ERROR";.}.#
4800: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
4810: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
4820: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20  /*.** Print out 
4830: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
4840: 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70  t all locking op
4850: 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
4860: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4870: 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65  used for trouble
4880: 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f  shooting locks o
4890: 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a  n multithreaded.
48a0: 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45  ** platforms.  E
48b0: 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69  nable by compili
48c0: 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51  ng with the -DSQ
48d0: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
48e0: 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  ** command-line 
48f0: 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f  option on the co
4900: 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f  mpiler.  This co
4910: 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a  de is normally.*
4920: 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  * turned off..*/
4930: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
4940: 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e  Trace(int fd, in
4950: 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f  t op, struct flo
4960: 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a  ck *p){.  char *
4970: 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b  zOpName, *zType;
4980: 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20  .  int s;.  int 
4990: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66  savedErrno;.  if
49a0: 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b  ( op==F_GETLK ){
49b0: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
49c0: 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  GETLK";.  }else 
49d0: 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20  if( op==F_SETLK 
49e0: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
49f0: 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "SETLK";.  }els
4a00: 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e  e{.    s = osFcn
4a10: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
4a20: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
4a30: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b  rintf("fcntl unk
4a40: 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22  nown %d %d %d\n"
4a50: 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20  , fd, op, s);.  
4a60: 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a    return s;.  }.
4a70: 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d    if( p->l_type=
4a80: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
4a90: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
4aa0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
4ab0: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
4ac0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
4ad0: 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  WRLCK";.  }else 
4ae0: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
4af0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _UNLCK ){.    zT
4b00: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
4b10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
4b20: 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61  rt( 0 );.  }.  a
4b30: 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e  ssert( p->l_when
4b40: 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a  ce==SEEK_SET );.
4b50: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
4b60: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65  , op, p);.  save
4b70: 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  dErrno = errno;.
4b80: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4b90: 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25  intf("fcntl %d %
4ba0: 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64  d %s %s %d %d %d
4bb0: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72   %d\n",.     thr
4bc0: 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61  eadid, fd, zOpNa
4bd0: 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  me, zType, (int)
4be0: 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  p->l_start, (int
4bf0: 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20  )p->l_len,.     
4c00: 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73  (int)p->l_pid, s
4c10: 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  );.  if( s==(-1)
4c20: 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20   && op==F_SETLK 
4c30: 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  && (p->l_type==F
4c40: 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74  _RDLCK || p->l_t
4c50: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b  ype==F_WRLCK) ){
4c60: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
4c70: 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a  k l2;.    l2 = *
4c80: 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  p;.    osFcntl(f
4c90: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29  d, F_GETLK, &l2)
4ca0: 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74  ;.    if( l2.l_t
4cb0: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
4cc0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52        zType = "R
4cd0: 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  DLCK";.    }else
4ce0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
4cf0: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_WRLCK ){.     
4d00: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
4d10: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4d20: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  l2.l_type==F_UNL
4d30: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
4d40: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20  e = "UNLCK";.   
4d50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
4d60: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d  sert( 0 );.    }
4d70: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
4d80: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66  gPrintf("fcntl-f
4d90: 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25  ailure-reason: %
4da0: 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  s %d %d %d\n",. 
4db0: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e        zType, (in
4dc0: 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69  t)l2.l_start, (i
4dd0: 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e  nt)l2.l_len, (in
4de0: 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d  t)l2.l_pid);.  }
4df0: 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64  .  errno = saved
4e00: 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  Errno;.  return 
4e10: 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63  s;.}.#undef osFc
4e20: 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  ntl.#define osFc
4e30: 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65  ntl lockTrace.#e
4e40: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c  ndif /* SQLITE_L
4e50: 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  OCK_TRACE */../*
4e60: 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63  .** Retry ftrunc
4e70: 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74  ate() calls that
4e80: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e   fail due to EIN
4e90: 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  TR.*/.static int
4ea0: 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
4eb0: 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65 33  e(int h, sqlite3
4ec0: 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e  _int64 sz){.  in
4ed0: 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d  t rc;.  do{ rc =
4ee0: 20 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c 73   osFtruncate(h,s
4ef0: 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  z); }while( rc<0
4f00: 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
4f10: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
4f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
4f30: 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65  outine translate
4f40: 73 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53  s a standard POS
4f50: 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e  IX errno code in
4f60: 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
4f70: 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c  useful to the cl
4f80: 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c  ients of the sql
4f90: 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20  ite3 functions. 
4fa0: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69   Specifically, i
4fb0: 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64  t is.** intended
4fc0: 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20   to translate a 
4fd0: 76 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20  variety of "try 
4fe0: 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e  again" errors in
4ff0: 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a  to SQLITE_BUSY.*
5000: 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20  * and a variety 
5010: 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65  of "please close
5020: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
5030: 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73  ptor NOW" errors
5040: 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45   into .** SQLITE
5050: 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72  _IOERR.** .** Er
5060: 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74  rors during init
5070: 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f  ialization of lo
5080: 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73  cks, or file sys
5090: 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20  tem support for 
50a0: 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64  locks,.** should
50b0: 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20   handle ENOLCK, 
50c0: 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53  ENOTSUP, EOPNOTS
50d0: 55 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a  UPP separately..
50e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
50f0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
5100: 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69  ixError(int posi
5110: 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69  xError, int sqli
5120: 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69  teIOErr) {.  swi
5130: 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29  tch (posixError)
5140: 20 7b 0a 23 69 66 20 30 0a 20 20 2f 2a 20 41 74   {.#if 0.  /* At
5150: 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20   one point this 
5160: 63 6f 64 65 20 77 61 73 20 6e 6f 74 20 63 6f 6d  code was not com
5170: 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49 6e 20 74  mented out. In t
5180: 68 65 6f 72 79 2c 20 74 68 69 73 20 62 72 61 6e  heory, this bran
5190: 63 68 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e  ch.  ** should n
51a0: 65 76 65 72 20 62 65 20 68 69 74 2c 20 61 73 20  ever be hit, as 
51b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
51c0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
51d0: 6c 65 64 20 61 66 74 65 72 0a 20 20 2a 2a 20 61  led after.  ** a
51e0: 20 6c 6f 63 6b 69 6e 67 2d 72 65 6c 61 74 65 64   locking-related
51f0: 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20   function (i.e. 
5200: 66 63 6e 74 6c 28 29 29 20 68 61 73 20 72 65 74  fcntl()) has ret
5210: 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 77  urned non-zero w
5220: 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c  ith.  ** the val
5230: 75 65 20 6f 66 20 65 72 72 6e 6f 20 61 73 20 74  ue of errno as t
5240: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
5250: 74 2e 20 53 69 6e 63 65 20 61 20 73 79 73 74 65  t. Since a syste
5260: 6d 20 63 61 6c 6c 20 68 61 73 20 66 61 69 6c 65  m call has faile
5270: 64 2c 0a 20 20 2a 2a 20 65 72 72 6e 6f 20 73 68  d,.  ** errno sh
5280: 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f  ould be non-zero
5290: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 73 70  ..  **.  ** Desp
52a0: 69 74 65 20 74 68 69 73 2c 20 69 66 20 65 72 72  ite this, if err
52b0: 6e 6f 20 72 65 61 6c 6c 79 20 69 73 20 7a 65 72  no really is zer
52c0: 6f 2c 20 77 65 20 73 74 69 6c 6c 20 64 6f 6e 27  o, we still don'
52d0: 74 20 77 61 6e 74 20 74 6f 20 72 65 74 75 72 6e  t want to return
52e0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  .  ** SQLITE_OK.
52f0: 20 54 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   The system call
5300: 20 66 61 69 6c 65 64 2c 20 61 6e 64 20 2a 73 6f   failed, and *so
5310: 6d 65 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72  me* SQLite error
5320: 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a 20   should be.  ** 
5330: 70 72 6f 70 61 67 61 74 65 64 20 62 61 63 6b 20  propagated back 
5340: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 43  to the caller. C
5350: 6f 6d 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 62  ommenting this b
5360: 72 61 6e 63 68 20 6f 75 74 20 6d 65 61 6e 73 20  ranch out means 
5370: 65 72 72 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77 69  errno==0.  ** wi
5380: 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79  ll be handled by
5390: 20 74 68 65 20 22 64 65 66 61 75 6c 74 3a 22 20   the "default:" 
53a0: 63 61 73 65 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f  case below..  */
53b0: 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20 20  .  case 0: .    
53c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
53d0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73 65  ;.#endif..  case
53e0: 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20   EAGAIN:.  case 
53f0: 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73  ETIMEDOUT:.  cas
5400: 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20  e EBUSY:.  case 
5410: 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e  EINTR:.  case EN
5420: 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72  OLCK:  .    /* r
5430: 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20  andom NFS retry 
5440: 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75  error, unless du
5450: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
5460: 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a   support .     *
5470: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
5480: 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75  in which it actu
5490: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
54a0: 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72  it says */.    r
54b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
54c0: 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  Y;.    .  case E
54d0: 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45  ACCES: .    /* E
54e0: 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41  ACCES is like EA
54f0: 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b  GAIN during lock
5500: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20  ing operations, 
5510: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65  but not any othe
5520: 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28  r time*/.    if(
5530: 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d   (sqliteIOErr ==
5540: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
5550: 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65  CK) || ..(sqlite
5560: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
5570: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c  IOERR_UNLOCK) ||
5580: 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20   ..(sqliteIOErr 
5590: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
55a0: 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71 6c  RDLOCK) ||..(sql
55b0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
55c0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
55d0: 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20  SERVEDLOCK) ){. 
55e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
55f0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
5600: 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20     /* else fall 
5610: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73  through */.  cas
5620: 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65  e EPERM: .    re
5630: 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
5640: 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 45 44 45 41  ;.    .  /* EDEA
5650: 44 4c 4b 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DLK is only poss
5660: 69 62 6c 65 20 69 66 20 61 20 63 61 6c 6c 20 74  ible if a call t
5670: 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 57  o fcntl(F_SETLKW
5680: 29 20 69 73 20 6d 61 64 65 2e 20 41 6e 64 0a 20  ) is made. And. 
5690: 20 2a 2a 20 74 68 69 73 20 6d 6f 64 75 6c 65 20   ** this module 
56a0: 6e 65 76 65 72 20 6d 61 6b 65 73 20 73 75 63 68  never makes such
56b0: 20 61 20 63 61 6c 6c 2e 20 41 6e 64 20 74 68 65   a call. And the
56c0: 20 63 6f 64 65 20 69 6e 20 53 51 4c 69 74 65 20   code in SQLite 
56d0: 69 74 73 65 6c 66 20 0a 20 20 2a 2a 20 61 73 73  itself .  ** ass
56e0: 65 72 74 73 20 74 68 61 74 20 53 51 4c 49 54 45  erts that SQLITE
56f0: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 69  _IOERR_BLOCKED i
5700: 73 20 6e 65 76 65 72 20 72 65 74 75 72 6e 65 64  s never returned
5710: 2e 20 46 6f 72 20 74 68 65 73 65 20 72 65 61 73  . For these reas
5720: 6f 6e 73 0a 20 20 2a 2a 20 74 68 69 73 20 63 61  ons.  ** this ca
5730: 73 65 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65  se is also comme
5740: 6e 74 65 64 20 6f 75 74 2e 20 49 66 20 74 68 65  nted out. If the
5750: 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 65 74   system does set
5760: 20 65 72 72 6e 6f 20 74 6f 20 45 44 45 41 44 4c   errno to EDEADL
5770: 4b 2c 0a 20 20 2a 2a 20 74 68 65 20 64 65 66 61  K,.  ** the defa
5780: 75 6c 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ult SQLITE_IOERR
5790: 5f 58 58 58 20 63 6f 64 65 20 77 69 6c 6c 20 62  _XXX code will b
57a0: 65 20 72 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 23  e returned. */.#
57b0: 69 66 20 30 0a 20 20 63 61 73 65 20 45 44 45 41  if 0.  case EDEA
57c0: 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20  DLK:.    return 
57d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
57e0: 43 4b 45 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20  CKED;.#endif.   
57f0: 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50   .#if EOPNOTSUPP
5800: 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65  !=ENOTSUP.  case
5810: 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20   EOPNOTSUPP: .  
5820: 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77    /* something w
5830: 65 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77 72  ent terribly awr
5840: 79 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67  y, unless during
5850: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
5860: 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74  port .     * int
5870: 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77  rospection, in w
5880: 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79  hich it actually
5890: 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73   means what it s
58a0: 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ays */.#endif.#i
58b0: 66 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63  fdef ENOTSUP.  c
58c0: 61 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20  ase ENOTSUP: .  
58d0: 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c    /* invalid fd,
58e0: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
58f0: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
5900: 72 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e  rt introspection
5910: 2c 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20  , in which .    
5920: 20 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d   * it actually m
5930: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
5940: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61  s */.#endif.  ca
5950: 73 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45  se EIO:.  case E
5960: 42 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e  BADF:.  case EIN
5970: 56 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54  VAL:.  case ENOT
5980: 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f  CONN:.  case ENO
5990: 44 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49  DEV:.  case ENXI
59a0: 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54  O:.  case ENOENT
59b0: 3a 0a 23 69 66 64 65 66 20 45 53 54 41 4c 45 20  :.#ifdef ESTALE 
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59d0: 20 20 20 20 2f 2a 20 45 53 54 41 4c 45 20 69 73      /* ESTALE is
59e0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e 20   not defined on 
59f0: 49 6e 74 65 72 69 78 20 73 79 73 74 65 6d 73 20  Interix systems 
5a00: 2a 2f 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45  */.  case ESTALE
5a10: 3a 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20  :.#endif.  case 
5a20: 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74  ENOSYS:.    /* t
5a30: 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63  hese should forc
5a40: 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20  e the client to 
5a50: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61  close the file a
5a60: 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a  nd reconnect */.
5a70: 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20      .  default: 
5a80: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
5a90: 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a  teIOErr;.  }.}..
5aa0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
5ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5af0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
5b00: 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75  **** Begin Uniqu
5b10: 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74  e File ID Utilit
5b20: 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b  y Used By VxWork
5b30: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
5b40: 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20  *.**.** On most 
5b50: 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78  versions of unix
5b60: 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20 75  , we can get a u
5b70: 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20 66  nique ID for a f
5b80: 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61  ile by concatena
5b90: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69  ting.** the devi
5ba0: 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ce number and th
5bb0: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20  e inode number. 
5bc0: 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e   But this does n
5bd0: 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72  ot work on VxWor
5be0: 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b  ks..** On VxWork
5bf0: 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65  s, a unique file
5c00: 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73 65   id must be base
5c10: 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63  d on the canonic
5c20: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a  al filename..**.
5c30: 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** A pointer to 
5c40: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
5c50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
5c60: 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75 73  ucture can be us
5c70: 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75  ed as a.** uniqu
5c80: 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57  e file ID in VxW
5c90: 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74  orks.  Each inst
5ca0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
5cb0: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a  ucture contains.
5cc0: 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ** a copy of the
5cd0: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
5ce0: 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61  ame.  There is a
5cf0: 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20  lso a reference 
5d00: 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20  count.  .** The 
5d10: 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65 63  structure is rec
5d20: 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20  laimed when the 
5d30: 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  number of pointe
5d40: 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74  rs to it drops t
5d50: 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  o.** zero..**.**
5d60: 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65 72   There are never
5d70: 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73   very many files
5d80: 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d   open at one tim
5d90: 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72  e and lookups ar
5da0: 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f  e not.** a perfo
5db0: 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20  rmance-critical 
5dc0: 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73  path, so it is s
5dd0: 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74  ufficient to put
5de0: 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74   these.** struct
5df0: 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64  ures on a linked
5e00: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74   list..*/.struct
5e10: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b   vxworksFileId {
5e20: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
5e30: 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20  sFileId *pNext; 
5e40: 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69   /* Next in a li
5e50: 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a  st of them all *
5e60: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
5e90: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69  eferences to thi
5ea0: 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  s one */.  int n
5eb0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
5ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
5ed0: 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e  th of the zCanon
5ee0: 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e  icalName[] strin
5ef0: 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61  g */.  char *zCa
5f00: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20  nonicalName;    
5f10: 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61       /* Canonica
5f20: 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b  l filename */.};
5f30: 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
5f40: 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71  ./* .** All uniq
5f50: 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  ue filenames are
5f60: 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65   held on a linke
5f70: 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79  d list headed by
5f80: 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c   this.** variabl
5f90: 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  e:.*/.static str
5fa0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
5fb0: 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  d *vxworksFileLi
5fc0: 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53  st = 0;../*.** S
5fd0: 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61  implify a filena
5fe0: 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f  me into its cano
5ff0: 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79  nical form.** by
6000: 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c   making the foll
6010: 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a  owing changes:.*
6020: 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67  *.**  * removing
6030: 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e   any trailing an
6040: 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a  d duplicate /.**
6050: 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20    * convert /./ 
6060: 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20  into just /.**  
6070: 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f  * convert /A/../
6080: 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79 20   where A is any 
6090: 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f  simple name into
60a0: 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68   just /.**.** Ch
60b0: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
60c0: 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e  n-place.  Return
60d0: 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65   the new name le
60e0: 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ngth..**.** The 
60f0: 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d  original filenam
6100: 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31  e is in z[0..n-1
6110: 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ].  Return the n
6120: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72  umber of.** char
6130: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 69  acters in the si
6140: 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a  mplified name..*
6150: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78 77  /.static int vxw
6160: 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65  orksSimplifyName
6170: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29  (char *z, int n)
6180: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
6190: 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b  while( n>1 && z[
61a0: 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d  n-1]=='/' ){ n--
61b0: 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ; }.  for(i=j=0;
61c0: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
61d0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b  if( z[i]=='/' ){
61e0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
61f0: 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75  ]=='/' ) continu
6200: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  e;.      if( z[i
6210: 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c  +1]=='.' && i+2<
6220: 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27  n && z[i+2]=='/'
6230: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d   ){.        i +=
6240: 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   1;.        cont
6250: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
6260: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
6270: 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20  '.' && i+3<n && 
6280: 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a  z[i+2]=='.' && z
6290: 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  [i+3]=='/' ){.  
62a0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30        while( j>0
62b0: 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20   && z[j-1]!='/' 
62c0: 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ j--; }.      
62d0: 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d    if( j>0 ){ j--
62e0: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d  ; }.        i +=
62f0: 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   2;.        cont
6300: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
6310: 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d    }.    z[j++] =
6320: 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a   z[i];.  }.  z[j
6330: 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
6340: 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  j;.}../*.** Find
6350: 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49   a unique file I
6360: 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  D for the given 
6370: 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d  absolute pathnam
6380: 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  e.  Return.** a 
6390: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76  pointer to the v
63a0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
63b0: 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74  ect.  This point
63c0: 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75 65  er is the unique
63d0: 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a  .** file ID..**.
63e0: 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c  ** The nRef fiel
63f0: 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73  d of the vxworks
6400: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73  FileId object is
6410: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66   incremented bef
6420: 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63  ore.** the objec
6430: 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  t is returned.  
6440: 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c  A new vxworksFil
6450: 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72  eId object is cr
6460: 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64  eated.** and add
6470: 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c  ed to the global
6480: 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73 61   list if necessa
6490: 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  ry..**.** If a m
64a0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
64b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
64c0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  eturn NULL..*/.s
64d0: 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77  tatic struct vxw
64e0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f  orksFileId *vxwo
64f0: 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f  rksFindFileId(co
6500: 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c  nst char *zAbsol
6510: 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75  uteName){.  stru
6520: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
6530: 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
6540: 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e  /* search key an
6550: 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f  d new file ID */
6560: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
6570: 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64  sFileId *pCandid
6580: 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f  ate;   /* For lo
6590: 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74  oping over exist
65a0: 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a  ing file IDs */.
65b0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
65e0: 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  of zAbsoluteName
65f0: 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73   string */..  as
6600: 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e  sert( zAbsoluteN
6610: 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20  ame[0]=='/' );. 
6620: 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   n = (int)strlen
6630: 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b  (zAbsoluteName);
6640: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
6650: 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
6660: 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20  (*pNew) + (n+1) 
6670: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
6680: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
6690: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
66a0: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ame = (char*)&pN
66b0: 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28  ew[1];.  memcpy(
66c0: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
66d0: 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e  Name, zAbsoluteN
66e0: 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d  ame, n+1);.  n =
66f0: 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79   vxworksSimplify
6700: 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f  Name(pNew->zCano
6710: 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a  nicalName, n);..
6720: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
6730: 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  an existing entr
6740: 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20  y that matching 
6750: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61  the canonical na
6760: 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e  me..  ** If foun
6770: 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  d, increment the
6780: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
6790: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
67a0: 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68  inter to.  ** th
67b0: 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20  e existing file 
67c0: 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ID..  */.  unixE
67d0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66  nterMutex();.  f
67e0: 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78  or(pCandidate=vx
67f0: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70  worksFileList; p
6800: 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64  Candidate; pCand
6810: 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65  idate=pCandidate
6820: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
6830: 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e  ( pCandidate->nN
6840: 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20  ame==n .     && 
6850: 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74  memcmp(pCandidat
6860: 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  e->zCanonicalNam
6870: 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  e, pNew->zCanoni
6880: 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20  calName, n)==0. 
6890: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c     ){.       sql
68a0: 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
68b0: 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64 61  .       pCandida
68c0: 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  te->nRef++;.    
68d0: 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
68e0: 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75  x();.       retu
68f0: 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20  rn pCandidate;. 
6900: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
6910: 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e  o match was foun
6920: 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65  d.  We will make
6930: 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a   a new file ID *
6940: 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d  /.  pNew->nRef =
6950: 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d   1;.  pNew->nNam
6960: 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70  e = n;.  pNew->p
6970: 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69  Next = vxworksFi
6980: 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b  leList;.  vxwork
6990: 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77  sFileList = pNew
69a0: 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
69b0: 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ex();.  return p
69c0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  New;.}../*.** De
69d0: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
69e0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61  rence count on a
69f0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
6a00: 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20  bject.  Free.** 
6a10: 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20  the object when 
6a20: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
6a30: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
6a40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6a50: 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46   vxworksReleaseF
6a60: 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78 77  ileId(struct vxw
6a70: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29  orksFileId *pId)
6a80: 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  {.  unixEnterMut
6a90: 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ex();.  assert( 
6aa0: 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pId->nRef>0 );. 
6ab0: 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pId->nRef--;.  
6ac0: 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30  if( pId->nRef==0
6ad0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76   ){.    struct v
6ae0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70  xworksFileId **p
6af0: 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76  p;.    for(pp=&v
6b00: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
6b10: 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b  *pp && *pp!=pId;
6b20: 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70   pp = &((*pp)->p
6b30: 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73  Next)){}.    ass
6b40: 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b  ert( *pp==pId );
6b50: 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e  .    *pp = pId->
6b60: 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
6b70: 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20  e3_free(pId);.  
6b80: 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
6b90: 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ex();.}.#endif /
6ba0: 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
6bb0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
6bc0: 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46   End of Unique F
6bd0: 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55  ile ID Utility U
6be0: 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a  sed By VxWorks *
6bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
6c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
6c50: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
6c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ca0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
6cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f  ************* Po
6cc0: 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63  six Advisory Loc
6cd0: 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
6ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cf0: 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64  *.**.** POSIX ad
6d00: 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65  visory locks are
6d10: 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67   broken by desig
6d20: 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30 30  n.  ANSI STD 100
6d30: 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65  3.1 (1996).** se
6d40: 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69  ction 6.5.2.2 li
6d50: 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68 20  nes 483 through 
6d60: 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61 74  490 specify that
6d70: 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a   when a process.
6d80: 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72  ** sets or clear
6d90: 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f  s a lock, that o
6da0: 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64  peration overrid
6db0: 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63  es any prior loc
6dc0: 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65  ks set.** by the
6dd0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20   same process.  
6de0: 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c  It does not expl
6df0: 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62  icitly say so, b
6e00: 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a  ut this implies.
6e10: 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72 72  ** that it overr
6e20: 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62  ides locks set b
6e30: 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
6e40: 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66 65  ss using a diffe
6e50: 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73  rent.** file des
6e60: 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64  criptor.  Consid
6e70: 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61 73  er this test cas
6e80: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69  e:.**.**       i
6e90: 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e  nt fd1 = open(".
6ea0: 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c  /file1", O_RDWR|
6eb0: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
6ec0: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 32  **       int fd2
6ed0: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32   = open("./file2
6ee0: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  ", O_RDWR|O_CREA
6ef0: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20  T, 0644);.**.** 
6f00: 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20  Suppose ./file1 
6f10: 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20  and ./file2 are 
6f20: 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  really the same 
6f30: 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a  file (because.**
6f40: 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f   one is a hard o
6f50: 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20  r symbolic link 
6f60: 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74 68  to the other) th
6f70: 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a  en if you set.**
6f80: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
6f90: 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20  ck on fd1, then 
6fa0: 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78  try to get an ex
6fb0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20  clusive lock.** 
6fc0: 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73  on fd2, it works
6fd0: 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20  .  I would have 
6fe0: 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65 63  expected the sec
6ff0: 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66  ond lock to.** f
7000: 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20  ail since there 
7010: 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f  was already a lo
7020: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64  ck on the file d
7030: 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75  ue to fd1..** Bu
7040: 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65  t not so.  Since
7050: 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65   both locks came
7060: 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70   from the same p
7070: 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73  rocess, the.** s
7080: 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20  econd overrides 
7090: 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20  the first, even 
70a0: 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65  though they were
70b0: 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   on different.**
70c0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
70d0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66  s opened on diff
70e0: 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73  erent file names
70f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61  ..**.** This mea
7100: 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f  ns that we canno
7110: 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b  t use POSIX lock
7120: 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  s to synchronize
7130: 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20   file access.** 
7140: 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20  among competing 
7150: 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73  threads of the s
7160: 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f  ame process.  PO
7170: 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77  SIX locks will w
7180: 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73  ork fine.** to s
7190: 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73  ynchronize acces
71a0: 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e  s for threads in
71b0: 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
71c0: 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20  ses, but not.** 
71d0: 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74  threads within t
71e0: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
71f0: 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61  .**.** To work a
7200: 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65  round the proble
7210: 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f  m, SQLite has to
7220: 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63   manage file loc
7230: 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ks internally.**
7240: 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68   on its own.  Wh
7250: 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74  enever a new dat
7260: 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c  abase is opened,
7270: 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64   we have to find
7280: 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63   the.** specific
7290: 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61   inode of the da
72a0: 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65  tabase file (the
72b0: 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d   inode is determ
72c0: 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73  ined by the.** s
72d0: 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f  t_dev and st_ino
72e0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73   fields of the s
72f0: 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68  tat structure th
7300: 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73  at fstat() fills
7310: 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63   in).** and chec
7320: 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65  k for locks alre
7330: 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20  ady existing on 
7340: 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65  that inode.  Whe
7350: 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63  n locks are.** c
7360: 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65  reated or remove
7370: 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f  d, we have to lo
7380: 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e  ok at our own in
7390: 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66  ternal record of
73a0: 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f   the.** locks to
73b0: 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
73c0: 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69  thread has previ
73d0: 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b  ously set a lock
73e0: 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a   on that same.**
73f0: 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41   inode..**.** (A
7400: 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66  side: The use of
7410: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61   inode numbers a
7420: 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65  s unique IDs doe
7430: 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78  s not work on Vx
7440: 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78  Works..** For Vx
7450: 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74  Works, we have t
7460: 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e  o use the altern
7470: 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44 20  ative unique ID 
7480: 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a  system based on.
7490: 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  ** canonical fil
74a0: 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d  ename and implem
74b0: 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72 65  ented in the pre
74c0: 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29  vious division.)
74d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
74e0: 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72  e3_file structur
74f0: 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e  e for POSIX is n
7500: 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e  o longer just an
7510: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
7520: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74   descriptor.  It
7530: 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74   is now a struct
7540: 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ure that holds t
7550: 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a  he integer file.
7560: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  ** descriptor an
7570: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  d a pointer to a
7580: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
7590: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e  describes the in
75a0: 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20  ternal.** locks 
75b0: 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  on the correspon
75c0: 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65  ding inode.  The
75d0: 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e  re is one lockin
75e0: 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70  g structure.** p
75f0: 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20  er inode, so if 
7600: 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69  the same inode i
7610: 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20  s opened twice, 
7620: 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74  both unixFile st
7630: 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e  ructures.** poin
7640: 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f  t to the same lo
7650: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  cking structure.
7660: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74    The locking st
7670: 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a  ructure keeps.**
7680: 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75   a reference cou
7690: 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b  nt (so we will k
76a0: 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65  now when to dele
76b0: 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e  te it) and a "cn
76c0: 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74  t".** field that
76d0: 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e   tells us its in
76e0: 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  ternal lock stat
76f0: 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e  us.  cnt==0 mean
7700: 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73  s the.** file is
7710: 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d   unlocked.  cnt=
7720: 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69  =-1 means the fi
7730: 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73  le has an exclus
7740: 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74  ive lock..** cnt
7750: 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61  >0 means there a
7760: 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f  re cnt shared lo
7770: 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  cks on the file.
7780: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d  .**.** Any attem
7790: 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e  pt to lock or un
77a0: 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73  lock a file firs
77b0: 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63  t checks the loc
77c0: 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  king.** structur
77d0: 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20  e.  The fcntl() 
77e0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f  system call is o
77f0: 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73  nly invoked to s
7800: 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c  et a .** POSIX l
7810: 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72  ock if the inter
7820: 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75  nal lock structu
7830: 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62  re transitions b
7840: 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b  etween.** a lock
7850: 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b  ed and an unlock
7860: 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ed state..**.** 
7870: 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72 65  But wait:  there
7880: 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72   are yet more pr
7890: 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49  oblems with POSI
78a0: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
78b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63  ..**.** If you c
78c0: 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63  lose a file desc
78d0: 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e  riptor that poin
78e0: 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61  ts to a file tha
78f0: 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t has locks,.** 
7900: 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61  all locks on tha
7910: 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
7920: 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72  owned by the cur
7930: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65  rent process are
7940: 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54  .** released.  T
7950: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
7960: 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68  is problem, each
7970: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
7980: 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69  bject.** maintai
7990: 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68  ns a count of th
79a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64  e number of pend
79b0: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61  ing locks on tha
79c0: 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20   inode..** When 
79d0: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
79e0: 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75  de to close an u
79f0: 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72  nixFile, if ther
7a00: 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75  e are.** other u
7a10: 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20  nixFile open on 
7a20: 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74  the same inode t
7a30: 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20  hat are holding 
7a40: 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a  locks, the call.
7a50: 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68  ** to close() th
7a60: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
7a70: 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  r is deferred un
7a80: 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c  til all of the l
7a90: 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54  ocks clear..** T
7aa0: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
7ab0: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
7ac0: 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20   a list of file 
7ad0: 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74  descriptors that
7ae0: 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63   need to.** be c
7af0: 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c  losed and that l
7b00: 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61  ist is walked (a
7b10: 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e  nd cleared) when
7b20: 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a   the last lock.*
7b30: 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20  * clears..**.** 
7b40: 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62  Yet another prob
7b50: 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61  lem:  LinuxThrea
7b60: 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77  ds do not play w
7b70: 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c  ell with posix l
7b80: 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79  ocks..**.** Many
7b90: 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
7ba0: 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65  of linux use the
7bb0: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69   LinuxThreads li
7bc0: 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a  brary which is.*
7bd0: 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70  * not posix comp
7be0: 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69  liant.  Under Li
7bf0: 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f  nuxThreads, a lo
7c00: 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ck created by th
7c10: 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74  read.** A cannot
7c20: 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20   be modified or 
7c30: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20  overridden by a 
7c40: 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64  different thread
7c50: 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65   B..** Only thre
7c60: 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20  ad A can modify 
7c70: 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69  the lock.  Locki
7c80: 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20 63  ng behavior is c
7c90: 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65  orrect.** if the
7ca0: 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73   appliation uses
7cb0: 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76   the newer Nativ
7cc0: 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c  e Posix Thread L
7cd0: 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a  ibrary (NPTL).**
7ce0: 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68   on linux - with
7cf0: 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65   NPTL a lock cre
7d00: 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20 41  ated by thread A
7d10: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f   can override lo
7d20: 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64  cks.** in thread
7d30: 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20 69   B.  But there i
7d40: 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77  s no way to know
7d50: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
7d60: 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64   which.** thread
7d70: 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20 62  ing library is b
7d80: 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74  eing used.  So t
7d90: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
7da0: 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d  o know at.** com
7db0: 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65  pile-time whethe
7dc0: 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20  r or not thread 
7dd0: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
7de0: 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42  ocks on thread B
7df0: 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20  ..** One has to 
7e00: 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68  do a run-time ch
7e10: 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20  eck to discover 
7e20: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
7e30: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70  the.** current p
7e40: 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  rocess..**.** SQ
7e50: 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73 75 70  Lite used to sup
7e60: 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64  port LinuxThread
7e70: 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74 20  s.  But support 
7e80: 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73  for LinuxThreads
7e90: 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20  .** was dropped 
7ea0: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76  beginning with v
7eb0: 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53  ersion 3.7.0.  S
7ec0: 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c  QLite will still
7ed0: 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69   work with.** Li
7ee0: 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f 76 69  nuxThreads provi
7ef0: 64 65 64 20 74 68 61 74 20 28 31 29 20 74 68 65  ded that (1) the
7f00: 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68  re is no more th
7f10: 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f  an one connectio
7f20: 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61  n .** per databa
7f30: 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73  se file in the s
7f40: 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ame process and 
7f50: 28 32 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e  (2) database con
7f60: 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e  nections.** do n
7f70: 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74  ot move across t
7f80: 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  hreads..*/../*.*
7f90: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
7fa0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
7fb0: 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20  tructure serves 
7fc0: 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a  as the key used.
7fd0: 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ** to locate a p
7fe0: 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e  articular unixIn
7ff0: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  odeInfo object..
8000: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  */.struct unixFi
8010: 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64  leId {.  dev_t d
8020: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
8030: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e       /* Device n
8040: 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f  umber */.#if OS_
8050: 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
8060: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
8070: 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20  pId;  /* Unique 
8080: 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f  file ID for vxwo
8090: 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20  rks. */.#else.  
80a0: 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20  ino_t ino;      
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
80c0: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  node number */.#
80d0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
80e0: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
80f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
8100: 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
8110: 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65  ted for each ope
8120: 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c  n.** inode.  Or,
8130: 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73   on LinuxThreads
8140: 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f  , there is one o
8150: 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72  f these structur
8160: 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69  es for.** each i
8170: 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65  node opened by e
8180: 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a  ach thread..**.*
8190: 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65  * A single inode
81a0: 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
81b0: 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
81c0: 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69  ors, so each uni
81d0: 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  xFile.** structu
81e0: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  re contains a po
81f0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
8200: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
8210: 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20  ect and this.** 
8220: 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63  object keeps a c
8230: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
8240: 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70  er of unixFile p
8250: 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a  ointing to it..*
8260: 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f  /.struct unixIno
8270: 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63  deInfo {.  struc
8280: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
8290: 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  eId;       /* Th
82a0: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
82b0: 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20    int nShared;  
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53    /* Number of S
82e0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64  HARED locks held
82f0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
8300: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
8310: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
8320: 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53  SHARED_LOCK, RES
8330: 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20  ERVED_LOCK etc. 
8340: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
8350: 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b  ar bProcessLock;
8360: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75       /* An exclu
8370: 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63  sive process loc
8380: 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69  k is held */.  i
8390: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
83b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e  * Number of poin
83c0: 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72  ters to this str
83d0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78  ucture */.  unix
83e0: 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
83f0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  e;          /* S
8400: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73  hared memory ass
8410: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
8420: 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  s inode */.  int
8430: 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   nLock;         
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8450: 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  Number of outsta
8460: 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  nding file locks
8470: 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   */.  UnixUnused
8480: 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20  Fd *pUnused;    
8490: 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
84a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
84b0: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75   to close */.  u
84c0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e  nixInodeInfo *pN
84d0: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ext;           /
84e0: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e  * List of all un
84f0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
8500: 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  cts */.  unixIno
8510: 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20  deInfo *pPrev;  
8520: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e           /*    .
8530: 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65  ... doubly linke
8540: 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  d */.#if SQLITE_
8550: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
8560: 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20  TYLE.  unsigned 
8570: 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
8580: 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46  Byte;  /* for AF
8590: 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72  P simulated shar
85a0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69  ed lock */.#endi
85b0: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
85c0: 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20  .  sem_t *pSem; 
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85e0: 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49     /* Named POSI
85f0: 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20  X semaphore */. 
8600: 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d   char aSemName[M
8610: 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20  AX_PATHNAME+2]; 
8620: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74   /* Name of that
8630: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65   semaphore */.#e
8640: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
8650: 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e   lists of all un
8660: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
8670: 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  cts..*/.static u
8680: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e  nixInodeInfo *in
8690: 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
86a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
86b0: 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72  tion - unixLogEr
86c0: 72 6f 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79  ror_x(), is only
86d0: 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61   ever called via
86e0: 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e   the macro.** un
86f0: 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a  ixLogError()..**
8700: 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65  .** It is invoke
8710: 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72  d after an error
8720: 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53   occurs in an OS
8730: 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72   function and er
8740: 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  rno has been.** 
8750: 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d  set. It logs a m
8760: 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c  essage using sql
8770: 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61  ite3_log() conta
8780: 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ining the curren
8790: 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72  t value of.** er
87a0: 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73  rno and, if poss
87b0: 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d  ible, the human-
87c0: 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c  readable equival
87d0: 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f  ent from strerro
87e0: 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72  r() or.** strerr
87f0: 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  or_r()..**.** Th
8800: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
8810: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d   passed to the m
8820: 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74  acro should be t
8830: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  he error code th
8840: 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65  at.** will be re
8850: 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
8860: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f   (e.g. SQLITE_IO
8870: 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49  ERR_DELETE, SQLI
8880: 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a  TE_CANTOPEN). .*
8890: 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71  * The two subseq
88a0: 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73  uent arguments s
88b0: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d  hould be the nam
88c0: 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63  e of the OS func
88d0: 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69  tion that.** fai
88e0: 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e  led (e.g. "unlin
88f0: 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20  k", "open") and 
8900: 74 68 65 20 74 68 65 20 61 73 73 6f 63 69 61 74  the the associat
8910: 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70  ed file-system p
8920: 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a  ath,.** if any..
8930: 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c  */.#define unixL
8940: 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20  ogError(a,b,c)  
8950: 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41     unixLogErrorA
8960: 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49  tLine(a,b,c,__LI
8970: 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  NE__).static int
8980: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
8990: 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f  ine(.  int errco
89a0: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
89b0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
89c0: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
89d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
89e0: 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
89f0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66   /* Name of OS f
8a00: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69  unction that fai
8a10: 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  led */.  const c
8a20: 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
8a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
8a40: 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64   path associated
8a50: 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20   with error */. 
8a60: 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20   int iLine      
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a80: 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20   /* Source line 
8a90: 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72  number where err
8aa0: 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29  or occurred */.)
8ab0: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20  {.  char *zErr; 
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ad0: 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66      /* Message f
8ae0: 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f  rom strerror() o
8af0: 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a  r equivalent */.
8b00: 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65    int iErrno = e
8b10: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
8b20: 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61    /* Saved sysca
8b30: 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20  ll error number 
8b40: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  */..  /* If this
8b50: 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64   is not a thread
8b60: 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49  safe build (SQLI
8b70: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30  TE_THREADSAFE==0
8b80: 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a  ), then use.  **
8b90: 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29 20   the strerror() 
8ba0: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61  function to obta
8bb0: 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  in the human-rea
8bc0: 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73  dable error mess
8bd0: 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c  age.  ** equival
8be0: 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74  ent to errno. Ot
8bf0: 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 74 72  herwise, use str
8c00: 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20  error_r()..  */ 
8c10: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
8c20: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
8c30: 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f  d(HAVE_STRERROR_
8c40: 52 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38  R).  char aErr[8
8c50: 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72  0];.  memset(aEr
8c60: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72  r, 0, sizeof(aEr
8c70: 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45  r));.  zErr = aE
8c80: 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52  rr;..  /* If STR
8c90: 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28  ERROR_R_CHAR_P (
8ca0: 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20  set by autoconf 
8cb0: 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53  scripts) or __US
8cc0: 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64  E_GNU is defined
8cd0: 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68  ,.  ** assume th
8ce0: 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72  at the system pr
8cf0: 6f 76 69 64 65 73 20 74 68 65 20 74 68 65 20 47  ovides the the G
8d00: 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74  NU version of st
8d10: 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74 20  rerror_r() that 
8d20: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  .  ** returns a 
8d30: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
8d40: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
8d50: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
8d60: 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a  . That pointer .
8d70: 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74    ** may point t
8d80: 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20  o aErr[], or it 
8d90: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  may point to som
8da0: 65 20 73 74 61 74 69 63 20 73 74 6f 72 61 67 65  e static storage
8db0: 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a   somewhere. .  *
8dc0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73  * Otherwise, ass
8dd0: 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73  ume that the sys
8de0: 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65  tem provides the
8df0: 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f   POSIX version o
8e00: 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72  f .  ** strerror
8e10: 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61  _r(), which alwa
8e20: 79 73 20 77 72 69 74 65 73 20 61 6e 20 65 72 72  ys writes an err
8e30: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20  or message into 
8e40: 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  aErr[]..  **.  *
8e50: 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e  * If the code in
8e60: 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65  correctly assume
8e70: 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65  s that it is the
8e80: 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74   POSIX version t
8e90: 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69  hat is.  ** avai
8ea0: 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72  lable, the error
8eb0: 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66   message will of
8ec0: 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20  ten be an empty 
8ed0: 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20  string. Not a.  
8ee0: 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e  ** huge problem.
8ef0: 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e   Incorrectly con
8f00: 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68 65  cluding that the
8f10: 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20   GNU version is 
8f20: 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20  available .  ** 
8f30: 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
8f40: 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e  segfault though.
8f50: 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  .  */.#if define
8f60: 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41  d(STRERROR_R_CHA
8f70: 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  R_P) || defined(
8f80: 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72  __USE_GNU).  zEr
8f90: 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73  r = .# endif.  s
8fa0: 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f  trerror_r(iErrno
8fb0: 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61  , aErr, sizeof(a
8fc0: 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20  Err)-1);..#elif 
8fd0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
8fe0: 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61  E.  /* This is a
8ff0: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c   threadsafe buil
9000: 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f  d, but strerror_
9010: 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  r() is not avail
9020: 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20  able. */.  zErr 
9030: 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a  = "";.#else.  /*
9040: 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20   Non-threadsafe 
9050: 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72  build, use strer
9060: 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72  ror(). */.  zErr
9070: 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72 72   = strerror(iErr
9080: 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  no);.#endif..  a
9090: 73 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d  ssert( errcode!=
90a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
90b0: 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50  f( zPath==0 ) zP
90c0: 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69  ath = "";.  sqli
90d0: 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c  te3_log(errcode,
90e0: 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e  .      "os_unix.
90f0: 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73  c:%d: (%d) %s(%s
9100: 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69  ) - %s",.      i
9110: 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46  Line, iErrno, zF
9120: 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72  unc, zPath, zErr
9130: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
9140: 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  errcode;.}../*.*
9150: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64  * Close a file d
9160: 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
9170: 20 57 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   We assume that 
9180: 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61  close() almost a
9190: 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e  lways works, sin
91a0: 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e  ce it is only in
91b0: 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20   a.** very sick 
91c0: 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f  application or o
91d0: 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c  n a very sick pl
91e0: 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d  atform that it m
91f0: 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66  ight fail..** If
9200: 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73   it does fail, s
9210: 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66  imply leak the f
9220: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
9230: 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a  but do log the.*
9240: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e  * error..**.** N
9250: 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20 6e  ote that it is n
9260: 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74 72 79  ot safe to retry
9270: 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45   close() after E
9280: 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a  INTR since the.*
9290: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
92a0: 72 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72  r might have alr
92b0: 65 61 64 79 20 62 65 65 6e 20 72 65 75 73 65 64  eady been reused
92c0: 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65   by another thre
92d0: 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e  ad..** So we don
92e0: 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72  't even try to r
92f0: 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45  ecover from an E
9300: 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20  INTR.  Just log 
9310: 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64  the error.** and
9320: 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61   move on..*/.sta
9330: 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f  tic void robust_
9340: 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a  close(unixFile *
9350: 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e  pFile, int h, in
9360: 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28  t lineno){.  if(
9370: 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20   osClose(h) ){. 
9380: 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41     unixLogErrorA
9390: 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45  tLine(SQLITE_IOE
93a0: 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65  RR_CLOSE, "close
93b0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
93c0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 20            pFile 
93d0: 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a  ? pFile->zPath :
93e0: 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d   0, lineno);.  }
93f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
9400: 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  all file descrip
9410: 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64 20  tors accumuated 
9420: 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  in the unixInode
9430: 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69  Info->pUnused li
9440: 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  st..*/ .static v
9450: 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67  oid closePending
9460: 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  Fds(unixFile *pF
9470: 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
9480: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
9490: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
94a0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
94b0: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
94c0: 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
94d0: 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64  =pInode->pUnused
94e0: 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
94f0: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
9500: 65 78 74 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f  ext;.    robust_
9510: 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e  close(pFile, p->
9520: 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
9530: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9540: 70 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65  p);.  }.  pInode
9550: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d  ->pUnused = 0;.}
9560: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
9570: 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  a unixInodeInfo 
9580: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
9590: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
95a0: 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  y findInodeInfo(
95b0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  )..**.** The mut
95c0: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
95d0: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
95e0: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
95f0: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
9600: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
9610: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
9620: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
9630: 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69  aseInodeInfo(uni
9640: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
9650: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
9660: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
9670: 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
9680: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
9690: 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  ) );.  if( ALWAY
96a0: 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20  S(pInode) ){.   
96b0: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b   pInode->nRef--;
96c0: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
96d0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
96e0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
96f0: 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b  ->pShmNode==0 );
9700: 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64  .      closePend
9710: 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
9720: 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
9730: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
9740: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
9750: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ->pPrev->pNext==
9760: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
9770: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d    pInode->pPrev-
9780: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d  >pNext = pInode-
9790: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
97a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
97b0: 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d  ert( inodeList==
97c0: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
97d0: 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49    inodeList = pI
97e0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
97f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
9800: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a  Inode->pNext ){.
9810: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9820: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70  pInode->pNext->p
9830: 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  Prev==pInode );.
9840: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
9850: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
9860: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20  Inode->pPrev;.  
9870: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
9880: 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29  te3_free(pInode)
9890: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
98a0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c  *.** Given a fil
98b0: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f  e descriptor, lo
98c0: 63 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f  cate the unixIno
98d0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  deInfo object th
98e0: 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20  at.** describes 
98f0: 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69  that file descri
9900: 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20  ptor.  Create a 
9910: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
9920: 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65  sary.  The.** re
9930: 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74  turn value might
9940: 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   be uninitialize
9950: 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  d if an error oc
9960: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  curs..**.** The 
9970: 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73  mutex entered us
9980: 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65  ing the unixEnte
9990: 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f  rMutex() functio
99a0: 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  n must be held.*
99b0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
99c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
99d0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
99e0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
99f0: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
9a00: 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49  c int findInodeI
9a10: 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20  nfo(.  unixFile 
9a20: 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
9a30: 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69        /* Unix fi
9a40: 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73  le with file des
9a50: 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65  c used in the ke
9a60: 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  y */.  unixInode
9a70: 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20  Info **ppInode  
9a80: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
9a90: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
9aa0: 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f  o object here */
9ab0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ad0: 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63       /* System c
9ae0: 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  all return code 
9af0: 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b10: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
9b20: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70  descriptor for p
9b30: 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  File */.  struct
9b40: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
9b50: 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b  Id;      /* Look
9b60: 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75  up key for the u
9b70: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a  nixInodeInfo */.
9b80: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
9b90: 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
9ba0: 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69   /* Low-level fi
9bb0: 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  le information *
9bc0: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
9bd0: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20  o *pInode = 0;  
9be0: 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20     /* Candidate 
9bf0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
9c00: 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ject */..  asser
9c10: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
9c20: 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  () );..  /* Get 
9c30: 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d  low-level inform
9c40: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
9c50: 66 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e  file that we can
9c60: 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72   used to.  ** cr
9c70: 65 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61  eate a unique na
9c80: 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  me for the file.
9c90: 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69  .  */.  fd = pFi
9ca0: 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73  le->h;.  rc = os
9cb0: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
9cc0: 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  uf);.  if( rc!=0
9cd0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
9ce0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
9cf0: 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c  ;.#ifdef EOVERFL
9d00: 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  OW.    if( pFile
9d10: 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56  ->lastErrno==EOV
9d20: 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20  ERFLOW ) return 
9d30: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65  SQLITE_NOLFS;.#e
9d40: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
9d50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
9d60: 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c  }..#ifdef __APPL
9d70: 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58  E__.  /* On OS X
9d80: 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c   on an msdos fil
9d90: 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f  esystem, the ino
9da0: 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70  de number is rep
9db0: 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72  orted.  ** incor
9dc0: 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d  rectly for zero-
9dd0: 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65  size files.  See
9de0: 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20   ticket #3260.  
9df0: 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f  To work.  ** aro
9e00: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
9e10: 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74   (we consider it
9e20: 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20   a bug in OS X, 
9e30: 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a  not SQLite).  **
9e40: 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65   we always incre
9e50: 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ase the file siz
9e60: 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e  e to 1 by writin
9e70: 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a  g a single byte.
9e80: 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63    ** prior to ac
9e90: 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64  cessing the inod
9ea0: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f  e number.  The o
9eb0: 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  ne byte written 
9ec0: 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49  is.  ** an ASCII
9ed0: 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77   'S' character w
9ee0: 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e  hich also happen
9ef0: 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73  s to be the firs
9f00: 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74  t byte.  ** in t
9f10: 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65  he header of eve
9f20: 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ry SQLite databa
9f30: 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  se.  In this way
9f40: 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20  , if there.  ** 
9f50: 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  is a race condit
9f60: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e  ion such that an
9f70: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
9f80: 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
9f90: 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  ed.  ** the firs
9fa0: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
9fb0: 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67  tabase, no damag
9fc0: 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a  e is done..  */.
9fd0: 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74    if( statbuf.st
9fe0: 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69  _size==0 && (pFi
9ff0: 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51  le->fsFlags & SQ
a000: 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
a010: 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20  MSDOS)!=0 ){.   
a020: 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74   do{ rc = osWrit
a030: 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d  e(fd, "S", 1); }
a040: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
a050: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
a060: 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a     if( rc!=1 ){.
a070: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
a080: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
a090: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a0a0: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
a0b0: 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61  .    rc = osFsta
a0c0: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b  t(fd, &statbuf);
a0d0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
a0e0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
a0f0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
a100: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
a110: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
a120: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
a130: 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c   memset(&fileId,
a140: 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49   0, sizeof(fileI
a150: 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65  d));.  fileId.de
a160: 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64  v = statbuf.st_d
a170: 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  ev;.#if OS_VXWOR
a180: 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20  KS.  fileId.pId 
a190: 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65  = pFile->pId;.#e
a1a0: 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f  lse.  fileId.ino
a1b0: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e   = statbuf.st_in
a1c0: 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f  o;.#endif.  pIno
a1d0: 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  de = inodeList;.
a1e0: 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20    while( pInode 
a1f0: 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49  && memcmp(&fileI
a200: 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  d, &pInode->file
a210: 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49  Id, sizeof(fileI
a220: 64 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  d)) ){.    pInod
a230: 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  e = pInode->pNex
a240: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  t;.  }.  if( pIn
a250: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49  ode==0 ){.    pI
a260: 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  node = sqlite3_m
a270: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
a280: 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66  Inode) );.    if
a290: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
a2a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a2b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
a2c0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64      memset(pInod
a2d0: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  e, 0, sizeof(*pI
a2e0: 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63  node));.    memc
a2f0: 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  py(&pInode->file
a300: 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a  Id, &fileId, siz
a310: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
a320: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d    pInode->nRef =
a330: 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   1;.    pInode->
a340: 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73  pNext = inodeLis
a350: 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70  t;.    pInode->p
a360: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66  Prev = 0;.    if
a370: 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e  ( inodeList ) in
a380: 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  odeList->pPrev =
a390: 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f   pInode;.    ino
a3a0: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b  deList = pInode;
a3b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
a3c0: 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  node->nRef++;.  
a3d0: 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70  }.  *ppInode = p
a3e0: 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20  Inode;.  return 
a3f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
a400: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a410: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
a420: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
a430: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
a440: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
a450: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
a460: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
a470: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
a480: 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
a490: 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
a4a0: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
a4b0: 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
a4c0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
a4d0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
a4e0: 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
a4f0: 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
a500: 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
a510: 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
a520: 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
a530: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63  tic int unixChec
a540: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
a550: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
a560: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
a570: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
a580: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
a590: 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
a5a0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
a5b0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
a5c0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
a5d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
a5e0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
a5f0: 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73  DLOCK; );..  ass
a600: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
a610: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
a620: 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69  ; /* Because pFi
a630: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
a640: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
a650: 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ads */..  /* Che
a660: 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
a670: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
a680: 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
a690: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
a6a0: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
a6b0: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
a6c0: 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
a6d0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74   1;.  }..  /* Ot
a6e0: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
a6f0: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
a700: 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f  s holds it..  */
a710: 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50  .#ifndef __DJGPP
a720: 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  __.  if( !reserv
a730: 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49  ed && !pFile->pI
a740: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
a750: 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  ck ){.    struct
a760: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
a770: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
a780: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
a790: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
a7a0: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
a7b0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
a7c0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
a7d0: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
a7e0: 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  if( osFcntl(pFil
a7f0: 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  e->h, F_GETLK, &
a800: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72  lock) ){.      r
a810: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
a820: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
a830: 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  CK;.      pFile-
a840: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
a850: 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  no;.    } else i
a860: 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d  f( lock.l_type!=
a870: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
a880: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
a890: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
a8a0: 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
a8b0: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
a8c0: 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
a8d0: 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c  %d %d %d (unix)\
a8e0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
a8f0: 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
a900: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
a910: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
a920: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
a930: 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73 79 73  mpt to set a sys
a940: 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  tem-lock on the 
a950: 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65  file pFile.  The
a960: 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73   lock is .** des
a970: 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e  cribed by pLock.
a980: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46  .**.** If the pF
a990: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72  ile was opened r
a9a0: 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75  ead/write from u
a9b0: 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74  nix-excl, then t
a9c0: 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20  he only lock.** 
a9d0: 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73  ever obtained is
a9e0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
a9f0: 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62  ck, and it is ob
aa00: 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f  tained exactly o
aa10: 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  nce.** the first
aa20: 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69   time any lock i
aa30: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c  s attempted.  Al
aa40: 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73 79 73  l subsequent sys
aa50: 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f  tem locking.** o
aa60: 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65  perations become
aa70: 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e   no-ops.  Lockin
aa80: 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69  g operations sti
aa90: 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e  ll happen intern
aaa0: 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65  ally,.** in orde
aab0: 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  r to coordinate 
aac0: 61 63 63 65 73 73 20 62 65 74 77 65 65 6e 20 73  access between s
aad0: 65 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65  eparate database
aae0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
aaf0: 77 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63  within this proc
ab00: 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20  ess, but all of 
ab10: 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20  that is handled 
ab20: 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68  in memory and th
ab30: 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  e.** operating s
ab40: 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70  ystem does not p
ab50: 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a  articipate..**.*
ab60: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
ab70: 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67  is a pass-throug
ab80: 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54  h to fcntl(F_SET
ab90: 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73 20  LK) if pFile is 
aba0: 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53  using.** any VFS
abb0: 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69   other than "uni
abc0: 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46  x-excl" or if pF
abd0: 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ile is opened on
abe0: 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20   "unix-excl".** 
abf0: 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  and is read-only
ac00: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
ac10: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
ac20: 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73  call completes s
ac30: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20  uccessfully, or 
ac40: 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20  -1 if a call.** 
ac50: 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73  to fcntl() fails
ac60: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
ac70: 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70  errno is set app
ac80: 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20 66  ropriately (by f
ac90: 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  cntl())..*/.stat
aca0: 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c  ic int unixFileL
acb0: 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
acc0: 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63  ile, struct floc
acd0: 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  k *pLock){.  int
ace0: 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65   rc;.  unixInode
acf0: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
ad00: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
ad10: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
ad20: 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73  xHeld() );.  ass
ad30: 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29  ert( pInode!=0 )
ad40: 3b 0a 20 20 69 66 28 20 28 28 70 46 69 6c 65 2d  ;.  if( ((pFile-
ad50: 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
ad60: 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30 20 7c  XFILE_EXCL)!=0 |
ad70: 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  | pInode->bProce
ad80: 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20 28 28  ssLock).   && ((
ad90: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
ada0: 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e   & UNIXFILE_RDON
adb0: 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20  LY)==0).  ){.   
adc0: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72   if( pInode->bPr
add0: 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
ade0: 20 20 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f        struct flo
adf0: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61  ck lock;.      a
ae00: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
ae10: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
ae20: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
ae30: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
ae40: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
ae50: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
ae60: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
ae70: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
ae80: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
ae90: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20  = F_WRLCK;.     
aea0: 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46   rc = osFcntl(pF
aeb0: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
aec0: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69   &lock);.      i
aed0: 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e  f( rc<0 ) return
aee0: 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64   rc;.      pInod
aef0: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20  e->bProcessLock 
af00: 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  = 1;.      pInod
af10: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
af20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
af30: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
af40: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  se{.    rc = osF
af50: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
af60: 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a  _SETLK, pLock);.
af70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
af80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
af90: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
afa0: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
afb0: 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
afc0: 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
afd0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
afe0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
aff0: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
b000: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
b010: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
b020: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
b030: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
b040: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
b050: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
b060: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
b070: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
b080: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
b090: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
b0a0: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
b0b0: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
b0c0: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
b0d0: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
b0e0: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
b0f0: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
b100: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
b110: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
b120: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
b130: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
b140: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
b150: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
b160: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
b170: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
b180: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
b190: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
b1a0: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
b1b0: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
b1c0: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
b1d0: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
b1e0: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
b1f0: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
b200: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
b210: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
b220: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
b230: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
b240: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
b250: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
b260: 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
b270: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
b280: 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
b290: 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
b2a0: 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
b2b0: 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69  nt unixLock(sqli
b2c0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
b2d0: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
b2e0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
b2f0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
b300: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
b310: 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63   the various loc
b320: 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b  ks and.  ** lock
b330: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20   transitions in 
b340: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53  terms of the POS
b350: 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61 72  IX advisory shar
b360: 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  ed and exclusive
b370: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69  .  ** lock primi
b380: 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65  tives (called re
b390: 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69  ad-locks and wri
b3a0: 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20  te-locks below, 
b3b0: 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f  to avoid.  ** co
b3c0: 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c  nfusion with SQL
b3d0: 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e  ite lock names).
b3e0: 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20   The algorithms 
b3f0: 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a  are complicated.
b400: 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e    ** slightly in
b410: 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d   order to be com
b420: 70 61 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e  patible with win
b430: 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d  dows systems sim
b440: 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a  ultaneously.  **
b450: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
b460: 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
b470: 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74 20  e, in case that 
b480: 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65 64  is ever required
b490: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62  ..  **.  ** Symb
b4a0: 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f  ols defined in o
b4b0: 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68  s.h indentify th
b4c0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
b4d0: 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72 76   and the 'reserv
b4e0: 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65  ed.  ** byte', e
b4f0: 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73  ach single bytes
b500: 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f   at well known o
b510: 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20  ffsets, and the 
b520: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
b530: 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67  * range', a rang
b540: 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20 61  e of 510 bytes a
b550: 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f  t a well known o
b560: 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ffset..  **.  **
b570: 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41   To obtain a SHA
b580: 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64  RED lock, a read
b590: 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65  -lock is obtaine
b5a0: 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  d on the 'pendin
b5b0: 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49  g.  ** byte'.  I
b5c0: 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65 73  f this is succes
b5d0: 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62  sful, a random b
b5e0: 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68  yte from the 'sh
b5f0: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
b600: 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f  ange' is read-lo
b610: 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63  cked and the loc
b620: 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  k on the 'pendin
b630: 67 20 62 79 74 65 27 20 72 65 6c 65 61 73 65 64  g byte' released
b640: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72  ..  **.  ** A pr
b650: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
b660: 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
b670: 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68   lock after it h
b680: 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  as a SHARED lock
b690: 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45  ..  ** A RESERVE
b6a0: 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d  D lock is implem
b6b0: 65 6e 74 65 64 20 62 79 20 67 72 61 62 62 69 6e  ented by grabbin
b6c0: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  g a write-lock o
b6d0: 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65  n the.  ** 'rese
b6e0: 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a  rved byte'. .  *
b6f0: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
b700: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
b710: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
b720: 61 66 74 65 72 20 69 74 20 68 61 73 20 6f 62 74  after it has obt
b730: 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41  ained a.  ** SHA
b740: 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44  RED lock. A PEND
b750: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c  ING lock is impl
b760: 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69  emented by obtai
b770: 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ning a write-loc
b780: 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70  k.  ** on the 'p
b790: 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68  ending byte'. Th
b7a0: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
b7b0: 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f  no new SHARED lo
b7c0: 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20  cks can be.  ** 
b7d0: 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78  obtained, but ex
b7e0: 69 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f  isting SHARED lo
b7f0: 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  cks are allowed 
b800: 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70 72  to persist. A pr
b810: 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20  ocess.  ** does 
b820: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61  not have to obta
b830: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
b840: 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ck on the way to
b850: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e   a PENDING lock.
b860: 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65  .  ** This prope
b870: 72 74 79 20 69 73 20 75 73 65 64 20 62 79 20 74  rty is used by t
b880: 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72  he algorithm for
b890: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
b8a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a  journal file.  *
b8b0: 2a 20 61 66 74 65 72 20 61 20 63 72 61 73 68 2e  * after a crash.
b8c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58  .  **.  ** An EX
b8d0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62  CLUSIVE lock, ob
b8e0: 74 61 69 6e 65 64 20 61 66 74 65 72 20 61 20 50  tained after a P
b8f0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68  ENDING lock is h
b900: 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70  eld, is.  ** imp
b910: 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61  lemented by obta
b920: 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  ining a write-lo
b930: 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65  ck on the entire
b940: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
b950: 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65  ** range'. Since
b960: 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73   all other locks
b970: 20 72 65 71 75 69 72 65 20 61 20 72 65 61 64 2d   require a read-
b980: 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  lock on one of t
b990: 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69  he bytes.  ** wi
b9a0: 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c  thin this range,
b9b0: 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   this ensures th
b9c0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b  at no other lock
b9d0: 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68  s are held on th
b9e0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
b9f0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
ba00: 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20  reason a single 
ba10: 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75  byte cannot be u
ba20: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
ba30: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
ba40: 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74    ** range' is t
ba50: 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e  hat some version
ba60: 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20  s of windows do 
ba70: 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61 64  not support read
ba80: 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20  -locks. By.  ** 
ba90: 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d  locking a random
baa0: 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e   byte from a ran
bab0: 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53  ge, concurrent S
bac0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20  HARED locks may 
bad0: 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20  exist.  ** even 
bae0: 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  if the locking p
baf0: 72 69 6d 69 74 69 76 65 20 75 73 65 64 20 69 73  rimitive used is
bb00: 20 61 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d   always a write-
bb10: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  lock..  */.  int
bb20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bb30: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
bb40: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
bb50: 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
bb60: 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73  nfo *pInode;.  s
bb70: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
bb80: 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d  ;.  int tErrno =
bb90: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
bba0: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
bbb0: 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
bbc0: 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20  s was %s(%s,%d) 
bbd0: 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22  pid=%d (unix)\n"
bbe0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
bbf0: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
bc00: 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c  leLock), azFileL
bc10: 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ock(pFile->eFile
bc20: 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46  Lock),.      azF
bc30: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 70  ileLock(pFile->p
bc40: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
bc50: 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  ), pFile->pInode
bc60: 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70  ->nShared , getp
bc70: 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  id()));..  /* If
bc80: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
bc90: 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
bca0: 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
bcb0: 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
bcc0: 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
bcd0: 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
bce0: 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
bcf0: 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
bd00: 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72  s.  ** unixEnter
bd10: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
bd20: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
bd30: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
bd40: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69  ->eFileLock>=eFi
bd50: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53  leLock ){.    OS
bd60: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
bd70: 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
bd80: 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e  y held) (unix)\n
bd90: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
bda0: 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
bdb0: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29  ock(eFileLock)))
bdc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
bdd0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
bde0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
bdf0: 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
be00: 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
be10: 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
be20: 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
be30: 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
be40: 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
be50: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
be60: 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
be70: 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
be80: 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
be90: 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
bea0: 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
beb0: 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
bec0: 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
bed0: 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
bee0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
bef0: 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
bf00: 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
bf10: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
bf20: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
bf30: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
bf40: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
bf50: 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52  eFileLock!=RESER
bf60: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
bf70: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
bf80: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
bf90: 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
bfa0: 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
bfb0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
bfc0: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
bfd0: 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e  hreads.  */.  un
bfe0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
bff0: 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
c000: 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  ->pInode;..  /* 
c010: 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
c020: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
c030: 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
c040: 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
c050: 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
c060: 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
c070: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
c080: 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
c090: 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
c0a0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
c0b0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
c0c0: 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  & .          (pI
c0d0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
c0e0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
c0f0: 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
c100: 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
c110: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
c120: 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  SY;.    goto end
c130: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
c140: 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
c150: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
c160: 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
c170: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
c180: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
c190: 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
c1a0: 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
c1b0: 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
c1c0: 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
c1d0: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
c1e0: 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
c1f0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
c200: 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
c210: 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
c220: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
c230: 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
c240: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
c250: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
c260: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
c270: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
c280: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
c290: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
c2a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
c2b0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
c2c0: 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
c2d0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
c2e0: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
c2f0: 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
c300: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
c310: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  ++;.    goto end
c320: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  _lock;.  }...  /
c330: 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
c340: 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
c350: 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
c360: 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
c370: 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
c380: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
c390: 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
c3a0: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
c3b0: 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
c3c0: 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
c3d0: 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65    */.  lock.l_le
c3e0: 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c  n = 1L;.  lock.l
c3f0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
c400: 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c  ET;.  if( eFileL
c410: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
c420: 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
c430: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
c440: 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
c450: 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
c460: 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
c470: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28   lock.l_type = (
c480: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
c490: 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46  D_LOCK?F_RDLCK:F
c4a0: 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63  _WRLCK);.    loc
c4b0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
c4c0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66  ING_BYTE;.    if
c4d0: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
c4e0: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
c4f0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
c500: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
c510: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
c520: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
c530: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
c540: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
c550: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
c560: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
c570: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
c580: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
c590: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f       goto end_lo
c5a0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  ck;.    }.  }...
c5b0: 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
c5c0: 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69  gets to this poi
c5d0: 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c  nt, then actuall
c5e0: 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d  y go ahead and m
c5f0: 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  ake.  ** operati
c600: 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ng system calls 
c610: 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
c620: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d lock..  */.  i
c630: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
c640: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
c650: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
c660: 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
c670: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
c680: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
c690: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
c6a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
c6b0: 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
c6c0: 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  the read-lock */
c6d0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
c6e0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
c6f0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
c700: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
c710: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
c720: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
c730: 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  k) ){.      tErr
c740: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
c750: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
c760: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
c770: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
c780: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
c790: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   }..    /* Drop 
c7a0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
c7b0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
c7c0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c7d0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
c7e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
c7f0: 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  1L;.    lock.l_t
c800: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
c810: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
c820: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
c830: 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ) && rc==SQLITE_
c840: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  OK ){.      /* T
c850: 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  his could happen
c860: 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20   with a network 
c870: 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74  mount */.      t
c880: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
c890: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
c8a0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a  _IOERR_UNLOCK; .
c8b0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
c8c0: 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  c ){.      if( r
c8d0: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
c8e0: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
c8f0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
c900: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
c910: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
c920: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c930: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
c940: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
c950: 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  K;.      pInode-
c960: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
c970: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
c980: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
c990: 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
c9a0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
c9b0: 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   && pInode->nSha
c9c0: 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  red>1 ){.    /* 
c9d0: 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
c9e0: 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
c9f0: 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
ca00: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
ca10: 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
ca20: 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
ca30: 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
ca40: 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
ca50: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
ca60: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
ca70: 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
ca80: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
ca90: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
caa0: 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
cab0: 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
cac0: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
cad0: 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
cae0: 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
caf0: 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
cb00: 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69    assert( 0!=pFi
cb10: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b  le->eFileLock );
cb20: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
cb30: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20   = F_WRLCK;..   
cb40: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
cb50: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
cb60: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
cb70: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
cb80: 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c  ;.    if( eFileL
cb90: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
cba0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  CK ){.      lock
cbb0: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
cbc0: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20  VED_BYTE;.      
cbd0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
cbe0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cbf0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
cc00: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
cc10: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
cc20: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
cc30: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e     }..    if( un
cc40: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
cc50: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
cc60: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
cc70: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
cc80: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
cc90: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
cca0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
ccb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
ccc0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
ccd0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
cce0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
ccf0: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
cd00: 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 6e 64 65 66  .  }.  ..#ifndef
cd10: 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74   NDEBUG.  /* Set
cd20: 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
cd30: 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion-counter chan
cd40: 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67  ge checking flag
cd50: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e  s when.  ** tran
cd60: 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61  sitioning from a
cd70: 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53   SHARED to a RES
cd80: 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65  ERVED lock.  The
cd90: 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f   change.  ** fro
cda0: 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  m SHARED to RESE
cdb0: 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62  RVED marks the b
cdc0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f  eginning of a no
cdd0: 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20  rmal.  ** write 
cde0: 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61  operation (not a
cdf0: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot journal rol
ce00: 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69  lback)..  */.  i
ce10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ce20: 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  .   && pFile->eF
ce30: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
ce40: 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65  LOCK.   && eFile
ce50: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
ce60: 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69  OCK.  ){.    pFi
ce70: 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
ce80: 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  g = 0;.    pFile
ce90: 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a  ->dbUpdate = 0;.
cea0: 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
ceb0: 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20  malWrite = 1;.  
cec0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28  }.#endif...  if(
ced0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
cee0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
cef0: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
cf00: 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
cf10: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
cf20: 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
cf30: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
cf40: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
cf50: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
cf60: 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
cf70: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
cf80: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
cf90: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  DING_LOCK;.  }..
cfa0: 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
cfb0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
cfc0: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
cfd0: 20 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78    %d %s %s (unix
cfe0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
cff0: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
d000: 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63  Lock), .      rc
d010: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
d020: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
d030: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d040: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66  ./*.** Add the f
d050: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75  ile descriptor u
d060: 73 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64  sed by file hand
d070: 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20  le pFile to the 
d080: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
d090: 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a   pUnused list..*
d0a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
d0b0: 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46  tPendingFd(unixF
d0c0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
d0d0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
d0e0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
d0f0: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
d100: 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d  edFd *p = pFile-
d110: 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70  >pUnused;.  p->p
d120: 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Next = pInode->p
d130: 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65  Unused;.  pInode
d140: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20  ->pUnused = p;. 
d150: 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
d160: 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64    pFile->pUnused
d170: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   = 0;.}../*.** L
d180: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
d190: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
d1a0: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
d1b0: 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
d1c0: 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
d1d0: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
d1e0: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
d1f0: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
d200: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
d210: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
d220: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
d230: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
d240: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
d250: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
d260: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
d270: 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68  -op..** .** If h
d280: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69  andleNFSUnlock i
d290: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20  s true, then on 
d2a0: 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45  downgrading an E
d2b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f  XCLUSIVE_LOCK to
d2c0: 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62   SHARED.** the b
d2d0: 79 74 65 20 72 61 6e 67 65 20 69 73 20 64 69 76  yte range is div
d2e0: 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74  ided into 2 part
d2f0: 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  s and the first 
d300: 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64  part is unlocked
d310: 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20   then.** set to 
d320: 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65  a read lock, the
d330: 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61 72 74  n the other part
d340: 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63   is simply unloc
d350: 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  ked.  This works
d360: 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75   .** around a bu
d370: 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63  g in BSD NFS loc
d380: 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e  kd (also seen on
d390: 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74   MacOSX 10.3+) t
d3a0: 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a  hat fails to .**
d3b0: 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74   remove the writ
d3c0: 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69  e lock on a regi
d3d0: 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  on when a read l
d3e0: 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73  ock is set..*/.s
d3f0: 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55  tatic int posixU
d400: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
d410: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
d420: 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c  eLock, int handl
d430: 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75  eNFSUnlock){.  u
d440: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
d450: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
d460: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
d470: 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63  *pInode;.  struc
d480: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
d490: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d4a0: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
d4b0: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
d4c0: 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
d4d0: 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
d4e0: 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22  pid=%d (unix)\n"
d4f0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
d500: 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69  eLock,.      pFi
d510: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  le->eFileLock, p
d520: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
d530: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
d540: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
d550: 0a 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29  .      getpid())
d560: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46  );..  assert( eF
d570: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
d580: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
d590: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
d5a0: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
d5b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d5c0: 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
d5d0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
d5e0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
d5f0: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
d600: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d  Inode->nShared!=
d610: 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
d620: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
d630: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
d640: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
d650: 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d  FileLock==pFile-
d660: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23  >eFileLock );..#
d670: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
d680: 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69    /* When reduci
d690: 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74  ng a lock such t
d6a0: 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73  hat other proces
d6b0: 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20  ses can start.  
d6c0: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
d6d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
d6e0: 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  gain, make sure 
d6f0: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
d700: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
d710: 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
d720: 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74  if any part of t
d730: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
d740: 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e  ** file changed.
d750: 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
d760: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
d770: 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20  not updated,.   
d780: 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
d790: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d  tions to the sam
d7a0: 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74  e file might not
d7b0: 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20   realize that.  
d7c0: 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61    ** the file ha
d7d0: 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65  s changed and he
d7e0: 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e  nce might not kn
d7f0: 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69  ow to flush thei
d800: 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20  r.    ** cache. 
d810: 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74   The use of a st
d820: 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65  ale cache can le
d830: 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
d840: 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  orruption..    *
d850: 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  /.    pFile->inN
d860: 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a  ormalWrite = 0;.
d870: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64  #endif..    /* d
d880: 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20  owngrading to a 
d890: 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e  shared lock on N
d8a0: 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61  FS involves clea
d8b0: 72 69 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c  ring the write l
d8c0: 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  ock.    ** befor
d8d0: 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74  e establishing t
d8e0: 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f  he readlock - to
d8f0: 20 61 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f   avoid a race co
d900: 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67  ndition we downg
d910: 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  rade.    ** the 
d920: 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73  lock in 2 blocks
d930: 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f  , so that part o
d940: 66 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c  f the range will
d950: 20 62 65 20 63 6f 76 65 72 65 64 20 62 79 20 61   be covered by a
d960: 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c   .    ** write l
d970: 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65  ock until the re
d980: 73 74 20 69 73 20 63 6f 76 65 72 65 64 20 62 79  st is covered by
d990: 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20   a read lock:.  
d9a0: 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57    **  1:   [WWWW
d9b0: 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20  W].    **  2:   
d9c0: 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20  [....W].    **  
d9d0: 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20  3:   [RRRRW].   
d9e0: 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e   **  4:   [RRRR.
d9f0: 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ].    */.    if(
da00: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
da10: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66 20  ED_LOCK ){..#if 
da20: 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45  !defined(__APPLE
da30: 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45  __) || !SQLITE_E
da40: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
da50: 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69 64 29  YLE.      (void)
da60: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b  handleNFSUnlock;
da70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 68  .      assert( h
da80: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d  andleNFSUnlock==
da90: 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  0 );.#endif.#if 
daa0: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
dab0: 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
dac0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
dad0: 45 0a 20 20 20 20 20 20 69 66 28 20 68 61 6e 64  E.      if( hand
dae0: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20  leNFSUnlock ){. 
daf0: 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e         int tErrn
db00: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
db10: 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
db20: 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  rom system call 
db30: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  errors */.      
db40: 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20    off_t divSize 
db50: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  = SHARED_SIZE - 
db60: 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  1;.        .    
db70: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
db80: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
db90: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
dba0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
dbb0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
dbc0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
dbd0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
dbe0: 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a  _len = divSize;.
dbf0: 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
dc00: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
dc10: 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
dc20: 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
dc30: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
dc40: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
dc50: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
dc60: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
dc70: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
dc80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
dc90: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
dca0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
dcb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
dcc0: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
dcd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dce0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
dcf0: 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _RDLCK;.        
dd00: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
dd10: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
dd20: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
dd30: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
dd40: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
dd50: 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
dd60: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
dd70: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
dd80: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
dd90: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
dda0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
ddb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
ddc0: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
ddd0: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
dde0: 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20  OERR_RDLOCK);.  
ddf0: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
de00: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
de10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
de20: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
de30: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
de40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
de50: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
de60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
de70: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
de80: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _UNLCK;.        
de90: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
dea0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
deb0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
dec0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69   SHARED_FIRST+di
ded0: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c  vSize;.        l
dee0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
def0: 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b  ED_SIZE-divSize;
df00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
df10: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
df20: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
df30: 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
df40: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
df50: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
df60: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
df70: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
df80: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
df90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  {.            pF
dfa0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
dfb0: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
dfc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
dfd0: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
dfe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dff0: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
e000: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
e010: 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
e020: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
e030: 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20  E */.      {.   
e040: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
e050: 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20   = F_RDLCK;.    
e060: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
e070: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
e080: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
e090: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
e0a0: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
e0b0: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
e0c0: 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IZE;.        if(
e0d0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
e0e0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
e0f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74           /* In t
e100: 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c 20  heory, the call 
e110: 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  to unixFileLock(
e120: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65  ) cannot fail be
e130: 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a 20 20  cause another.  
e140: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
e150: 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  ss is holding an
e160: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f   incompatible lo
e170: 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20  ck. If it does, 
e180: 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
e190: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ** indicates tha
e1a0: 74 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63  t the other proc
e1b0: 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f  ess is not follo
e1c0: 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67  wing the locking
e1d0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
e1e0: 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73 20  otocol. If this 
e1f0: 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72 6e 20  happens, return 
e200: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
e210: 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20  OCK. Returning. 
e220: 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
e230: 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20 63 6f  TE_BUSY would co
e240: 6e 66 75 73 65 20 74 68 65 20 75 70 70 65 72 20  nfuse the upper 
e250: 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63 74 69  layer (in practi
e260: 63 65 20 69 74 20 63 61 75 73 65 73 20 0a 20 20  ce it causes .  
e270: 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 73          ** an as
e280: 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a  sert to fail). *
e290: 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  / .          rc 
e2a0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
e2b0: 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  DLOCK;.         
e2c0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e2d0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
e2e0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
e2f0: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
e300: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e310: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
e320: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63  F_UNLCK;.    loc
e330: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
e340: 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
e350: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
e360: 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
e370: 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73  .l_len = 2L;  as
e380: 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59  sert( PENDING_BY
e390: 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42  TE+1==RESERVED_B
e3a0: 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 75  YTE );.    if( u
e3b0: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
e3c0: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a  e, &lock)==0 ){.
e3d0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
e3e0: 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
e3f0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
e400: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
e410: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
e420: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
e430: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
e440: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
e450: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  _unlock;.    }. 
e460: 20 7d 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f   }.  if( eFileLo
e470: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  ck==NO_LOCK ){. 
e480: 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
e490: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
e4a0: 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
e4b0: 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
e4c0: 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
e4d0: 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
e4e0: 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
e4f0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
e500: 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
e510: 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
e520: 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   */.    pInode->
e530: 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69  nShared--;.    i
e540: 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  f( pInode->nShar
e550: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c  ed==0 ){.      l
e560: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
e570: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  NLCK;.      lock
e580: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
e590: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
e5a0: 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e  .l_start = lock.
e5b0: 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20  l_len = 0L;.    
e5c0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e5d0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e5e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
e5f0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
e600: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
e610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e620: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
e630: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 09 70 46 69 6c  RR_UNLOCK;..pFil
e640: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
e650: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70 49  rrno;.        pI
e660: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
e670: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
e680: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
e690: 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
e6a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
e6b0: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
e6c0: 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b  he count of lock
e6d0: 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73  s against this s
e6e0: 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20  ame file.  When 
e6f0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  the.    ** count
e700: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63   reaches zero, c
e710: 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66  lose any other f
e720: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
e730: 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20  whose close.    
e740: 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20  ** was deferred 
e750: 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74  because of outst
e760: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20  anding locks..  
e770: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d    */.    pInode-
e780: 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73  >nLock--;.    as
e790: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
e7a0: 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ock>=0 );.    if
e7b0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
e7c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73  =0 ){.      clos
e7d0: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
e7e0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 09 0a  e);.    }.  }...
e7f0: 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e  end_unlock:.  un
e800: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
e810: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e820: 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69  _OK ) pFile->eFi
e830: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
e840: 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck;.  return rc;
e850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
e860: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
e870: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
e880: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
e890: 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
e8a0: 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
e8b0: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
e8c0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
e8d0: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
e8e0: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
e8f0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
e900: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
e910: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
e920: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
e930: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
e940: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
e950: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
e960: 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ixUnlock(sqlite3
e970: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
e980: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74  FileLock){.  ret
e990: 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  urn posixUnlock(
e9a0: 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30  id, eFileLock, 0
e9b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
e9c0: 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
e9d0: 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20  ms the parts of 
e9e0: 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22  the "close file"
e9f0: 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63   operation .** c
ea00: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
ea10: 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74  king schemes. It
ea20: 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65   closes the dire
ea30: 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a  ctory and file.*
ea40: 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68  * handles, if th
ea50: 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e  ey are valid, an
ea60: 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64  d sets all field
ea70: 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
ea80: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  e.** structure t
ea90: 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  o 0..**.** It is
eaa0: 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79   *not* necessary
eab0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
eac0: 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ex when this rou
ead0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tine is called,.
eae0: 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72  ** even on VxWor
eaf0: 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c  ks.  A mutex wil
eb00: 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e  l be acquired on
eb10: 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a   VxWorks by the.
eb20: 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  ** vxworksReleas
eb30: 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e  eFileId() routin
eb40: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
eb50: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73   closeUnixFile(s
eb60: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
eb70: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
eb80: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
eb90: 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  )id;.  if( pFile
eba0: 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f  ->h>=0 ){.    ro
ebb0: 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
ebc0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  , pFile->h, __LI
ebd0: 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65  NE__);.    pFile
ebe0: 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69  ->h = -1;.  }.#i
ebf0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
ec00: 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b  f( pFile->pId ){
ec10: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
ec20: 69 73 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  isDelete ){.    
ec30: 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65    osUnlink(pFile
ec40: 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61  ->pId->zCanonica
ec50: 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  lName);.    }.  
ec60: 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65    vxworksRelease
ec70: 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49  FileId(pFile->pI
ec80: 64 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  d);.    pFile->p
ec90: 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  Id = 0;.  }.#end
eca0: 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43  if.  OSTRACE(("C
ecb0: 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
ecc0: 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70  pFile->h));.  Op
ecd0: 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
ece0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
ecf0: 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20  ile->pUnused);. 
ed00: 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
ed10: 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
ed20: 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e));.  return SQ
ed30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
ed40: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
ed50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
ed60: 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ixClose(sqlite3_
ed70: 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  file *id){.  int
ed80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ed90: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
eda0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
edb0: 29 69 64 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63  )id;.  unixUnloc
edc0: 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
edd0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
ede0: 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69  ();..  /* unixFi
edf0: 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77  le.pInode is alw
ee00: 61 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20  ays valid here. 
ee10: 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64 69 66  Otherwise, a dif
ee20: 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a  ferent close.  *
ee30: 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20  * routine (e.g. 
ee40: 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77  nolockClose()) w
ee50: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69  ould be called i
ee60: 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61  nstead..  */.  a
ee70: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49  ssert( pFile->pI
ee80: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c  node->nLock>0 ||
ee90: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
eea0: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
eeb0: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
eec0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26  pFile->pInode) &
eed0: 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  & pFile->pInode-
eee0: 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a  >nLock ){.    /*
eef0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
ef00: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c  tstanding locks,
ef10: 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   do not actually
ef20: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
ef30: 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20  just.    ** yet 
ef40: 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
ef50: 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
ef60: 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
ef70: 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
ef80: 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
ef90: 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  o pInode->pUnuse
efa0: 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c  d list.  It will
efb0: 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
efc0: 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a  y closed .    **
efd0: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
efe0: 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
eff0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65      */.    setPe
f000: 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a  ndingFd(pFile);.
f010: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f    }.  releaseIno
f020: 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
f030: 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
f040: 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c  ile(id);.  unixL
f050: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
f060: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a  eturn rc;.}../**
f070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
f080: 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61 64   of the posix ad
f090: 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c  visory lock impl
f0a0: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
f0b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
f0c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
f110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
f160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d  ************ No-
f180: 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  op Locking *****
f190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
f1b0: 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f  .** Of the vario
f1c0: 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  us locking imple
f1d0: 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c  mentations avail
f1e0: 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79  able, this is by
f1f0: 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70   far the.** simp
f200: 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69  lest:  locking i
f210: 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61  s ignored.  No a
f220: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
f230: 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  o lock the datab
f240: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20  ase.** file for 
f250: 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
f260: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c  ng..**.** This l
f270: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61  ocking mode is a
f280: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75  ppropriate for u
f290: 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  se on read-only 
f2a0: 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78  databases.** (ex
f2b0: 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  : databases that
f2c0: 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f   are burned into
f2d0: 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61   CD-ROM, for exa
f2e0: 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a  mple.)  It can.*
f2f0: 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69  * also be used i
f300: 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  f the applicatio
f310: 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65  n employs some e
f320: 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73  xternal mechanis
f330: 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20  m to.** prevent 
f340: 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63  simultaneous acc
f350: 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ess of the same 
f360: 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20  database by two 
f370: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62  or more.** datab
f380: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
f390: 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61    But there is a
f3a0: 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66   serious risk of
f3b0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72   database.** cor
f3c0: 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20  ruption if this 
f3d0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
f3e0: 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f  used in situatio
f3f0: 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c  ns where multipl
f400: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
f410: 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63  nnections are ac
f420: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
f430: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
f440: 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69  t the same.** ti
f450: 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f  me and one or mo
f460: 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e  re of those conn
f470: 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74  ections are writ
f480: 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  ing..*/..static 
f490: 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52  int nolockCheckR
f4a0: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
f4b0: 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
f4c0: 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
f4d0: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
f4e0: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
f4f0: 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20   *pResOut = 0;. 
f500: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f510: 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
f520: 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74  nolockLock(sqlit
f530: 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
f540: 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b  , int NotUsed2){
f550: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
f560: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
f570: 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
f580: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73  n SQLITE_OK;.}.s
f590: 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
f5a0: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
f5b0: 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
f5c0: 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55  t NotUsed2){.  U
f5d0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
f5e0: 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
f5f0: 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d2);.  return SQ
f600: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
f610: 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  * Close the file
f620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f630: 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69  nolockClose(sqli
f640: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
f650: 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e    return closeUn
f660: 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f  ixFile(id);.}../
f670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f680: 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e  *** End of the n
f690: 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  o-op lock implem
f6a0: 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
f6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
f6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
f710: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
f720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
f760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
f780: 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67  dot-file Locking
f790: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
f7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
f7b0: 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c  **.** The dotfil
f7c0: 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  e locking implem
f7d0: 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68  entation uses th
f7e0: 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 73  e existance of s
f7f0: 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20  eparate lock.** 
f800: 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20  files (really a 
f810: 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f  directory) to co
f820: 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20  ntrol access to 
f830: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
f840: 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20  his works.** on 
f850: 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65 72 79  just about every
f860: 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67   filesystem imag
f870: 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65  inable.  But the
f880: 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64  re are serious d
f890: 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20  ownsides:.**.** 
f8a0: 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73     (1)  There is
f8b0: 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63   zero concurrenc
f8c0: 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61  y.  A single rea
f8d0: 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f  der blocks all o
f8e0: 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  ther.**         
f8f0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  connections from
f900: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
f910: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
f920: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
f930: 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  An application c
f940: 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f  rash or power lo
f950: 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61  ss can leave sta
f960: 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a  le lock files.**
f970: 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67           sitting
f980: 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65   around that nee
f990: 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20  d to be cleared 
f9a0: 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  manually..**.** 
f9b0: 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20  Nevertheless, a 
f9c0: 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70  dotlock is an ap
f9d0: 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e  propriate lockin
f9e0: 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69  g mode for use i
f9f0: 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f  f no.** other lo
fa00: 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69  cking strategy i
fa10: 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  s available..**.
fa20: 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  ** Dotfile locki
fa30: 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61  ng works by crea
fa40: 74 69 6e 67 20 61 20 73 75 62 64 69 72 65 63 74  ting a subdirect
fa50: 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ory in the same 
fa60: 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20  directory as.** 
fa70: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
fa80: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
fa90: 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20 22  ame but with a "
faa0: 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e  .lock" extension
fab0: 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65   added..** The e
fac0: 78 69 73 74 61 6e 63 65 20 6f 66 20 61 20 6c 6f  xistance of a lo
fad0: 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70  ck directory imp
fae0: 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56  lies an EXCLUSIV
faf0: 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68  E lock.  All oth
fb00: 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73  er.** lock types
fb10: 20 28 53 48 41 52 45 44 2c 20 52 45 53 45 52 56   (SHARED, RESERV
fb20: 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65  ED, PENDING) are
fb30: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43   mapped into EXC
fb40: 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  LUSIVE..*/../*.*
fb50: 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69  * The file suffi
fb60: 78 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64  x added to the d
fb70: 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d  ata base filenam
fb80: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
fb90: 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  eate the.** lock
fba0: 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23   directory..*/.#
fbb0: 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53  define DOTLOCK_S
fbc0: 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f  UFFIX ".lock"../
fbd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
fbe0: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
fbf0: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
fc00: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
fc10: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
fc20: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
fc30: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
fc40: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
fc50: 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
fc60: 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
fc70: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
fc80: 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
fc90: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
fca0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
fcb0: 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
fcc0: 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
fcd0: 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
fce0: 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
fcf0: 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  checking..**.** 
fd00: 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  In dotfile locki
fd10: 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63  ng, either a loc
fd20: 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74 20 64  k exists or it d
fd30: 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20  oes not.  So in 
fd40: 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f  this.** variatio
fd50: 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76  n of CheckReserv
fd60: 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f  edLock(), *pResO
fd70: 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ut is set to tru
fd80: 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a  e if any lock.**
fd90: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
fda0: 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69  file and false i
fdb0: 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
fdc0: 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  locked..*/.stati
fdd0: 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65  c int dotlockChe
fde0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
fdf0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
fe00: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
fe10: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
fe20: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
fe30: 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
fe40: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
fe50: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
fe60: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
fe70: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
fe80: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
fe90: 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
fea0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
feb0: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
fec0: 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
fed0: 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
fee0: 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
fef0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
ff00: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
ff10: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68  K ){.    /* Eith
ff20: 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  er this connecti
ff30: 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  on or some other
ff40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74   connection in t
ff50: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a  he same process.
ff60: 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c      ** holds a l
ff70: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  ock on the file.
ff80: 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65    No need to che
ff90: 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20  ck further. */. 
ffa0: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
ffb0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
ffc0: 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c   The lock is hel
ffd0: 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66  d if and only if
ffe0: 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78   the lockfile ex
fff0: 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  ists */.    cons
10000 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c  t char *zLockFil
10010 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
10020 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
10030 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65  ontext;.    rese
10040 72 76 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28  rved = osAccess(
10050 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30  zLockFile, 0)==0
10060 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
10070 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
10080 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b  d %d %d (dotlock
10090 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
100a0 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
100b0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
100c0 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
100d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
100e0 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
100f0 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
10100 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
10110 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
10120 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
10130 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
10140 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
10150 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
10160 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
10170 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
10180 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
10190 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
101a0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
101b0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
101c0 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
101d0 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
101e0 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
101f0 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
10200 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
10210 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
10220 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
10230 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
10240 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
10250 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
10260 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
10270 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
10280 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
10290 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
102a0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
102b0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
102c0 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
102d0 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
102e0 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
102f0 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
10300 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
10310 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
10320 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
10330 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
10340 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
10350 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
10360 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
10370 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
10380 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
10390 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
103a0 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
103b0 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
103c0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
103d0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
103e0 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
103f0 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69   level..**.** Wi
10400 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  th dotfile locki
10410 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e  ng, we really on
10420 6c 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65  ly support state
10430 20 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e   (4): EXCLUSIVE.
10440 0a 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b  .** But we track
10450 20 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69   the other locki
10460 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e  ng levels intern
10470 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ally..*/.static 
10480 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28  int dotlockLock(
10490 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
104a0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
104b0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
104c0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
104d0 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c  *)id;.  char *zL
104e0 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
104f0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
10500 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72  Context;.  int r
10510 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
10520 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65  .  /* If we have
10530 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20   any lock, then 
10540 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c  the lock file al
10550 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 41  ready exists.  A
10560 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  ll we have.  ** 
10570 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20  to do is adjust 
10580 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  our internal rec
10590 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ord of the lock 
105a0 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  level..  */.  if
105b0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
105c0 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ck > NO_LOCK ){.
105d0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
105e0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
105f0 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  ;.    /* Always 
10600 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73  update the times
10610 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20  tamp on the old 
10620 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48  file */.#ifdef H
10630 41 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74  AVE_UTIME.    ut
10640 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e  ime(zLockFile, N
10650 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ULL);.#else.    
10660 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65  utimes(zLockFile
10670 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
10680 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10690 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
106a0 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
106b0 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63  ive lock */.  rc
106c0 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b   = osMkdir(zLock
106d0 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69  File, 0777);.  i
106e0 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f  f( rc<0 ){.    /
106f0 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * failed to open
10700 2f 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b  /create the lock
10710 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20   directory */.  
10720 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
10730 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45  rrno;.    if( EE
10740 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29  XIST == tErrno )
10750 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
10760 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20  ITE_BUSY;.    } 
10770 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20  else {.      rc 
10780 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
10790 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
107a0 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
107b0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
107c0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
107d0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
107e0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
107f0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
10800 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
10810 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20  rn rc;.  } .  . 
10820 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
10830 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
10840 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
10850 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
10860 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
10870 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10880 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
10890 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
108a0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
108b0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
108c0 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
108d0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
108e0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
108f0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
10900 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
10910 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
10920 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
10930 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
10940 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
10950 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
10960 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
10970 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  o-op..**.** When
10980 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
10990 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f  el reaches NO_LO
109a0 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  CK, delete the l
109b0 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ock file..*/.sta
109c0 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
109d0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
109e0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
109f0 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
10a00 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10a10 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68  ixFile*)id;.  ch
10a20 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
10a30 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
10a40 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
10a50 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
10a60 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
10a70 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
10a80 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
10a90 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d=%d (dotlock)\n
10aa0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
10ab0 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c  leLock,..   pFil
10ac0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65  e->eFileLock, ge
10ad0 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65  tpid()));.  asse
10ae0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
10af0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
10b00 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
10b10 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
10b20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
10b30 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k==eFileLock ){.
10b40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10b50 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
10b60 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20  To downgrade to 
10b70 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75  shared, simply u
10b80 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e  pdate our intern
10b90 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65  al notion of the
10ba0 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  .  ** lock state
10bb0 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65  .  No need to me
10bc0 73 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65  ss with the file
10bd0 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
10be0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
10bf0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
10c00 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
10c10 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
10c20 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
10c30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
10c40 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e    /* To fully un
10c50 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
10c60 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f  e, delete the lo
10c70 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73  ck file */.  ass
10c80 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
10c90 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20  NO_LOCK );.  rc 
10ca0 3d 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46  = osRmdir(zLockF
10cb0 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30  ile);.  if( rc<0
10cc0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44   && errno==ENOTD
10cd0 49 52 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69  IR ) rc = osUnli
10ce0 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20  nk(zLockFile);. 
10cf0 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20   if( rc<0 ){.   
10d00 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
10d10 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b  rno;.    rc = 0;
10d20 0a 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20  .    if( ENOENT 
10d30 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  != tErrno ){.   
10d40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
10d50 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
10d60 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
10d70 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
10d80 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
10d90 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
10da0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
10db0 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
10dc0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
10dd0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
10de0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10df0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
10e00 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  le.  Make sure t
10e10 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
10e20 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65   released before
10e30 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61   closing..*/.sta
10e40 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
10e50 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
10e60 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
10e70 63 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  c;.  if( id ){. 
10e80 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
10e90 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
10ea0 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55  id;.    dotlockU
10eb0 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
10ec0 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  K);.    sqlite3_
10ed0 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  free(pFile->lock
10ee0 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  ingContext);.  }
10ef0 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69  .  rc = closeUni
10f00 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 72 65 74  xFile(id);.  ret
10f10 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  urn rc;.}./*****
10f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
10f30 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c  d of the dot-fil
10f40 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
10f50 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
10f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
10f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fb0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
10fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
11010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11020 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63  ***** Begin floc
11030 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  k Locking ******
11040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
11060 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29   Use the flock()
11070 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
11080 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e  do file locking.
11090 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c  .**.** flock() l
110a0 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
110b0 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  ot-file locking 
110c0 69 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69  in that the vari
110d0 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69  ous.** fine-grai
110e0 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  n locking levels
110f0 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51   supported by SQ
11100 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73  Lite are collaps
11110 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ed into.** a sin
11120 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  gle exclusive lo
11130 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ck.  In other wo
11140 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53  rds, SHARED, RES
11150 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45  ERVED, and.** PE
11160 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20  NDING locks are 
11170 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61  the same thing a
11180 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
11190 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20  ock.  SQLite.** 
111a0 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e  still works when
111b0 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75   you do this, bu
111c0 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73  t concurrency is
111d0 20 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a   reduced since.*
111e0 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
111f0 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72  process can be r
11200 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
11210 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a  ase at a time..*
11220 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73  *.** Omit this s
11230 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45  ection if SQLITE
11240 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
11250 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20  STYLE is turned 
11260 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d  off or if.** com
11270 70 69 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52  piling for VXWOR
11280 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  KS..*/.#if SQLIT
11290 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
112a0 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
112b0 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  WORKS../*.** Ret
112c0 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73  ry flock() calls
112d0 20 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20   that fail with 
112e0 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20  EINTR.*/.#ifdef 
112f0 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74  EINTR.static int
11300 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e   robust_flock(in
11310 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20  t fd, int op){. 
11320 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72   int rc;.  do{ r
11330 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29  c = flock(fd,op)
11340 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
11350 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
11360 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11370 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
11380 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62  robust_flock(a,b
11390 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e  ) flock(a,b).#en
113a0 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  dif.     ../*.**
113b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
113c0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
113d0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
113e0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
113f0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
11400 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
11410 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
11420 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
11430 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
11440 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
11450 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
11460 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
11470 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
11480 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
11490 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
114a0 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
114b0 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
114c0 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
114d0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
114e0 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  int flockCheckRe
114f0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
11500 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
11510 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
11520 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11530 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
11540 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
11550 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11560 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
11570 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
11580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
11590 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
115a0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
115b0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
115c0 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
115d0 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
115e0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
115f0 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
11600 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
11610 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
11620 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
11630 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
11640 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
11650 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
11660 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
11670 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
11680 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74  ed ){.    /* att
11690 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  empt to get the 
116a0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lock */.    int 
116b0 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f  lrc = robust_flo
116c0 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
116d0 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b  K_EX | LOCK_NB);
116e0 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b  .    if( !lrc ){
116f0 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68  .      /* got th
11700 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  e lock, unlock i
11710 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  t */.      lrc =
11720 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46   robust_flock(pF
11730 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
11740 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63  ;.      if ( lrc
11750 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74   ) {.        int
11760 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
11770 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f  .        /* unlo
11780 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  ck failed with a
11790 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
117a0 20 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f     lrc = SQLITE_
117b0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20  IOERR_UNLOCK; . 
117c0 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
117d0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
117e0 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
117f0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
11800 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
11810 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20  rc = lrc;.      
11820 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11830 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69  } else {.      i
11840 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
11850 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  o;.      reserve
11860 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  d = 1;.      /* 
11870 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67  someone else mig
11880 68 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72  ht have it reser
11890 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ved */.      lrc
118a0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
118b0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
118c0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
118d0 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20  R_LOCK); .      
118e0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
118f0 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
11900 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11910 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
11920 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
11930 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11940 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
11950 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
11960 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %d (flock)\n", p
11970 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
11980 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65 66  erved));..#ifdef
11990 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
119a0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
119b0 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c  .  if( (rc & SQL
119c0 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
119d0 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
119e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
119f0 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31  ;.    reserved=1
11a00 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
11a10 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
11a20 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
11a30 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  */.  *pResOut = 
11a40 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
11a50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11a60 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
11a70 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
11a80 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
11a90 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
11aa0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
11ab0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
11ac0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
11ad0 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
11ae0 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
11af0 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
11b00 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
11b10 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
11b20 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
11b30 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
11b40 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
11b50 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
11b60 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
11b70 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
11b80 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
11b90 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
11ba0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
11bb0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
11bc0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
11bd0 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
11be0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
11bf0 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
11c00 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
11c10 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
11c20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
11c30 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
11c40 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
11c50 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
11c60 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
11c70 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
11c80 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
11c90 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
11ca0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
11cb0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
11cc0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
11cd0 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
11ce0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
11cf0 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
11d00 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
11d10 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20  ** flock() only 
11d20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45  really support E
11d30 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20  XCLUSIVE locks. 
11d40 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d   We track interm
11d50 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73  ediate.** lock s
11d60 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c  tates in the sql
11d70 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74  ite3_file struct
11d80 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63  ure, but all loc
11d90 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20  ks SHARED or.** 
11da0 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79  above are really
11db0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
11dc0 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c   and exclude all
11dd0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
11de0 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20   from.** access 
11df0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
11e00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
11e10 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
11e20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
11e30 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
11e40 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
11e50 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
11e60 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
11e70 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28  c int flockLock(
11e80 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11e90 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
11ea0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
11eb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
11ec0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11ed0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  ixFile*)id;..  a
11ee0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
11ef0 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
11f00 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
11f10 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
11f20 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
11f30 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
11f40 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
11f50 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
11f60 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e  e->eFileLock > N
11f70 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
11f80 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
11f90 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
11fa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11fb0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
11fc0 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
11fd0 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20  lock */.  .  if 
11fe0 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46  (robust_flock(pF
11ff0 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20  ile->h, LOCK_EX 
12000 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20  | LOCK_NB)) {.  
12010 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
12020 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64  rrno;.    /* did
12030 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65  n't get, must be
12040 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20   busy */.    rc 
12050 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
12060 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
12070 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
12080 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
12090 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
120a0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
120b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
120c0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  rrno;.    }.  } 
120d0 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f  else {.    /* go
120e0 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
120f0 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
12100 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   */.    pFile->e
12110 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
12120 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  Lock;.  }.  OSTR
12130 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
12140 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e   %s %s (flock)\n
12150 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
12160 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
12170 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  k), .           
12180 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
12190 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
121a0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
121b0 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
121c0 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
121d0 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
121e0 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
121f0 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
12200 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
12210 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12220 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
12230 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
12240 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
12250 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
12260 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
12270 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
12280 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
12290 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
122a0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
122b0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
122c0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
122d0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
122e0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
122f0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
12300 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
12310 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
12320 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
12330 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
12340 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
12350 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e  atic int flockUn
12360 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
12370 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
12380 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
12390 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
123a0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
123b0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
123c0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
123d0 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
123e0 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29  d pid=%d (flock)
123f0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
12400 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
12410 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
12420 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29  eLock, getpid())
12430 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
12440 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
12450 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
12460 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
12470 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
12480 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c  >eFileLock==eFil
12490 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
124a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
124b0 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65   }.  .  /* share
124c0 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65  d can just be se
124d0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77  t because we alw
124e0 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c  ays have an excl
124f0 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65  usive */.  if (e
12500 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
12510 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
12520 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
12530 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
12540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12550 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c  .  }.  .  /* no,
12560 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e   really, unlock.
12570 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74   */.  if( robust
12580 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
12590 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66   LOCK_UN) ){.#if
125a0 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
125b0 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
125c0 4f 52 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ORS.    return S
125d0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
125e0 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
125f0 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
12600 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ORS */.    retur
12610 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  n SQLITE_IOERR_U
12620 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NLOCK;.  }else{.
12630 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
12640 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
12650 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12660 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
12670 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
12680 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
12690 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
126a0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
126b0 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c  if( id ){.    fl
126c0 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
126d0 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65  _LOCK);.  }.  re
126e0 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69  turn closeUnixFi
126f0 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69  le(id);.}..#endi
12700 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
12710 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
12720 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a   && !OS_VXWORK *
12730 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
12740 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
12750 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d  he flock lock im
12760 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
12770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12780 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
12790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127d0 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
127e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12820 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
12830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
12840 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f  in Named Semapho
12850 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  re Locking *****
12860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12870 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20  ***.**.** Named 
12880 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
12890 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  g is only suppor
128a0 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ted on VxWorks..
128b0 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
128c0 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20  locking is like 
128d0 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f  dot-lock and flo
128e0 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65  ck in that it re
128f0 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70  ally only.** sup
12900 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20  ports EXCLUSIVE 
12910 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61  locking.  Only a
12920 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
12930 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74  can read or writ
12940 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  e.** the databas
12950 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65  e file at a time
12960 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
12970 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72  potential concur
12980 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61  rency, but.** ma
12990 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70  kes the lock imp
129a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68  lementation much
129b0 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20   easier..*/.#if 
129c0 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
129d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
129e0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
129f0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
12a00 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
12a10 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
12a20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
12a30 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
12a40 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
12a50 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
12a60 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
12a70 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
12a80 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
12a90 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
12aa0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
12ab0 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
12ac0 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
12ad0 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
12ae0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
12af0 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
12b00 20 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73   int semCheckRes
12b10 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
12b20 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
12b30 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
12b40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12b50 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
12b60 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
12b70 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
12b80 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
12b90 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
12ba0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
12bb0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
12bc0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
12bd0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
12be0 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
12bf0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
12c00 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
12c10 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
12c20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12c30 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
12c40 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
12c50 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
12c60 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
12c70 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
12c80 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
12c90 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
12ca0 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65  {.    sem_t *pSe
12cb0 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
12cc0 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74 72  e->pSem;.    str
12cd0 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66  uct stat statBuf
12ce0 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74  ;..    if( sem_t
12cf0 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
12d00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45   ){.      int tE
12d10 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
12d20 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20 21      if( EAGAIN !
12d30 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
12d40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
12d50 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
12d60 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
12d70 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
12d80 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  ERVEDLOCK);.    
12d90 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
12da0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
12db0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
12dc0 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
12dd0 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f   else has the lo
12de0 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69  ck when we are i
12df0 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  n NO_LOCK */.   
12e00 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
12e10 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
12e20 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  k < SHARED_LOCK)
12e30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
12e40 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65  lse{.      /* we
12e50 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69   could have it i
12e60 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a  f we want it */.
12e70 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70        sem_post(p
12e80 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Sem);.    }.  }.
12e90 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
12ea0 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
12eb0 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c  d (sem)\n", pFil
12ec0 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
12ed0 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75  ed));..  *pResOu
12ee0 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
12ef0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12f00 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
12f10 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
12f20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
12f30 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
12f40 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
12f50 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
12f60 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
12f70 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
12f80 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
12f90 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
12fa0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
12fb0 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
12fc0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
12fd0 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
12fe0 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
12ff0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
13000 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
13010 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
13020 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
13030 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
13040 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
13050 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
13060 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
13070 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
13080 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
13090 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
130a0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
130b0 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
130c0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
130d0 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
130e0 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
130f0 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
13100 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
13110 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
13120 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
13130 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
13140 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
13150 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
13160 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
13170 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
13180 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
13190 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
131a0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
131b0 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
131c0 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c   locks only real
131d0 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
131e0 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
131f0 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
13200 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
13210 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
13220 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
13230 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
13240 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
13250 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
13260 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
13270 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
13280 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
13290 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
132a0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
132b0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
132c0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
132d0 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
132e0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
132f0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
13300 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
13310 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
13320 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65  t semLock(sqlite
13330 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13340 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
13350 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
13360 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
13370 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f    int fd;.  sem_
13380 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
13390 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20  >pInode->pSem;. 
133a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
133b0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  _OK;..  /* if we
133c0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
133d0 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
133e0 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
133f0 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
13400 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
13410 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
13420 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
13430 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
13440 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
13450 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
13460 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13470 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  _OK;.    goto se
13480 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
13490 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d    .  /* lock sem
134a0 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62  aphore now but b
134b0 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72  ail out when alr
134c0 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  eady locked. */.
134d0 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
134e0 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
134f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
13500 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  USY;.    goto se
13510 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
13520 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
13530 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
13540 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
13550 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
13560 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65   eFileLock;.. se
13570 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65  m_end_lock:.  re
13580 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13590 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
135a0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
135b0 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
135c0 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
135d0 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
135e0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
135f0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
13600 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
13610 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
13620 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
13630 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
13640 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
13650 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
13660 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
13670 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
13680 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
13690 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28  c int semUnlock(
136a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
136b0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
136c0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
136d0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
136e0 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
136f0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
13700 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73  ode->pSem;..  as
13710 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
13720 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b   assert( pSem );
13730 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
13740 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
13750 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e  d pid=%d (sem)\n
13760 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
13770 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c  leLock,..   pFil
13780 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65  e->eFileLock, ge
13790 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65  tpid()));.  asse
137a0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
137b0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
137c0 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
137d0 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
137e0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
137f0 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k==eFileLock ){.
13800 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13810 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
13820 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73  * shared can jus
13830 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65  t be set because
13840 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20   we always have 
13850 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a  an exclusive */.
13860 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    if (eFileLock=
13870 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a  =SHARED_LOCK) {.
13880 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
13890 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
138a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
138b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
138c0 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75   /* no, really u
138d0 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28  nlock. */.  if (
138e0 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d   sem_post(pSem)=
138f0 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20  =-1 ) {.    int 
13900 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  rc, tErrno = err
13910 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  no;.    rc = sql
13920 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
13930 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
13940 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
13950 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
13960 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
13970 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
13980 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
13990 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
139a0 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
139b0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
139c0 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
139d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
139e0 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61  ../*. ** Close a
139f0 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69   file.. */.stati
13a00 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73 65 28 73  c int semClose(s
13a10 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
13a20 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
13a30 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
13a40 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
13a50 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63  id;.    semUnloc
13a60 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
13a70 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
13a80 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74  e );.    unixEnt
13a90 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
13aa0 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
13ab0 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78  pFile);.    unix
13ac0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
13ad0 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28    closeUnixFile(
13ae0 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
13af0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13b00 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
13b10 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61  ORKS */./*.** Na
13b20 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
13b30 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
13b40 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72  ailable on VxWor
13b50 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks..**.*********
13b60 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
13b70 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
13b80 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
13b90 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
13ba0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
13bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bf0 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
13c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c40 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
13c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c60 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c  **** Begin AFP L
13c70 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
13c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c90 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41  ********.**.** A
13ca0 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20  FP is the Apple 
13cb0 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e  Filing Protocol.
13cc0 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f    AFP is a netwo
13cd0 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f  rk filesystem fo
13ce0 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20  und.** on Apple 
13cf0 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74  Macintosh comput
13d00 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61  ers - both OS9 a
13d10 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68  nd OSX..**.** Th
13d20 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d  ird-party implem
13d30 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50  entations of AFP
13d40 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20   are available. 
13d50 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68   But this code h
13d60 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b  ere.** only work
13d70 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69  s on OSX..*/..#i
13d80 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
13d90 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
13da0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
13db0 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66  YLE./*.** The af
13dc0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
13dd0 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
13de0 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20  ns all afp lock 
13df0 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a  specific state.*
13e00 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
13e10 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13e20 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  xt afpLockingCon
13e30 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70  text;.struct afp
13e40 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
13e50 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b  .  int reserved;
13e60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  .  const char *d
13e70 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
13e80 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
13e90 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d  e open file */.}
13ea0 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61  ;..struct ByteRa
13eb0 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75  ngeLockPB2.{.  u
13ec0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
13ed0 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  g offset;       
13ee0 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69   /* offset to fi
13ef0 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b  rst byte to lock
13f00 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
13f10 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b  ong long length;
13f20 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f          /* nbr o
13f30 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
13f40 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
13f50 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65  ng long retRange
13f60 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66  Start; /* nbr of
13f70 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64   1st byte locked
13f80 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a   if successful *
13f90 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
13fa0 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20  r unLockFlag;   
13fb0 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c        /* 1 = unl
13fc0 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f  ock, 0 = lock */
13fd0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
13fe0 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20   startEndFlag;  
13ff0 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f       /* 1=rel to
14000 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d   end of fork, 0=
14010 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a  rel to start */.
14020 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14040 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63      /* file desc
14050 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c   to assoc this l
14060 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a  ock with */.};..
14070 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74  #define afpfsByt
14080 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
14090 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a          _IOWR('z
140a0 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
140b0 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a  teRangeLockPB2).
140c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
140d0 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74   utility for set
140e0 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67  ting or clearing
140f0 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63   a bit-range loc
14100 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66  k on an.** AFP f
14110 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a  ilesystem..** .*
14120 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
14130 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53  OK on success, S
14140 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61  QLITE_BUSY on fa
14150 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
14160 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28   int afpSetLock(
14170 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
14180 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
14190 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
141a0 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b   file to be lock
141b0 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a  ed or unlocked *
141c0 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  /.  unixFile *pF
141d0 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
141e0 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
141f0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61  descriptor on pa
14200 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  th */.  unsigned
14210 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
14220 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  t,     /* First 
14230 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  byte to be locke
14240 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
14250 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
14260 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
14270 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
14280 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63   */.  int setLoc
14290 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  kFlag           
142a0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
142b0 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65  set lock.  False
142c0 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a   to clear lock *
142d0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79  /.){.  struct By
142e0 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70  teRangeLockPB2 p
142f0 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  b;.  int err;.  
14300 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67  .  pb.unLockFlag
14310 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f   = setLockFlag ?
14320 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61   0 : 1;.  pb.sta
14330 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20  rtEndFlag = 0;. 
14340 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66   pb.offset = off
14350 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68  set;.  pb.length
14360 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62   = length; .  pb
14370 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  .fd = pFile->h;.
14380 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41    .  OSTRACE(("A
14390 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66  FPSETLOCK [%s] f
143a0 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65  or %d%s in range
143b0 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a   %llx:%llx\n", .
143c0 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67      (setLockFlag
143d0 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46  ?"ON":"OFF"), pF
143e0 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d  ile->h, (pb.fd==
143f0 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22  -1?"[testval-1]"
14400 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74  :""),.    offset
14410 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72  , length));.  er
14420 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20  r = fsctl(path, 
14430 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
14440 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30  ck2FSCTL, &pb, 0
14450 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d  );.  if ( err==-
14460 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
14470 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  ;.    int tErrno
14480 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53   = errno;.    OS
14490 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f  TRACE(("AFPSETLO
144a0 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63  CK failed to fsc
144b0 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c  tl() '%s' %d %s\
144c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
144d0 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73   path, tErrno, s
144e0 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29  trerror(tErrno))
144f0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
14500 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
14510 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d  _ERRORS.    rc =
14520 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65   SQLITE_BUSY;.#e
14530 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  lse.    rc = sql
14540 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
14550 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20  xError(tErrno,. 
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14570 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f     setLockFlag ?
14580 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
14590 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  CK : SQLITE_IOER
145a0 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69  R_UNLOCK);.#endi
145b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
145c0 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f  RE_AFP_LOCK_ERRO
145d0 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53  RS */.    if( IS
145e0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
145f0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
14600 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
14610 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  no;.    }.    re
14620 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73  turn rc;.  } els
14630 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e {.    return S
14640 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
14650 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
14660 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
14670 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
14680 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
14690 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
146a0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
146b0 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
146c0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
146d0 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
146e0 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
146f0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
14700 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
14710 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
14720 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
14730 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
14740 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
14750 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
14760 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
14770 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
14780 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 68 65  tatic int afpChe
14790 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
147a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
147b0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
147c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
147d0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
147e0 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
147f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
14800 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61  nixFile*)id;.  a
14810 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
14820 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20   *context;.  .  
14830 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
14840 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
14850 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
14860 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
14870 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
14880 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  .  context = (af
14890 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
148a0 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
148b0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20  gContext;.  if( 
148c0 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
148d0 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75  d ){.    *pResOu
148e0 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  t = 1;.    retur
148f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14900 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
14910 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
14920 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
14930 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
14940 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f  hreads */.  .  /
14950 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
14960 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
14970 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
14980 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
14990 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
149a0 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
149b0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
149c0 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
149d0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
149e0 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
149f0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
14a00 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21  t..   */.  if( !
14a10 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
14a20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45  /* lock the RESE
14a30 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20  RVED byte */.   
14a40 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65   int lrc = afpSe
14a50 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
14a60 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
14a70 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31  SERVED_BYTE, 1,1
14a80 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c  );  .    if( SQL
14a90 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20  ITE_OK==lrc ){. 
14aa0 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75       /* if we su
14ab0 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e  cceeded in takin
14ac0 67 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c  g the reserved l
14ad0 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74  ock, unlock it t
14ae0 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20  o restore.      
14af0 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
14b00 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c  state */.      l
14b10 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
14b20 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
14b30 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
14b40 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
14b50 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
14b60 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64   /* if we failed
14b70 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b   to get the lock
14b80 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c   then someone el
14b90 73 65 20 6d 75 73 74 20 68 61 76 65 20 69 74 20  se must have it 
14ba0 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  */.      reserve
14bb0 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
14bc0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
14bd0 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20  OR(lrc) ){.     
14be0 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20   rc=lrc;.    }. 
14bf0 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76   }.  .  unixLeav
14c00 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
14c10 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
14c20 43 4b 20 25 64 20 25 64 20 25 64 20 28 61 66 70  CK %d %d %d (afp
14c30 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
14c40 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
14c50 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20    .  *pResOut = 
14c60 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
14c70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14c80 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
14c90 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
14ca0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
14cb0 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
14cc0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
14cd0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
14ce0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
14cf0 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
14d00 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
14d10 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
14d20 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
14d30 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
14d40 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
14d50 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
14d60 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
14d70 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
14d80 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
14d90 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
14da0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
14db0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
14dc0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
14dd0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
14de0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
14df0 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
14e00 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
14e10 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
14e20 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
14e30 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
14e40 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
14e50 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
14e60 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
14e70 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
14e80 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
14e90 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
14ea0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
14eb0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
14ec0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
14ed0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
14ee0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
14ef0 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
14f00 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
14f10 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
14f20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
14f30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14f40 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
14f50 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
14f60 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
14f70 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
14f80 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
14f90 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
14fa0 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b  atic int afpLock
14fb0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14fc0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
14fd0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
14fe0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
14ff0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
15000 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
15010 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
15020 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
15030 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e  ode;.  afpLockin
15040 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
15050 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
15060 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
15070 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
15080 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
15090 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
150a0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
150b0 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
150c0 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  id=%d (afp)\n", 
150d0 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
150e0 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
150f0 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69  eFileLock), azFi
15100 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46  leLock(pFile->eF
15110 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  ileLock),.      
15120 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
15130 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
15140 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  k), pInode->nSha
15150 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29 29  red , getpid()))
15160 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
15170 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
15180 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
15190 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
151a0 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
151b0 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  unixFile, do not
151c0 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
151d0 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  the afp_end_lock
151e0 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
151f0 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75    ** unixEnterMu
15200 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
15210 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
15220 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
15230 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65  eFileLock>=eFile
15240 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52  Lock ){.    OSTR
15250 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
15260 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
15270 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20  held) (afp)\n", 
15280 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
15290 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
152a0 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20  eFileLock)));.  
152b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
152c0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
152d0 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
152e0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
152f0 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31  correct.  **  (1
15300 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20  ) We never move 
15310 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
15320 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72   anything higher
15330 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63   than shared loc
15340 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c  k..  **  (2) SQL
15350 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63  ite never explic
15360 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20  itly requests a 
15370 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a  pendig lock..  *
15380 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20  *  (3) A shared 
15390 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68  lock is always h
153a0 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72  eld when a reser
153b0 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ve lock is reque
153c0 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sted..  */.  ass
153d0 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
153e0 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
153f0 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  | eFileLock==SHA
15400 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
15410 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
15420 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
15430 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
15440 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c  Lock!=RESERVED_L
15450 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46  OCK || pFile->eF
15460 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
15470 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
15480 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
15490 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
154a0 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
154b0 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
154c0 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
154d0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
154e0 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
154f0 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
15500 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
15510 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
15520 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
15530 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
15540 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
15550 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
15560 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
15570 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
15580 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
15590 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
155a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
155b0 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e         (pInode->
155c0 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
155d0 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NG_LOCK || eFile
155e0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
155f0 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72  )).     ){.    r
15600 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
15610 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e  .    goto afp_en
15620 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
15630 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
15640 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
15650 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
15660 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
15670 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
15680 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
15690 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
156a0 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
156b0 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
156c0 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
156d0 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
156e0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
156f0 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
15700 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
15710 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
15720 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65  OCK || pInode->e
15730 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
15740 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  ED_LOCK) ){.    
15750 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
15760 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
15770 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
15780 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
15790 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
157a0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
157b0 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  >0 );.    pFile-
157c0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
157d0 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  RED_LOCK;.    pI
157e0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b  node->nShared++;
157f0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  .    pInode->nLo
15800 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61  ck++;.    goto a
15810 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  fp_end_lock;.  }
15820 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e  .    .  /* A PEN
15830 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
15840 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
15850 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
15860 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
15870 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
15880 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
15890 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
158a0 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
158b0 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
158c0 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
158d0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
158e0 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
158f0 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    || (eFileLock=
15900 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
15910 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
15920 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ock<PENDING_LOCK
15930 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  ).  ){.    int f
15940 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65  ailed;.    faile
15950 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
15960 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
15970 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
15980 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  YTE, 1, 1);.    
15990 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20  if (failed) {.  
159a0 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
159b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
159c0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
159d0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63    }.  .  /* If c
159e0 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
159f0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
15a00 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
15a10 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
15a20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
15a30 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
15a40 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
15a50 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
15a60 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
15a70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31   ){.    int lrc1
15a80 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e  , lrc2, lrc1Errn
15a90 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20  o = 0;.    long 
15aa0 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20  lk, mask;.    . 
15ab0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
15ac0 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b  e->nShared==0 );
15ad0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
15ae0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
15af0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  0 );.        .  
15b00 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66    mask = (sizeof
15b10 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52  (long)==8) ? LAR
15b20 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37  GEST_INT64 : 0x7
15b30 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20  fffffff;.    /* 
15b40 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
15b50 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43  -lock SHARED_LOC
15b60 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65  K */.    /* note
15b70 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74   that the qualit
15b80 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e  y of the randomn
15b90 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ess doesn't matt
15ba0 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a  er that much */.
15bb0 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28      lk = random(
15bc0 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ); .    pInode->
15bd0 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b  sharedByte = (lk
15be0 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44   & mask)%(SHARED
15bf0 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
15c00 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc1 = afpSetLoc
15c10 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
15c20 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
15c30 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
15c40 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
15c50 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
15c60 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
15c70 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20  OR(lrc1) ){.    
15c80 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46    lrc1Errno = pF
15c90 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
15ca0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
15cb0 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
15cc0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
15cd0 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65      lrc2 = afpSe
15ce0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
15cf0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
15d00 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
15d10 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  );.    .    if( 
15d20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
15d30 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46  c1) ) {.      pF
15d40 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
15d50 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20   lrc1Errno;.    
15d60 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20    rc = lrc1;.   
15d70 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
15d80 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
15d90 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
15da0 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20  OR(lrc2) ){.    
15db0 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20    rc = lrc2;.   
15dc0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
15dd0 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
15de0 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c   if( lrc1 != SQL
15df0 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20  ITE_OK ) {.     
15e00 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20   rc = lrc1;.    
15e10 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70  } else {.      p
15e20 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
15e30 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
15e40 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
15e50 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  ck++;.      pIno
15e60 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b  de->nShared = 1;
15e70 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
15e80 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
15e90 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
15ea0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
15eb0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
15ec0 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
15ed0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
15ee0 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
15ef0 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20  ad in this.     
15f00 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
15f10 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
15f20 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
15f30 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
15f40 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
15f50 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
15f60 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
15f70 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
15f80 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
15f90 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
15fa0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
15fb0 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
15fc0 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
15fd0 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
15fe0 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
15ff0 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20  nt failed = 0;. 
16000 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
16010 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
16020 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c  ;.    if (eFileL
16030 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f  ock >= RESERVED_
16040 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
16050 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52  FileLock < RESER
16060 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
16070 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61      /* Acquire a
16080 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
16090 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
160a0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
160b0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
160c0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
160d0 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20  YTE, 1,1);.     
160e0 20 69 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a   if( !failed ){.
160f0 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
16100 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20  >reserved = 1;. 
16110 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16120 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26 20   if (!failed && 
16130 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43  eFileLock == EXC
16140 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20  LUSIVE_LOCK) {. 
16150 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
16160 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
16170 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20  k */.        .  
16180 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
16190 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65  e shared lock be
161a0 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20  fore trying the 
161b0 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65  range.  we'll ne
161c0 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ed to .      ** 
161d0 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
161e0 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77  shared lock if w
161f0 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20  e can't get the 
16200 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20   afpUnlock.     
16210 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28   */.      if( !(
16220 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
16230 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16240 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
16250 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20  ED_FIRST +.     
16260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16270 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72      pInode->shar
16280 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29  edByte, 1, 0)) )
16290 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 61  {.        int fa
162a0 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f  iled2 = SQLITE_O
162b0 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  K;.        /* no
162c0 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65  w attemmpt to ge
162d0 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
162e0 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20  lock range */.  
162f0 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
16300 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
16310 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16320 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
16330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16350 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b  SHARED_SIZE, 1);
16360 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 61 69  .        if( fai
16370 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64 32 20  led && (failed2 
16380 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16390 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
163a0 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ile, .          
163b0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
163c0 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f  RED_FIRST + pIno
163d0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
163e0 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20  1, 1)) ){.      
163f0 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65      /* Can't ree
16400 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
16410 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74  red lock.  Sqlit
16420 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68  e can't deal, th
16430 69 73 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  is is.          
16440 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f  ** a critical I/
16450 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  O error.        
16460 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
16470 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53  c = ((failed & S
16480 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
16490 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20  SQLITE_IOERR) ? 
164a0 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20  failed2 : .     
164b0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
164c0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
164d0 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f         goto afp_
164e0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  end_lock;.      
164f0 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65    } .      }else
16500 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
16510 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a  ailed; .      }.
16520 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61      }.    if( fa
16530 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
16540 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d   = failed;.    }
16550 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
16560 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16570 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
16580 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
16590 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
165a0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
165b0 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ck;.  }else if( 
165c0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
165d0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
165e0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
165f0 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
16600 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
16610 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
16620 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61  G_LOCK;.  }.  .a
16630 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  fp_end_lock:.  u
16640 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
16650 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
16660 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 61  K    %d %s %s (a
16670 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
16680 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
16690 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
166a0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
166b0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
166c0 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
166d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
166e0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
166f0 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
16700 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
16710 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
16720 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
16730 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
16740 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
16750 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
16760 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
16770 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
16780 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
16790 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
167a0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
167b0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
167c0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
167d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
167e0 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  afpUnlock(sqlite
167f0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
16800 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69  eFileLock) {.  i
16810 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16820 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
16830 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
16840 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
16850 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
16860 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
16870 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
16880 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
16890 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
168a0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
168b0 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b   skipShared = 0;
168c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
168d0 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46  EST.  int h = pF
168e0 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a  ile->h;.#endif..
168f0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
16900 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
16910 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
16920 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
16930 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
16940 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
16950 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
16960 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
16970 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
16980 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
16990 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
169a0 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70 69             getpi
169b0 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  d()));..  assert
169c0 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
169d0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RED_LOCK );.  if
169e0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
169f0 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck<=eFileLock ){
16a00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16a10 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
16a20 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
16a30 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
16a40 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
16a50 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
16a60 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
16a70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
16a80 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
16a90 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
16aa0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46  e->eFileLock==pF
16ab0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
16ac0 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
16ad0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
16ae0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
16af0 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
16b00 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
16b10 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
16b20 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
16b30 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75      /* When redu
16b40 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68  cing a lock such
16b50 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63   that other proc
16b60 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a  esses can start.
16b70 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74      ** reading t
16b80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16b90 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72   again, make sur
16ba0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
16bb0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
16bc0 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
16bd0 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  d if any part of
16be0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
16bf0 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65    ** file change
16c00 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73  d.  If the trans
16c10 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
16c20 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20  s not updated,. 
16c30 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
16c40 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73  ections to the s
16c50 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e  ame file might n
16c60 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a  ot realize that.
16c70 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20      ** the file 
16c80 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20  has changed and 
16c90 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20  hence might not 
16ca0 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68  know to flush th
16cb0 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  eir.    ** cache
16cc0 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20  .  The use of a 
16cd0 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20  stale cache can 
16ce0 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
16cf0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
16d00 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
16d10 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
16d20 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  rite==0.        
16d30 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55     || pFile->dbU
16d40 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  pdate==0.       
16d50 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72      || pFile->tr
16d60 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29  ansCntrChng==1 )
16d70 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  ;.    pFile->inN
16d80 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a  ormalWrite = 0;.
16d90 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20  #endif.    .    
16da0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
16db0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
16dc0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
16dd0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
16de0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
16df0 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
16e00 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c  ST, SHARED_SIZE,
16e10 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
16e20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
16e30 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
16e40 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
16e50 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20 29 7b  e->nShared>1) ){
16e60 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79  .        /* only
16e70 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68   re-establish th
16e80 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66  e shared lock if
16e90 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
16ea0 20 20 20 20 20 20 69 6e 74 20 73 68 61 72 65 64        int shared
16eb0 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45  LockByte = SHARE
16ec0 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
16ed0 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20  sharedByte;.    
16ee0 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
16ef0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16f00 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72  ath, pFile, shar
16f10 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31  edLockByte, 1, 1
16f20 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  );.      } else 
16f30 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70 53 68  {.        skipSh
16f40 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ared = 1;.      
16f50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
16f60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
16f70 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16f80 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
16f90 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
16fa0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16fb0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16fc0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
16fd0 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20  , 0);.    } .   
16fe0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16ff0 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  OK && pFile->eFi
17000 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  leLock>=RESERVED
17010 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78 74  _LOCK && context
17020 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20  ->reserved ){.  
17030 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
17040 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17050 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
17060 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
17070 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  ;.      if( !rc 
17080 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ){ .        cont
17090 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  ext->reserved = 
170a0 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0; .      }.    
170b0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
170c0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
170d0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
170e0 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
170f0 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20 20 20  hared>1)){.     
17100 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
17110 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
17120 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
17130 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17140 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  && eFileLock==NO
17150 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a  _LOCK ){..    /*
17160 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
17170 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
17180 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
17190 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
171a0 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
171b0 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
171c0 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
171d0 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
171e0 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
171f0 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
17200 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67     unsigned long
17210 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b   long sharedLock
17220 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49  Byte = SHARED_FI
17230 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
17240 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f  edByte;.    pIno
17250 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20  de->nShared--;. 
17260 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
17270 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Shared==0 ){.   
17280 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
17290 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
172a0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
172b0 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20  or( h=(-1) ).   
172c0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
172d0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
172e0 20 20 20 69 66 28 20 21 73 6b 69 70 53 68 61 72     if( !skipShar
172f0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ed ){.        rc
17300 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
17310 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
17320 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b  File, sharedLock
17330 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Byte, 1, 0);.   
17340 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
17350 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  rc ){.        pI
17360 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
17370 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
17380 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
17390 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
173a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
173b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
173c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  OK ){.      pIno
173d0 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20  de->nLock--;.   
173e0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
173f0 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
17400 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
17410 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
17420 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e       closePendin
17430 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20  gFds(pFile);.   
17440 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
17450 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
17460 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex();.  if( rc==
17470 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c  SQLITE_OK ) pFil
17480 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
17490 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
174a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
174b0 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63  Close a file & c
174c0 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63 69  leanup AFP speci
174d0 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  fic locking cont
174e0 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ext .*/.static i
174f0 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c 69  nt afpClose(sqli
17500 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
17510 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17520 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29  E_OK;.  if( id )
17530 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
17540 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
17550 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55 6e  e*)id;.    afpUn
17560 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
17570 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
17580 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28  Mutex();.    if(
17590 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26   pFile->pInode &
175a0 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  & pFile->pInode-
175b0 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  >nLock ){.      
175c0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
175d0 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
175e0 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c  s, do not actual
175f0 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ly close the fil
17600 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  e just.      ** 
17610 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74  yet because that
17620 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f   would clear tho
17630 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65  se locks.  Inste
17640 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65  ad, add the file
17650 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69  .      ** descri
17660 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e  ptor to pInode->
17670 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69  aPending.  It wi
17680 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
17690 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a  lly closed when.
176a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73        ** the las
176b0 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
176c0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
176d0 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
176e0 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  File);.    }.   
176f0 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
17700 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 73 71  o(pFile);.    sq
17710 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
17720 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
17730 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73  );.    rc = clos
17740 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
17750 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
17760 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  x();.  }.  retur
17770 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
17780 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
17790 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
177a0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
177b0 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
177c0 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
177d0 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
177e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
177f0 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
17800 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
17810 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
17820 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
17830 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
17840 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
17850 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20   available.  If 
17860 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c  you don't compil
17870 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65  e for a mac, the
17880 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22  n the "unix-afp"
17890 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61  .** VFS is not a
178a0 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a  vailable..**.***
178b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178c0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46  ** End of the AF
178d0 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  P lock implement
178e0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
178f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
17900 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 2a  ***********/../*
17950 2a 2a 2a 2a 2a 2a 2a 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 0a 2a 2a  *************.**
179a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
179c0 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  NFS Locking ****
179d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23  ************/..#
179f0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
17a00 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
17a10 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
17a20 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65  TYLE./*. ** Lowe
17a30 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
17a40 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
17a50 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
17a60 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
17a70 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62  eLock. ** must b
17a80 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
17a90 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
17aa0 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20  . **. ** If the 
17ab0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
17ac0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
17ad0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
17ae0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20  at or below. ** 
17af0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
17b00 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
17b10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
17b20 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  o-op.. */.static
17b30 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73   int nfsUnlock(s
17b40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
17b50 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
17b60 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55  .  return posixU
17b70 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c  nlock(id, eFileL
17b80 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64  ock, 1);.}..#end
17b90 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
17ba0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
17bb0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
17bc0 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
17bd0 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
17be0 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20  is the NFS lock 
17bf0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
17c00 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
17c10 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
17c20 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
17c30 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
17c40 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
17c50 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
17c60 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
17c70 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
17c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
17c90 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d   the NFS lock im
17ca0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
17cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17cc0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
17cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d10 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
17d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d60 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
17d70 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e  ***** Non-lockin
17d80 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  g sqlite3_file m
17d90 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
17da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17db0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ****.**.** The n
17dc0 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  ext division con
17dd0 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61  tains implementa
17de0 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65  tions for all me
17df0 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a  thods of the .**
17e00 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62   sqlite3_file ob
17e10 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20  ject other than 
17e20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  the locking meth
17e30 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ods.  The lockin
17e40 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72  g.** methods wer
17e50 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76  e defined in div
17e60 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e  isions above (on
17e70 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
17e80 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e   per.** division
17e90 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64  ).  Those method
17ea0 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f  s that are commo
17eb0 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67  n to all locking
17ec0 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61   modes.** are ga
17ed0 74 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e  ther together in
17ee0 74 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e  to this division
17ef0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  ..*/../*.** Seek
17f00 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70   to the offset p
17f10 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
17f20 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68  ond argument, th
17f30 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20  en read cnt .** 
17f40 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
17f50 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
17f60 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
17f70 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ally read..**.**
17f80 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66   NB:  If you def
17f90 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72  ine USE_PREAD or
17fa0 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68   USE_PREAD64, th
17fb0 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f  en it might also
17fc0 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79  .** be necessary
17fd0 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45   to define _XOPE
17fe0 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35  N_SOURCE to be 5
17ff0 30 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73  00.  This varies
18000 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73   from.** one sys
18010 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20  tem to another. 
18020 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f   Since SQLite do
18030 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53  es not define US
18040 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61  E_PREAD.** any a
18050 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75  ny form by defau
18060 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20  lt, we will not 
18070 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e  attempt to defin
18080 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e  e _XOPEN_SOURCE.
18090 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20  .** See tickets 
180a0 23 32 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e  #2741 and #2681.
180b0 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
180c0 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72  stomping the err
180d0 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61  no value on a fa
180e0 69 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c 61  iled read the la
180f0 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a  stErrno value.**
18100 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72   is set before r
18110 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
18120 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52  tic int seekAndR
18130 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64  ead(unixFile *id
18140 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
18150 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42  offset, void *pB
18160 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  uf, int cnt){.  
18170 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70  int got;.  int p
18180 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21  rior = 0;.#if (!
18190 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
181a0 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55  D) && !defined(U
181b0 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69  SE_PREAD64)).  i
181c0 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65  64 newOffset;.#e
181d0 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41  ndif.  TIMER_STA
181e0 52 54 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65  RT;.  do{.#if de
181f0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
18200 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65  .    got = osPre
18210 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
18220 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  cnt, offset);.  
18230 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
18240 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
18250 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
18260 5f 50 52 45 41 44 36 34 29 0a 20 20 20 20 67 6f  _PREAD64).    go
18270 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64  t = osPread64(id
18280 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
18290 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d  offset);.    Sim
182a0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
182b0 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a  t = -1 );.#else.
182c0 20 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20      newOffset = 
182d0 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66  lseek(id->h, off
182e0 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  set, SEEK_SET);.
182f0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
18300 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d  ror( newOffset--
18310 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f   );.    if( newO
18320 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b  ffset!=offset ){
18330 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4f 66  .      if( newOf
18340 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  fset == -1 ){.  
18350 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
18360 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
18370 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
18380 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 28  }else{.        (
18390 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
183a0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09  lastErrno = 0;..
183b0 09 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ..      }.      
183c0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
183d0 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 52 65 61  .    got = osRea
183e0 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
183f0 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nt);.#endif.    
18400 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62  if( got==cnt ) b
18410 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f  reak;.    if( go
18420 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  t<0 ){.      if(
18430 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b   errno==EINTR ){
18440 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e   got = 1; contin
18450 75 65 3b 20 7d 0a 20 20 20 20 20 20 70 72 69 6f  ue; }.      prio
18460 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 28 28 75  r = 0;.      ((u
18470 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
18480 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
18490 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
184a0 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e    }else if( got>
184b0 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d  0 ){.      cnt -
184c0 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66  = got;.      off
184d0 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20  set += got;.    
184e0 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a    prior += got;.
184f0 20 20 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f        pBuf = (vo
18500 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72  id*)(got + (char
18510 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20  *)pBuf);.    }. 
18520 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29   }while( got>0 )
18530 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  ;.  TIMER_END;. 
18540 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
18550 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
18560 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20  d %llu\n",.     
18570 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f         id->h, go
18580 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d  t+prior, offset-
18590 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41  prior, TIMER_ELA
185a0 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e  PSED));.  return
185b0 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f   got+prior;.}../
185c0 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
185d0 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
185e0 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
185f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
18600 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
18610 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
18620 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
18630 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
18640 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
18650 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
18660 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  xRead(.  sqlite3
18670 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f  _file *id, .  vo
18680 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
18690 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
186a0 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a  int64 offset.){.
186b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
186c0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
186d0 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  id;.  int got;. 
186e0 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 0a   assert( id );..
186f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
18700 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
18710 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
18720 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
18730 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
18740 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
18750 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
18760 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
18770 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
18780 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
18790 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
187a0 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
187b0 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
187c0 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
187d0 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
187e0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
187f0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f   );.#endif..  go
18800 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  t = seekAndRead(
18810 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70  pFile, offset, p
18820 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28  Buf, amt);.  if(
18830 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20   got==amt ){.   
18840 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18850 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67  K;.  }else if( g
18860 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  ot<0 ){.    /* l
18870 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
18880 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20  seekAndRead */. 
18890 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
188a0 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d  _IOERR_READ;.  }
188b0 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
188c0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20  >lastErrno = 0; 
188d0 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20  /* not a system 
188e0 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20  error */.    /* 
188f0 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
18900 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
18910 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
18920 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
18930 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d  char*)pBuf)[got]
18940 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20  , 0, amt-got);. 
18950 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18960 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
18970 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
18980 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
18990 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74  et in id->offset
189a0 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62   then read cnt b
189b0 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a  ytes into pBuf..
189c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
189d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
189e0 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70  tually read.  Up
189f0 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e  date the offset.
18a00 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
18a10 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72  stomping the err
18a20 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61  no value on a fa
18a30 69 6c 65 64 20 77 72 69 74 65 20 74 68 65 20 6c  iled write the l
18a40 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
18a50 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
18a60 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
18a70 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
18a80 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a  Write(unixFile *
18a90 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  id, i64 offset, 
18aa0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
18ab0 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
18ac0 74 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66  t got;.#if (!def
18ad0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20  ined(USE_PREAD) 
18ae0 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f  && !defined(USE_
18af0 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20  PREAD64)).  i64 
18b00 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69  newOffset;.#endi
18b10 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b  f.  TIMER_START;
18b20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
18b30 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 67 6f  _PREAD).  do{ go
18b40 74 20 3d 20 6f 73 50 77 72 69 74 65 28 69 64 2d  t = osPwrite(id-
18b50 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
18b60 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65 28 20  ffset); }while( 
18b70 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
18b80 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64  EINTR );.#elif d
18b90 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
18ba0 36 34 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20  64).  do{ got = 
18bb0 6f 73 50 77 72 69 74 65 36 34 28 69 64 2d 3e 68  osPwrite64(id->h
18bc0 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
18bd0 73 65 74 29 3b 7d 77 68 69 6c 65 28 20 67 6f 74  set);}while( got
18be0 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
18bf0 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b  TR);.#else.  do{
18c00 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d  .    newOffset =
18c10 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66   lseek(id->h, of
18c20 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
18c30 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
18c40 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d  rror( newOffset-
18c50 2d 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77  - );.    if( new
18c60 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29  Offset!=offset )
18c70 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4f  {.      if( newO
18c80 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20  ffset == -1 ){. 
18c90 20 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c         ((unixFil
18ca0 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
18cb0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
18cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18cd0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
18ce0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09  >lastErrno = 0;.
18cf0 09 09 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ...      }.     
18d00 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
18d10 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 57 72  }.    got = osWr
18d20 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ite(id->h, pBuf,
18d30 20 63 6e 74 29 3b 0a 20 20 7d 77 68 69 6c 65 28   cnt);.  }while(
18d40 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d   got<0 && errno=
18d50 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66  =EINTR );.#endif
18d60 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
18d70 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
18d80 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
18d90 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
18da0 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  rno;.  }..  OSTR
18db0 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25 2d  ACE(("WRITE   %-
18dc0 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
18dd0 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74  u\n", id->h, got
18de0 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f  , offset, TIMER_
18df0 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74  ELAPSED));.  ret
18e00 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  urn got;.}.../*.
18e10 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72  ** Write data fr
18e20 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f  om a buffer into
18e30 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e   a file.  Return
18e40 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
18e50 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65  ccess.** or some
18e60 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
18e70 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  e on failure..*/
18e80 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
18e90 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33  Write(.  sqlite3
18ea0 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f  _file *id, .  co
18eb0 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
18ec0 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
18ed0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
18ee0 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  et .){.  unixFil
18ef0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
18f00 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
18f10 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73  wrote = 0;.  ass
18f20 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73  ert( id );.  ass
18f30 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20  ert( amt>0 );.. 
18f40 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
18f50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
18f60 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d  not a journal, m
18f70 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72  aster-journal or
18f80 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29   temp.  ** file)
18f90 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  , the bytes in t
18fa0 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65  he locking range
18fb0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
18fc0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
18fd0 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73  . */.#if 0.  ass
18fe0 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75  ert( pFile->pUnu
18ff0 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  sed==0.       ||
19000 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47   offset>=PENDING
19010 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20  _BYTE+512.      
19020 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d   || offset+amt<=
19030 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20  PENDING_BYTE .  
19040 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  );.#endif..#ifnd
19050 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
19060 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
19070 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f   normal write to
19080 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
19090 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a   (as opposed to.
190a0 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74    ** doing a hot
190b0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
190c0 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20  k or a write to 
190d0 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20  some file other 
190e0 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d  than a.  ** norm
190f0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
19100 29 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68  ) then record th
19110 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20  e fact that the 
19120 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61  database.  ** ha
19130 73 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  s changed.  If t
19140 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
19150 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69  ounter is modifi
19160 65 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a  ed, record that.
19170 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20    ** fact too.. 
19180 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
19190 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29  >inNormalWrite )
191a0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55  {.    pFile->dbU
191b0 70 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54  pdate = 1;  /* T
191c0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
191d0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f  been modified */
191e0 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c  .    if( offset<
191f0 3d 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d  =24 && offset+am
19200 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69  t>=27 ){.      i
19210 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61  nt rc;.      cha
19220 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20  r oldCntr[4];.  
19230 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
19240 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
19250 20 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64      rc = seekAnd
19260 52 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20  Read(pFile, 24, 
19270 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20  oldCntr, 4);.   
19280 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
19290 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
192a0 20 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20     if( rc!=4 || 
192b0 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20  memcmp(oldCntr, 
192c0 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32  &((char*)pBuf)[2
192d0 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30  4-offset], 4)!=0
192e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
192f0 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
19300 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72   = 1;  /* The tr
19310 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
19320 72 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f  r has changed */
19330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19340 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69   }.#endif..  whi
19350 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72  le( amt>0 && (wr
19360 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ote = seekAndWri
19370 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  te(pFile, offset
19380 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20  , pBuf, amt))>0 
19390 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72  ){.    amt -= wr
193a0 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ote;.    offset 
193b0 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42  += wrote;.    pB
193c0 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42  uf = &((char*)pB
193d0 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a  uf)[wrote];.  }.
193e0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
193f0 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20  r(( wrote=(-1), 
19400 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75  amt=1 ));.  Simu
19410 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
19420 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74  r(( wrote=0, amt
19430 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d  =1 ));..  if( am
19440 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77  t>0 ){.    if( w
19450 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d  rote<0 && pFile-
19460 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53  >lastErrno!=ENOS
19470 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c  PC ){.      /* l
19480 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
19490 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
194a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
194b0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
194c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
194d0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
194e0 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61  no = 0; /* not a
194f0 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f   system error */
19500 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
19510 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
19520 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
19530 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
19540 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
19550 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
19560 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
19570 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
19580 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
19590 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
195a0 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
195b0 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
195c0 72 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67  rring at the rig
195d0 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74  ht times..*/.int
195e0 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
195f0 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  unt = 0;.int sql
19600 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
19610 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
19620 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74  ./*.** We do not
19630 20 74 72 75 73 74 20 73 79 73 74 65 6d 73 20 74   trust systems t
19640 6f 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b  o provide a work
19650 69 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e  ing fdatasync().
19660 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74    Some do..** Ot
19670 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20  hers do no.  To 
19680 62 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c  be safe, we will
19690 20 73 74 69 63 6b 20 77 69 74 68 20 74 68 65 20   stick with the 
196a0 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72  (slightly slower
196b0 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66  ).** fsync(). If
196c0 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79   you know that y
196d0 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20  our system does 
196e0 73 75 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e  support fdatasyn
196f0 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a  c() correctly,.*
19700 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f  * then simply co
19710 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61  mpile with -Dfda
19720 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63  tasync=fdatasync
19730 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
19740 28 66 64 61 74 61 73 79 6e 63 29 0a 23 20 64 65  (fdatasync).# de
19750 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66  fine fdatasync f
19760 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  sync.#endif../*.
19770 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46  ** Define HAVE_F
19780 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72  ULLFSYNC to 0 or
19790 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   1 depending on 
197a0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
197b0 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e  * the F_FULLFSYN
197c0 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e  C macro is defin
197d0 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43  ed.  F_FULLFSYNC
197e0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
197f0 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
19800 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75  on Mac OS X.  Bu
19810 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61  t that could cha
19820 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46  nge..*/.#ifdef F
19830 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66  _FULLFSYNC.# def
19840 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
19850 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66  NC 1.#else.# def
19860 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
19870 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  NC 0.#endif.../*
19880 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20  .** The fsync() 
19890 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73  system call does
198a0 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76   not work as adv
198b0 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a  ertised on many.
198c0 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e  ** unix systems.
198d0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
198e0 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20  procedure is an 
198f0 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a  attempt to make.
19900 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65  ** it work bette
19910 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  r..**.** The SQL
19920 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72  ITE_NO_SYNC macr
19930 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66  o disables all f
19940 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69  sync()s.  This i
19950 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  s useful.** for 
19960 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20  testing when we 
19970 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f  want to run thro
19980 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ugh the test sui
19990 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59  te quickly..** Y
199a0 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20  ou are strongly 
199b0 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f  advised *not* to
199c0 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c   deploy with SQL
199d0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65  ITE_NO_SYNC.** e
199e0 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c  nabled, however,
199f0 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49   since with SQLI
19a00 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c  TE_NO_SYNC enabl
19a10 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a  ed, an OS crash.
19a20 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
19a30 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ure will likely 
19a40 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61  corrupt the data
19a50 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
19a60 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68 65   SQLite sets the
19a70 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69   dataOnly flag i
19a80 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
19a90 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e  e file is unchan
19aa0 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61  ged..** The idea
19ab0 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79   behind dataOnly
19ac0 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f 75   is that it shou
19ad0 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68  ld only write th
19ae0 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a  e file content.*
19af0 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74  * to disk, not t
19b00 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e  he inode.  We on
19b10 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20  ly set dataOnly 
19b20 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  if the file size
19b30 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65   is .** unchange
19b40 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65  d since the file
19b50 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66   size is part of
19b60 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77   the inode.  How
19b70 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73  ever, .** Ted Ts
19b80 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74  'o tells us that
19b90 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
19ba0 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65  l also write the
19bb0 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a   inode if the.**
19bc0 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63   file size has c
19bd0 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c  hanged.  The onl
19be0 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63  y real differenc
19bf0 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61 73  e between fdatas
19c00 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79  ync().** and fsy
19c10 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20  nc(), Ted tells 
19c20 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61 74  us, is that fdat
19c30 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74  async() will not
19c40 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e   flush the.** in
19c50 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65  ode if the mtime
19c60 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68   or owner or oth
19c70 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75  er inode attribu
19c80 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64  tes have changed
19c90 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72  ..** We only car
19ca0 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  e about the file
19cb0 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f   size, not the o
19cc0 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69 62  ther file attrib
19cd0 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66  utes, so.** as f
19ce0 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73 20  ar as SQLite is 
19cf0 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64  concerned, an fd
19d00 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77  atasync() is alw
19d10 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a  ays adequate..**
19d20 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75   So, we always u
19d30 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  se fdatasync() i
19d40 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c  f it is availabl
19d50 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
19d60 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
19d70 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
19d80 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ag..*/.static in
19d90 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74  t full_fsync(int
19da0 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e   fd, int fullSyn
19db0 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29  c, int dataOnly)
19dc0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
19dd0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
19de0 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65  "ifdef/elif/else
19df0 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65  /" block has the
19e00 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65 20   same structure 
19e10 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20  as.  ** the one 
19e20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70  below. It is rep
19e30 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c  licated here sol
19e40 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75  ely to avoid clu
19e50 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70  ttering .  ** up
19e60 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77   the real code w
19e70 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50  ith the UNUSED_P
19e80 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f  ARAMETER() macro
19e90 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
19ea0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
19eb0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19ec0 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (fd);.  UNUSED_P
19ed0 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
19ee0 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
19ef0 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
19f00 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  ;.#elif HAVE_FUL
19f10 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f  LFSYNC.  UNUSED_
19f20 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
19f30 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  ly);.#else.  UNU
19f40 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
19f50 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
19f60 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
19f70 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Only);.#endif.. 
19f80 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
19f90 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
19fa0 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d  hat we do a norm
19fb0 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a  al fsync() and .
19fc0 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20    ** FULLSYNC.  
19fd0 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72  This is used dur
19fe0 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76  ing testing to v
19ff0 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
1a000 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67  procedure.  ** g
1a010 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ets called with 
1a020 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75  the correct argu
1a030 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  ments..  */.#ifd
1a040 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1a050 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20   if( fullSync ) 
1a060 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
1a070 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69  _count++;.  sqli
1a080 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
1a090 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
1a0a0 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
1a0b0 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
1a0c0 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
1a0d0 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
1a0e0 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69  ** no-op.  */.#i
1a0f0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1a100 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54  YNC.  rc = SQLIT
1a110 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45  E_OK;.#elif HAVE
1a120 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28  _FULLFSYNC.  if(
1a130 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20   fullSync ){.   
1a140 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64   rc = osFcntl(fd
1a150 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30  , F_FULLFSYNC, 0
1a160 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a170 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a  rc = 1;.  }.  /*
1a180 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e   If the FULLFSYN
1a190 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62  C failed, fall b
1a1a0 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e  ack to attemptin
1a1b0 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20  g an fsync()..  
1a1c0 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20  ** It shouldn't 
1a1d0 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  be possible for 
1a1e0 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69  fullfsync to fai
1a1f0 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a  l on the local .
1a200 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d    ** file system
1a210 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61   (on OSX), so fa
1a220 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20  ilure indicates 
1a230 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20  that FULLFSYNC. 
1a240 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72   ** isn't suppor
1a250 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ted for this fil
1a260 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74  e system. So, at
1a270 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a  tempt an fsync .
1a280 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f    ** and (for no
1a290 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76  w) ignore the ov
1a2a0 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65  erhead of a supe
1a2b0 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61  rfluous fcntl ca
1a2c0 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20  ll.  .  ** It'd 
1a2d0 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74  be better to det
1a2e0 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75  ect fullfsync su
1a2f0 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61  pport once and a
1a300 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66  void .  ** the f
1a310 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20  cntl call every 
1a320 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c  time sync is cal
1a330 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  led..  */.  if( 
1a340 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28  rc ) rc = fsync(
1a350 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69  fd);..#elif defi
1a360 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1a370 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20   /* fdatasync() 
1a380 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20  on HFS+ doesn't 
1a390 79 65 74 20 66 6c 75 73 68 20 74 68 65 20 66 69  yet flush the fi
1a3a0 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20 63 68  le size if it ch
1a3b0 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  anged correctly.
1a3c0 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c    ** so currentl
1a3d0 79 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20  y we default to 
1a3e0 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72  the macro that r
1a3f0 65 64 65 66 69 6e 65 73 20 66 64 61 74 61 73 79  edefines fdatasy
1a400 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f  nc to fsync.  */
1a410 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64  .  rc = fsync(fd
1a420 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d  );.#else .  rc =
1a430 20 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a   fdatasync(fd);.
1a440 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
1a450 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65   if( rc==-1 && e
1a460 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b  rrno==ENOTSUP ){
1a470 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28  .    rc = fsync(
1a480 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  fd);.  }.#endif 
1a490 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
1a4a0 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66  .#endif /* ifdef
1a4b0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1a4c0 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1a4d0 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53  YNC */..  if( OS
1a4e0 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d  _VXWORKS && rc!=
1a4f0 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   -1 ){.    rc = 
1a500 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1a510 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
1a520 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
1a530 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63  tor to the direc
1a540 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1a550 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a  file zFilename..
1a560 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1a570 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  , *pFd is set to
1a580 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65   the opened file
1a590 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a   descriptor and.
1a5a0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1a5b0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
1a5c0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69  error occurs, ei
1a5d0 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ther SQLITE_NOME
1a5e0 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43  M.** or SQLITE_C
1a5f0 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72  ANTOPEN is retur
1a600 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20  ned and *pFd is 
1a610 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69  set to an undefi
1a620 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a  ned.** value..**
1a630 0a 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72  .** The director
1a640 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
1a650 72 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e  r is used for on
1a660 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74  ly one thing - t
1a670 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64  o.** fsync() a d
1a680 69 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65  irectory to make
1a690 20 73 75 72 65 20 66 69 6c 65 20 63 72 65 61 74   sure file creat
1a6a0 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ion and deletion
1a6b0 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66   events.** are f
1a6c0 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20  lushed to disk. 
1a6d0 20 53 75 63 68 20 66 73 79 6e 63 73 20 61 72 65   Such fsyncs are
1a6e0 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e   not needed on n
1a6f0 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69  ewer.** journali
1a700 6e 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20  ng filesystems, 
1a710 62 75 74 20 61 72 65 20 72 65 71 75 69 72 65 64  but are required
1a720 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79   on older filesy
1a730 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  stems..**.** Thi
1a740 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
1a750 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e   overridden usin
1a760 67 20 74 68 65 20 78 53 65 74 53 79 73 43 61 6c  g the xSetSysCal
1a770 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20  l interface..** 
1a780 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f  The ability to o
1a790 76 65 72 72 69 64 65 20 74 68 69 73 20 72 6f 75  verride this rou
1a7a0 74 69 6e 65 20 77 61 73 20 61 64 64 65 64 20 69  tine was added i
1a7b0 6e 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65  n support of the
1a7c0 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e  .** chromium san
1a7d0 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61  dbox.  Opening a
1a7e0 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 61 20   directory is a 
1a7f0 73 65 63 75 72 69 74 79 20 72 69 73 6b 20 28 77  security risk (w
1a800 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73  e are.** told) s
1a810 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72  o making it over
1a820 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20  rideable allows 
1a830 74 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e  the chromium san
1a840 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61  dbox to.** repla
1a850 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
1a860 77 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20  with a harmless 
1a870 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20  no-op.  To make 
1a880 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1a890 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65  a no-op, replace
1a8a0 20 69 74 20 77 69 74 68 20 61 20 73 74 75 62 20   it with a stub 
1a8b0 74 68 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c  that returns SQL
1a8c0 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
1a8d0 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f  s.** *pFd set to
1a8e0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
1a8f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  er..**.** If SQL
1a900 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1a910 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69  ed, the caller i
1a920 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1a930 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65  r closing.** the
1a940 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1a950 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73   *pFd using clos
1a960 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
1a970 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  nt openDirectory
1a980 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1a990 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64  lename, int *pFd
1a9a0 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69  ){.  int ii;.  i
1a9b0 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68  nt fd = -1;.  ch
1a9c0 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f  ar zDirname[MAX_
1a9d0 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20  PATHNAME+1];..  
1a9e0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1a9f0 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a  (MAX_PATHNAME, z
1aa00 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a  Dirname, "%s", z
1aa10 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  Filename);.  for
1aa20 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28  (ii=(int)strlen(
1aa30 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20  zDirname); ii>1 
1aa40 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21  && zDirname[ii]!
1aa50 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69  ='/'; ii--);.  i
1aa60 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a  f( ii>0 ){.    z
1aa70 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c  Dirname[ii] = '\
1aa80 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62  0';.    fd = rob
1aa90 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d  ust_open(zDirnam
1aaa0 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49  e, O_RDONLY|O_BI
1aab0 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  NARY, 0);.    if
1aac0 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65  ( fd>=0 ){.#ifde
1aad0 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20  f FD_CLOEXEC.   
1aae0 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46     osFcntl(fd, F
1aaf0 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28  _SETFD, osFcntl(
1ab00 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
1ab10 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
1ab20 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52  endif.      OSTR
1ab30 41 43 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d  ACE(("OPENDIR %-
1ab40 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44  3d %s\n", fd, zD
1ab50 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  irname));.    }.
1ab60 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b    }.  *pFd = fd;
1ab70 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30  .  return (fd>=0
1ab80 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c  ?SQLITE_OK:unixL
1ab90 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
1aba0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
1abb0 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29  pen", zDirname))
1abc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1abd0 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
1abe0 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
1abf0 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
1ac00 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
1ac10 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30  * If dataOnly==0
1ac20 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66   then both the f
1ac30 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69  ile itself and i
1ac40 74 73 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c  ts metadata (fil
1ac50 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73  e.** size, acces
1ac60 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65  s time, etc) are
1ac70 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74   synced.  If dat
1ac80 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e  aOnly!=0 then on
1ac90 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ly the.** file d
1aca0 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ata is synced..*
1acb0 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c  *.** Under Unix,
1acc0 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20   also make sure 
1acd0 74 68 61 74 20 74 68 65 20 64 69 72 65 63 74 6f  that the directo
1ace0 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1acf0 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65   file.** has bee
1ad00 6e 20 63 72 65 61 74 65 64 20 62 79 20 66 73 79  n created by fsy
1ad10 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63  nc-ing the direc
1ad20 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
1ad30 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20  ns the file..** 
1ad40 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20  If we do not do 
1ad50 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f  this and we enco
1ad60 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  unter a power fa
1ad70 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65 63  ilure, the direc
1ad80 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f  tory.** entry fo
1ad90 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  r the journal mi
1ada0 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66  ght not exist af
1adb0 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20  ter we reboot.  
1adc0 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69  The next.** SQLi
1add0 74 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  te to access the
1ade0 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b   file will not k
1adf0 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75  now that the jou
1ae00 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65 63  rnal exists (bec
1ae10 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65  ause.** the dire
1ae20 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
1ae30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
1ae40 6e 65 76 65 72 20 63 72 65 61 74 65 64 29 20 61  never created) a
1ae50 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
1ae60 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  on.** will not r
1ae70 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69  oll back - possi
1ae80 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64  bly leading to d
1ae90 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1aea0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1aeb0 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74  t unixSync(sqlit
1aec0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
1aed0 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72   flags){.  int r
1aee0 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  c;.  unixFile *p
1aef0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1af00 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44  *)id;..  int isD
1af10 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73  ataOnly = (flags
1af20 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  &SQLITE_SYNC_DAT
1af30 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  AONLY);.  int is
1af40 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67  Fullsync = (flag
1af50 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1af60 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a  SYNC_FULL;..  /*
1af70 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20   Check that one 
1af80 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  of SQLITE_SYNC_N
1af90 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61  ORMAL or FULL wa
1afa0 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73  s passed */.  as
1afb0 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46  sert((flags&0x0F
1afc0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  )==SQLITE_SYNC_N
1afd0 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28  ORMAL.      || (
1afe0 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1aff0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20  ITE_SYNC_FULL.  
1b000 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61  );..  /* Unix ca
1b010 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73  nnot, but some s
1b020 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72  ystems may retur
1b030 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72  n SQLITE_FULL fr
1b040 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20  om here. This.  
1b050 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65  ** line is to te
1b060 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f  st that doing so
1b070 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
1b080 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
1b090 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  */.  SimulateDis
1b0a0 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75  kfullError( retu
1b0b0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  rn SQLITE_FULL )
1b0c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
1b0d0 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
1b0e0 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e  ("SYNC    %-3d\n
1b0f0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
1b100 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63   rc = full_fsync
1b110 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c  (pFile->h, isFul
1b120 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c  lsync, isDataOnl
1b130 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  y);.  SimulateIO
1b140 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
1b150 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70   if( rc ){.    p
1b160 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1b170 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74  = errno;.    ret
1b180 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1b190 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
1b1a0 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63  YNC, "full_fsync
1b1b0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1b1c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f  ;.  }..  /* Also
1b1d0 20 66 73 79 6e 63 20 74 68 65 20 64 69 72 65 63   fsync the direc
1b1e0 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1b1f0 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 20  the file if the 
1b200 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a  DIRSYNC flag.  *
1b210 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69 73 20  * is set.  This 
1b220 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63  is a one-time oc
1b230 63 75 72 72 61 6e 63 65 2e 20 20 4d 61 6e 79 20  currance.  Many 
1b240 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c 65  systems (example
1b250 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72 65  s: AIX).  ** are
1b260 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e 63   unable to fsync
1b270 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6f   a directory, so
1b280 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f   ignore errors o
1b290 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a  n the fsync..  *
1b2a0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63  /.  if( pFile->c
1b2b0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
1b2c0 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20  ILE_DIRSYNC ){. 
1b2d0 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20 20     int dirfd;.  
1b2e0 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 52 53    OSTRACE(("DIRS
1b2f0 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75 6c  YNC %s (have_ful
1b300 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79  lfsync=%d fullsy
1b310 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  nc=%d)\n", pFile
1b320 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20 20  ->zPath,.       
1b330 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53       HAVE_FULLFS
1b340 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29  YNC, isFullsync)
1b350 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70  );.    rc = osOp
1b360 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69 6c  enDirectory(pFil
1b370 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66 64  e->zPath, &dirfd
1b380 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1b390 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 69 72 66  QLITE_OK && dirf
1b3a0 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 75  d>=0 ){.      fu
1b3b0 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20  ll_fsync(dirfd, 
1b3c0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 6f 62  0, 0);.      rob
1b3d0 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
1b3e0 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f   dirfd, __LINE__
1b3f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1b400 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
1b410 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63  OPEN ){.      rc
1b420 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b430 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63    }.    pFile->c
1b440 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49  trlFlags &= ~UNI
1b450 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20  XFILE_DIRSYNC;. 
1b460 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1b470 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
1b480 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74  e an open file t
1b490 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69  o a specified si
1b4a0 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ze.*/.static int
1b4b0 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71   unixTruncate(sq
1b4c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1b4d0 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e  i64 nByte){.  un
1b4e0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1b4f0 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
1b500 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1b510 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
1b520 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1b530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1b540 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a  ERR_TRUNCATE );.
1b550 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
1b560 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64  r has configured
1b570 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f   a chunk-size fo
1b580 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75  r this file, tru
1b590 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66  ncate the.  ** f
1b5a0 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63  ile so that it c
1b5b0 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e  onsists of an in
1b5c0 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
1b5d0 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65  chunks (i.e. the
1b5e0 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c  .  ** actual fil
1b5f0 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65  e size after the
1b600 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62   operation may b
1b610 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
1b620 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a  e requested.  **
1b630 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   size)..  */.  i
1b640 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
1b650 6b 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  k ){.    nByte =
1b660 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65   ((nByte + pFile
1b670 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70  ->szChunk - 1)/p
1b680 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a  File->szChunk) *
1b690 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b   pFile->szChunk;
1b6a0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62  .  }..  rc = rob
1b6b0 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46  ust_ftruncate(pF
1b6c0 69 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e  ile->h, (off_t)n
1b6d0 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Byte);.  if( rc 
1b6e0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
1b6f0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1b700 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
1b710 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1b720 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1b730 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1b740 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
1b750 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45  lse{.#ifndef NDE
1b760 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  BUG.    /* If we
1b770 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
1b780 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
1b790 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
1b7a0 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20   opposed to.    
1b7b0 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
1b7c0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1b7d0 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
1b7e0 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
1b7f0 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d  an a.    ** norm
1b800 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1b810 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74  ) and we truncat
1b820 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
1b830 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a  ro length,.    *
1b840 2a 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65  * that effective
1b850 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
1b860 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20  hange counter.  
1b870 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1b880 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65  n.    ** when re
1b890 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61  storing a databa
1b8a0 73 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63  se using the bac
1b8b0 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a  kup API from a z
1b8c0 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a  ero-length.    *
1b8d0 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f  * source..    */
1b8e0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
1b8f0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26  inNormalWrite &&
1b900 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
1b910 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
1b920 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20  ntrChng = 1;.   
1b930 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72   }.#endif..    r
1b940 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b950 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
1b960 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
1b970 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
1b980 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
1b990 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
1b9a0 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
1b9b0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53  ile *id, i64 *pS
1b9c0 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
1b9d0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1b9e0 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  f;.  assert( id 
1b9f0 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61  );.  rc = osFsta
1ba00 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  t(((unixFile*)id
1ba10 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53  )->h, &buf);.  S
1ba20 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1ba30 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
1ba40 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  !=0 ){.    ((uni
1ba50 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
1ba60 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1ba70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ba80 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1ba90 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66  }.  *pSize = buf
1baa0 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  .st_size;..  /* 
1bab0 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a  When opening a z
1bac0 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73  ero-size databas
1bad0 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65  e, the findInode
1bae0 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65  Info() procedure
1baf0 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73  .  ** writes a s
1bb00 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20  ingle byte into 
1bb10 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64  that file in ord
1bb20 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  er to work aroun
1bb30 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20  d a bug.  ** in 
1bb40 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66  the OS-X msdos f
1bb50 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f  ilesystem.  In o
1bb60 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72  rder to avoid pr
1bb70 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65  oblems with uppe
1bb80 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77  r.  ** layers, w
1bb90 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74  e need to report
1bba0 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20   this file size 
1bbb0 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f  as zero even tho
1bbc0 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72  ugh it is.  ** r
1bbd0 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65  eally 1.   Ticke
1bbe0 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20  t #3260..  */.  
1bbf0 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20  if( *pSize==1 ) 
1bc00 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20  *pSize = 0;...  
1bc10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bc20 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
1bc30 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1bc40 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1bc50 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a  __APPLE__)./*.**
1bc60 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f   Handler for pro
1bc70 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d  xy-locking file-
1bc80 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20  control verbs.  
1bc90 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e  Defined below in
1bca0 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67   the.** proxying
1bcb0 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f   locking divisio
1bcc0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1bcd0 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
1bce0 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  l(sqlite3_file*,
1bcf0 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64  int,void*);.#end
1bd00 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  if../* .** This 
1bd10 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1bd20 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
1bd30 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
1bd40 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65  ZE_HINT .** file
1bd50 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69  -control operati
1bd60 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65  on.  Enlarge the
1bd70 20 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42 79   database to nBy
1bd80 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28  tes in size.** (
1bd90 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68  rounded up to th
1bda0 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a  e next chunk-siz
1bdb0 65 29 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  e).  If the data
1bdc0 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 0a  base is already.
1bdd0 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72  ** nBytes or lar
1bde0 67 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ger, this routin
1bdf0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
1be00 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74  .static int fcnt
1be10 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69  lSizeHint(unixFi
1be20 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e  le *pFile, i64 n
1be30 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69  Byte){.  if( pFi
1be40 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
1be50 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20  .    i64 nSize; 
1be60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be70 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66     /* Required f
1be80 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
1be90 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
1bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1beb0 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65   Used to hold re
1bec0 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66  turn values of f
1bed0 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20  stat() */.   .  
1bee0 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46    if( osFstat(pF
1bef0 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 20  ile->h, &buf) ) 
1bf00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1bf10 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20 20  ERR_FSTAT;..    
1bf20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b  nSize = ((nByte+
1bf30 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31  pFile->szChunk-1
1bf40 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) / pFile->szChu
1bf50 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1bf60 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53  hunk;.    if( nS
1bf70 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f  ize>(i64)buf.st_
1bf80 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66  size ){..#if def
1bf90 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f  ined(HAVE_POSIX_
1bfa0 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41  FALLOCATE) && HA
1bfb0 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1bfc0 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  TE.      /* The 
1bfd0 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61  code below is ha
1bfe0 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72  ndling the retur
1bff0 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c  n value of osFal
1c000 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20 20  locate() .      
1c010 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f  ** correctly. po
1c020 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20  six_fallocate() 
1c030 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72  is defined to "r
1c040 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73  eturns zero on s
1c050 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a  uccess, .      *
1c060 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75  * or an error nu
1c070 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65  mber on  failure
1c080 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61  ". See the manpa
1c090 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  ge for details. 
1c0a0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  */.      int err
1c0b0 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
1c0c0 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c      err = osFall
1c0d0 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ocate(pFile->h, 
1c0e0 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69  buf.st_size, nSi
1c0f0 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b  ze-buf.st_size);
1c100 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65  .      }while( e
1c110 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  rr==EINTR );.   
1c120 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65 74     if( err ) ret
1c130 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1c140 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20  _WRITE;.#else.  
1c150 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53      /* If the OS
1c160 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70   does not have p
1c170 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1c180 2c 20 66 61 6b 65 20 69 74 2e 20 46 69 72 73 74  , fake it. First
1c190 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 74   use.      ** ft
1c1a0 72 75 6e 63 61 74 65 28 29 20 74 6f 20 73 65 74  runcate() to set
1c1b0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20   the file size, 
1c1c0 74 68 65 6e 20 77 72 69 74 65 20 61 20 73 69 6e  then write a sin
1c1d0 67 6c 65 20 62 79 74 65 20 74 6f 0a 20 20 20 20  gle byte to.    
1c1e0 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 62 79    ** the last by
1c1f0 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b  te in each block
1c200 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74 65   within the exte
1c210 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 69  nded region. Thi
1c220 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68  s.      ** is th
1c230 65 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75 65  e same technique
1c240 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20 74   used by glibc t
1c250 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73 69  o implement posi
1c260 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20 20  x_fallocate().  
1c270 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65 6d      ** on system
1c280 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61  s that do not ha
1c290 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63  ve a real falloc
1c2a0 61 74 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ate() system cal
1c2b0 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
1c2c0 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66    int nBlk = buf
1c2d0 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a  .st_blksize;  /*
1c2e0 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f   File-system blo
1c2f0 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ck size */.     
1c300 20 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20   i64 iWrite;    
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c320 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77  Next offset to w
1c330 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20  rite to */..    
1c340 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
1c350 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
1c360 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20   nSize) ){.     
1c370 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1c380 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1c390 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
1c3a0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1c3b0 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1c3c0 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1c3d0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
1c3e0 20 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74 65    }.      iWrite
1c3f0 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65   = ((buf.st_size
1c400 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e   + 2*nBlk - 1)/n
1c410 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20  Blk)*nBlk-1;.   
1c420 20 20 20 77 68 69 6c 65 28 20 69 57 72 69 74 65     while( iWrite
1c430 3c 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  <nSize ){.      
1c440 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 73    int nWrite = s
1c450 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c  eekAndWrite(pFil
1c460 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31  e, iWrite, "", 1
1c470 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1c480 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72  Write!=1 ) retur
1c490 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1c4a0 52 49 54 45 3b 0a 20 20 20 20 20 20 20 20 69 57  RITE;.        iW
1c4b0 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20  rite += nBlk;.  
1c4c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1c4d0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1c4e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1c4f0 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  *.** Information
1c500 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20   and control of 
1c510 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e  an open file han
1c520 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
1c530 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72  nt unixFileContr
1c540 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
1c550 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  *id, int op, voi
1c560 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69 78  d *pArg){.  unix
1c570 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1c580 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
1c590 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
1c5a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1c5b0 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
1c5c0 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
1c5d0 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  g = pFile->eFile
1c5e0 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75  Lock;.      retu
1c5f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1c600 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1c610 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20  ITE_LAST_ERRNO: 
1c620 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1c630 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73  Arg = pFile->las
1c640 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65  tErrno;.      re
1c650 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c660 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1c670 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e  QLITE_FCNTL_CHUN
1c680 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  K_SIZE: {.      
1c690 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d  pFile->szChunk =
1c6a0 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20   *(int *)pArg;. 
1c6b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1c6c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1c6d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1c6e0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a  TL_SIZE_HINT: {.
1c6f0 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
1c700 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1c710 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
1c720 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 53 69      rc = fcntlSi
1c730 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28  zeHint(pFile, *(
1c740 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20  i64 *)pArg);.   
1c750 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1c760 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
1c770 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c780 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1c790 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53  ITE_FCNTL_PERSIS
1c7a0 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 69  T_WAL: {.      i
1c7b0 6e 74 20 62 50 65 72 73 69 73 74 20 3d 20 2a 28  nt bPersist = *(
1c7c0 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  int*)pArg;.     
1c7d0 20 69 66 28 20 62 50 65 72 73 69 73 74 3c 30 20   if( bPersist<0 
1c7e0 29 7b 0a 20 20 20 20 20 20 20 20 2a 28 69 6e 74  ){.        *(int
1c7f0 2a 29 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d  *)pArg = (pFile-
1c800 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
1c810 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  XFILE_PERSIST_WA
1c820 4c 29 21 3d 30 3b 0a 20 20 20 20 20 20 7d 65 6c  L)!=0;.      }el
1c830 73 65 20 69 66 28 20 62 50 65 72 73 69 73 74 3d  se if( bPersist=
1c840 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
1c850 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
1c860 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 50 45 52 53  = ~UNIXFILE_PERS
1c870 49 53 54 5f 57 41 4c 3b 0a 20 20 20 20 20 20 7d  IST_WAL;.      }
1c880 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
1c890 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
1c8a0 3d 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49  = UNIXFILE_PERSI
1c8b0 53 54 5f 57 41 4c 3b 0a 20 20 20 20 20 20 7d 0a  ST_WAL;.      }.
1c8c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c8d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69  ITE_OK;.    }.#i
1c8e0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
1c8f0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
1c900 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20  lls this method 
1c910 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69  to signal that i
1c920 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a  t has done.    *
1c930 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  * a rollback and
1c940 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1c950 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  se is therefore 
1c960 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20  unchanged and.  
1c970 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74    ** it hence it
1c980 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74   is OK for the t
1c990 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67  ransaction chang
1c9a0 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a  e counter to be.
1c9b0 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64      ** unchanged
1c9c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1c9d0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  e SQLITE_FCNTL_D
1c9e0 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20  B_UNCHANGED: {. 
1c9f0 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
1ca00 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d  )id)->dbUpdate =
1ca10 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1ca20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ca30 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  }.#endif.#if SQL
1ca40 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1ca50 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1ca60 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1ca70 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
1ca80 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
1ca90 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
1caa0 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
1cab0 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ILE: {.      ret
1cac0 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  urn proxyFileCon
1cad0 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29  trol(id,op,pArg)
1cae0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1caf0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
1cb00 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1cb10 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1cb20 5f 5f 29 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  __) */.    case 
1cb30 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e  SQLITE_FCNTL_SYN
1cb40 43 5f 4f 4d 49 54 54 45 44 3a 20 7b 0a 20 20 20  C_OMITTED: {.   
1cb50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1cb60 5f 4f 4b 3b 20 20 2f 2a 20 41 20 6e 6f 2d 6f 70  _OK;  /* A no-op
1cb70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
1cb80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1cb90 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TFOUND;.}../*.**
1cba0 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
1cbb0 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or size in bytes
1cbc0 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
1cbd0 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20  ng block device 
1cbe0 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  for.** the speci
1cbf0 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20  fied file. This 
1cc00 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
1cc10 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20   512 bytes, but 
1cc20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72  may be.** larger
1cc30 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65   for some device
1cc40 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
1cc50 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69  code assumes thi
1cc60 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  s function canno
1cc70 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20  t fail. It also 
1cc80 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20  assumes that.** 
1cc90 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65  if two files are
1cca0 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
1ccb0 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d  same file-system
1ccc0 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
1ccd0 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
1cce0 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  nd its journal f
1ccf0 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
1cd00 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
1cd10 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
1cd20 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
1cd30 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72  c int unixSector
1cd40 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
1cd50 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  e *NotUsed){.  U
1cd60 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1cd70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
1cd80 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rn SQLITE_DEFAUL
1cd90 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d  T_SECTOR_SIZE;.}
1cda0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1cdb0 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63  he device charac
1cdc0 74 65 72 69 73 74 69 63 73 20 66 6f 72 20 74 68  teristics for th
1cdd0 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
1cde0 61 6c 77 61 79 73 20 30 20 66 6f 72 20 75 6e 69  always 0 for uni
1cdf0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
1ce00 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
1ce10 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
1ce20 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
1ce30 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1ce40 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
1ce50 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23    return 0;.}..#
1ce60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ce70 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f  IT_WAL.../*.** O
1ce80 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
1ce90 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65  present an share
1cea0 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e  d memory buffer.
1ceb0 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75    .**.** When mu
1cec0 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61  ltiple threads a
1ced0 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ll reference the
1cee0 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c   same wal-index,
1cef0 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20   each thread.** 
1cf00 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78  has its own unix
1cf10 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  Shm object, but 
1cf20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74  they all point t
1cf30 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61  o a single insta
1cf40 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75  nce.** of this u
1cf50 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1cf60 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
1cf70 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64  ds, each wal-ind
1cf80 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  ex is opened.** 
1cf90 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72  only once per pr
1cfa0 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63  ocess..**.** Eac
1cfb0 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  h unixShmNode ob
1cfc0 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65  ject is connecte
1cfd0 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e  d to a single un
1cfe0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
1cff0 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20  ct..** We could 
1d000 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62  coalesce this ob
1d010 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e  ject into unixIn
1d020 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61  odeInfo, but tha
1d030 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20  t would mean.** 
1d040 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20  every open file 
1d050 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73  that does not us
1d060 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
1d070 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (in other words,
1d080 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69   most.** open fi
1d090 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20  les) would have 
1d0a0 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20  to carry around 
1d0b0 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72  this extra infor
1d0c0 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74  mation.  So.** t
1d0d0 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
1d0e0 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
1d0f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1d100 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  is unixShmNode o
1d110 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65  bject.** and the
1d120 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1d130 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 6f  ect is created o
1d140 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e  nly when needed.
1d150 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78  .**.** unixMutex
1d160 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
1d170 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  rue when creatin
1d180 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a  g or destroying.
1d190 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f  ** this object o
1d1a0 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  r while reading 
1d1b0 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66  or writing the f
1d1c0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
1d1d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66  .**.**      nRef
1d1e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
1d1f0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
1d200 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20  read-only after 
1d210 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72  the object is cr
1d220 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  eated:.** .**   
1d230 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a     fid.**      z
1d240 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45  Filename.**.** E
1d250 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ither unixShmNod
1d260 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  e.mutex must be 
1d270 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e  held or unixShmN
1d280 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a  ode.nRef==0 and.
1d290 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  ** unixMutexHeld
1d2a0 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20  () is true when 
1d2b0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
1d2c0 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65  ng any other fie
1d2d0 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74  ld.** in this st
1d2e0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
1d2f0 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b  ct unixShmNode {
1d300 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
1d310 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a   *pInode;     /*
1d320 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74   unixInodeInfo t
1d330 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48  hat owns this SH
1d340 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  M node */.  sqli
1d350 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
1d360 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  ;      /* Mutex 
1d370 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
1d380 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
1d390 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
1d3a0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1d3b0 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c   the mmapped fil
1d3c0 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20  e */.  int h;   
1d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3e0 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
1d3f0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69  escriptor */.  i
1d400 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20  nt szRegion;    
1d410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1d420 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  e of shared-memo
1d430 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  ry regions */.  
1d440 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20  u16 nRegion;    
1d450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1d460 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65  ze of array apRe
1d470 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52  gion */.  u8 isR
1d480 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadonly;        
1d490 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1d4a0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63  read-only */.  c
1d4b0 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20  har **apRegion; 
1d4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
1d4d0 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61  ay of mapped sha
1d4e0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1d4f0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ns */.  int nRef
1d500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d510 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d520 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20  unixShm objects 
1d530 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
1d540 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1d550 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
1d560 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20   /* All unixShm 
1d570 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
1d580 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64   to this */.#ifd
1d590 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1d5a0 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20    u8 exclMask;  
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d5c0 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
1d5d0 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
1d5e0 20 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b    u8 sharedMask;
1d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d600 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c  Mask of shared l
1d610 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
1d620 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20  8 nextShmId;    
1d630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
1d640 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78  t available unix
1d650 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a  Shm.id value */.
1d660 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
1d670 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20   Structure used 
1d680 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68  internally by th
1d690 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64  is VFS to record
1d6a0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e   the state of an
1d6b0 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20  .** open shared 
1d6c0 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f  memory connectio
1d6d0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  n..**.** The fol
1d6e0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
1d6f0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  e initialized wh
1d700 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  en this object i
1d710 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  s created and.**
1d720 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74   are read-only t
1d730 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a  hereafter:.**.**
1d740 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c      unixShm.pFil
1d750 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e  e.**    unixShm.
1d760 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68  id.**.** All oth
1d770 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  er fields are re
1d780 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75  ad/write.  The u
1d790 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75  nixShm.pFile->mu
1d7a0 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
1d7b0 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73  .** while access
1d7c0 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69  ing any read/wri
1d7d0 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74  te fields..*/.st
1d7e0 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20  ruct unixShm {. 
1d7f0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
1d800 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54  hmNode;     /* T
1d810 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e  he underlying un
1d820 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
1d830 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1d840 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
1d850 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d   /* Next unixShm
1d860 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 75   with the same u
1d870 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
1d880 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20  u8 hasMutex;    
1d890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1d8a0 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68  ue if holding th
1d8b0 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75  e unixShmNode mu
1d8c0 74 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20  tex */.  u8 id; 
1d8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8e0 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69      /* Id of thi
1d8f0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  s connection wit
1d900 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e  hin its unixShmN
1d910 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61  ode */.  u16 sha
1d920 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  redMask;        
1d930 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
1d940 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
1d950 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61   */.  u16 exclMa
1d960 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1d970 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
1d980 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
1d990 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
1d9a0 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72  nstants used for
1d9b0 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66   locking.*/.#def
1d9c0 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53  ine UNIX_SHM_BAS
1d9d0 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f  E   ((22+SQLITE_
1d9e0 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20  SHM_NLOCK)*4)   
1d9f0 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c        /* first l
1da00 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66  ock byte */.#def
1da10 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  ine UNIX_SHM_DMS
1da20 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41      (UNIX_SHM_BA
1da30 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  SE+SQLITE_SHM_NL
1da40 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e  OCK)  /* deadman
1da50 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a   switch */../*.*
1da60 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64  * Apply posix ad
1da70 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72  visory locks for
1da80 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20   all bytes from 
1da90 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73  ofst through ofs
1daa0 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63  t+n-1..**.** Loc
1dab0 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20  ks block if the 
1dac0 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20  mask is exactly 
1dad0 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61  UNIX_SHM_C and a
1dae0 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a  re non-blocking.
1daf0 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ** otherwise..*/
1db00 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1db10 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20  ShmSystemLock(. 
1db20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
1db30 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79  hmNode, /* Apply
1db40 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f   locks to this o
1db50 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  pen shared-memor
1db60 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69  y segment */.  i
1db70 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20  nt lockType,    
1db80 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b        /* F_UNLCK
1db90 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f  , F_RDLCK, or F_
1dba0 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f  WRLCK */.  int o
1dbb0 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  fst,            
1dbc0 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
1dbd0 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  of the locking r
1dbe0 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20  ange */.  int n 
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1dc10 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29  tes to lock */.)
1dc20 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  {.  struct flock
1dc30 20 66 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65   f;       /* The
1dc40 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
1dc50 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
1dc60 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
1dc70 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
1dc80 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d  Result code form
1dc90 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f   fcntl() */..  /
1dca0 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20  * Access to the 
1dcb0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1dcc0 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64  ct is serialized
1dcd0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a   by the caller *
1dce0 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
1dcf0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1dd00 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20  ShmNode->mutex) 
1dd10 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
1dd20 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68  f==0 );..  /* Sh
1dd30 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72  ared locks never
1dd40 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20   span more than 
1dd50 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73  one byte */.  as
1dd60 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f  sert( n==1 || lo
1dd70 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20  ckType!=F_RDLCK 
1dd80 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61  );..  /* Locks a
1dd90 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20  re within range 
1dda0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  */.  assert( n>=
1ddb0 31 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48  1 && n<SQLITE_SH
1ddc0 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  M_NLOCK );..  if
1ddd0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
1dde0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69   ){.    /* Initi
1ddf0 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e  alize the lockin
1de00 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
1de10 20 20 20 20 6d 65 6d 73 65 74 28 26 66 2c 20 30      memset(&f, 0
1de20 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20  , sizeof(f));.  
1de30 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63    f.l_type = loc
1de40 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77  kType;.    f.l_w
1de50 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
1de60 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74 20  ;.    f.l_start 
1de70 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f  = ofst;.    f.l_
1de80 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72 63  len = n;..    rc
1de90 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e   = osFcntl(pShmN
1dea0 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ode->h, F_SETLK,
1deb0 20 26 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 28   &f);.    rc = (
1dec0 72 63 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49  rc!=(-1)) ? SQLI
1ded0 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42  TE_OK : SQLITE_B
1dee0 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  USY;.  }..  /* U
1def0 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c  pdate the global
1df00 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20   lock state and 
1df10 64 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e 67  do debug tracing
1df20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1df30 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20  E_DEBUG.  { u16 
1df40 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28  mask;.  OSTRACE(
1df50 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a  ("SHM-LOCK "));.
1df60 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66    mask = (1<<(of
1df70 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73  st+n)) - (1<<ofs
1df80 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
1df90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1dfa0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55  f( lockType==F_U
1dfb0 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  NLCK ){.      OS
1dfc0 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25  TRACE(("unlock %
1dfd0 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20  d ok", ofst));. 
1dfe0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65       pShmNode->e
1dff0 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
1e000 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1e010 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
1e020 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  ~mask;.    }else
1e030 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
1e040 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
1e050 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c  OSTRACE(("read-l
1e060 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
1e070 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
1e080 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20  de->exclMask &= 
1e090 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68  ~mask;.      pSh
1e0a0 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
1e0b0 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d  k |= mask;.    }
1e0c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1e0d0 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  rt( lockType==F_
1e0e0 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f  WRLCK );.      O
1e0f0 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c  STRACE(("write-l
1e100 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
1e110 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
1e120 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20  de->exclMask |= 
1e130 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
1e140 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
1e150 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
1e160 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
1e170 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e  ( lockType==F_UN
1e180 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
1e190 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64  RACE(("unlock %d
1e1a0 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29   failed", ofst))
1e1b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1e1c0 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43  lockType==F_RDLC
1e1d0 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
1e1e0 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66  CE(("read-lock f
1e1f0 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65  ailed"));.    }e
1e200 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1e210 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57  t( lockType==F_W
1e220 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53  RLCK );.      OS
1e230 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f  TRACE(("write-lo
1e240 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f  ck %d failed", o
1e250 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  fst));.    }.  }
1e260 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20  .  OSTRACE((" - 
1e270 61 66 74 65 72 77 61 72 64 73 20 25 30 33 78 2c  afterwards %03x,
1e280 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %03x\n",.       
1e290 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
1e2a0 61 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f  aredMask, pShmNo
1e2b0 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a  de->exclMask));.
1e2c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
1e2d0 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20  turn rc;        
1e2e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  .}.../*.** Purge
1e2f0 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
1e300 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c  List list of all
1e310 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e   entries with un
1e320 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  ixShmNode.nRef==
1e330 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  0..**.** This is
1e340 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65   not a VFS share
1e350 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b  d-memory method;
1e360 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79   it is a utility
1e370 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
1e380 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65  .** by VFS share
1e390 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73  d-memory methods
1e3a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e3b0 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e   unixShmPurge(un
1e3c0 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20  ixFile *pFd){.  
1e3d0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d  unixShmNode *p =
1e3e0 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53   pFd->pInode->pS
1e3f0 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  hmNode;.  assert
1e400 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
1e410 29 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  ) );.  if( p && 
1e420 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  p->nRef==0 ){.  
1e430 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73    int i;.    ass
1e440 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d  ert( p->pInode==
1e450 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  pFd->pInode );. 
1e460 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1e470 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b  _free(p->mutex);
1e480 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1e490 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29  p->nRegion; i++)
1e4a0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68  {.      if( p->h
1e4b0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  >=0 ){.        m
1e4c0 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f  unmap(p->apRegio
1e4d0 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f  n[i], p->szRegio
1e4e0 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1e4f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e500 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f  _free(p->apRegio
1e510 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n[i]);.      }. 
1e520 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1e530 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f  _free(p->apRegio
1e540 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68  n);.    if( p->h
1e550 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62  >=0 ){.      rob
1e560 75 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70  ust_close(pFd, p
1e570 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
1e580 20 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b        p->h = -1;
1e590 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49  .    }.    p->pI
1e5a0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
1e5b0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
1e5c0 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
1e5d0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61  /*.** Open a sha
1e5e0 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
1e5f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1e600 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
1e610 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54  le pDbFd.  .** T
1e620 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69  his particular i
1e630 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
1e640 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73  es mmapped files
1e650 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ..**.** The file
1e660 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
1e670 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  nt shared-memory
1e680 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20   is in the same 
1e690 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20  directory.** as 
1e6a0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1e6b0 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74  e file and has t
1e6c0 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
1e6d0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1e6e0 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74  e.** file with t
1e6f0 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78  he "-shm" suffix
1e700 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61   added.  For exa
1e710 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74  mple, if the dat
1e720 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73  abase file.** is
1e730 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
1e740 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68  nfig.db" then th
1e750 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63  e file that is c
1e760 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70  reated and mmapp
1e770 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64  ed.** for shared
1e780 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
1e790 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73  called "/home/us
1e7a0 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68  er1/config.db-sh
1e7b0 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74  m".  .**.** Anot
1e7c0 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20  her approach to 
1e7d0 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20  is to use files 
1e7e0 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f  in /dev/shm or /
1e7f0 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a  dev/tmp or an.**
1e800 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66   some other tmpf
1e810 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20  s mount. But if 
1e820 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66  a file in a diff
1e830 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a  erent directory.
1e840 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ** from the data
1e850 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65  base file is use
1e860 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e  d, then differin
1e870 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  g access permiss
1e880 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72  ions.** or a chr
1e890 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73  oot() might caus
1e8a0 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20  e two different 
1e8b0 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65  processes on the
1e8c0 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73   same.** databas
1e8d0 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e  e to end up usin
1e8e0 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  g different file
1e8f0 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  s for shared mem
1e900 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e  ory - .** meanin
1e910 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d  g that their mem
1e920 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65  ory would not re
1e930 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d  ally be shared -
1e940 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e   resulting.** in
1e950 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
1e960 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c  tion.  Neverthel
1e970 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20  ess, this tmpfs 
1e980 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61  file usage.** ca
1e990 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20  n be enabled at 
1e9a0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69  compile-time usi
1e9b0 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f  ng -DSQLITE_SHM_
1e9c0 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f  DIRECTORY="/dev/
1e9d0 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65  shm".** or the e
1e9e0 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20  quivalent.  The 
1e9f0 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  use of the SQLIT
1ea00 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
1ea10 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20  compile-time.** 
1ea20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  option results i
1ea30 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
1ea40 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74  e build of SQLit
1ea50 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51  e;  builds of SQ
1ea60 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74  Lite.** that wit
1ea70 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49  h differing SQLI
1ea80 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
1ea90 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70   settings attemp
1eaa0 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  t to use the.** 
1eab0 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
1eac0 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
1ead0 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f  ime, database co
1eae0 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69  rruption will li
1eaf0 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20  kely.** result. 
1eb00 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  The SQLITE_SHM_D
1eb10 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
1eb20 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
1eb30 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75  considered.** "u
1eb40 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20  nsupported" and 
1eb50 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61  may go away in a
1eb60 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72   future SQLite r
1eb70 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  elease..**.** Wh
1eb80 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  en opening a new
1eb90 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
1eba0 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72  ile, if no other
1ebb0 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
1ebc0 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63  at.** file are c
1ebd0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69  urrently open, i
1ebe0 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  n this process o
1ebf0 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65  r in other proce
1ec00 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sses, then.** th
1ec10 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74  e file must be t
1ec20 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
1ec30 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20   length or have 
1ec40 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72  its header clear
1ec50 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
1ec60 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
1ec70 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29 20  se file (pDbFd) 
1ec80 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e  is using the "un
1ec90 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20  ix-excl" VFS.** 
1eca0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
1ecb0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1ecc0 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
1ecd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1ece0 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74  nd.** that no ot
1ecf0 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 72  her processes ar
1ed00 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f  e able to read o
1ed10 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61  r write the data
1ed20 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61  base.  In.** tha
1ed30 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f  t case, we do no
1ed40 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68  t really need sh
1ed50 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f  ared memory.  No
1ed60 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a   shared memory.*
1ed70 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  * file is create
1ed80 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20 6d  d.  The shared m
1ed90 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69  emory will be si
1eda0 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65 61  mulated with hea
1edb0 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  p memory..*/.sta
1edc0 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
1edd0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69  SharedMemory(uni
1ede0 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20  xFile *pDbFd){. 
1edf0 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
1ee00 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *p = 0;         
1ee10 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
1ee20 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
1ee30 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
1ee40 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1ee50 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  e;   /* The unde
1ee60 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
1ee70 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ile */.  int rc;
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1eea0 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69  lt code */.  uni
1eeb0 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
1eec0 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
1eed0 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20  The inode of fd 
1eee0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46  */.  char *zShmF
1eef0 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
1ef00 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1ef10 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  the file used fo
1ef20 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e  r SHM */.  int n
1ef30 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  ShmFilename;    
1ef40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1ef50 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69  ze of the SHM fi
1ef60 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20  lename in bytes 
1ef70 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
1ef80 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
1ef90 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  new unixShm obje
1efa0 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ct. */.  p = sql
1efb0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
1efc0 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
1efd0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
1efe0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
1eff0 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
1f000 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72  of(*p));.  asser
1f010 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  t( pDbFd->pShm==
1f020 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  0 );..  /* Check
1f030 20 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69   to see if a uni
1f040 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
1f050 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
1f060 52 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  Reuse an existin
1f070 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72  g.  ** one if pr
1f080 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20  esent. Create a 
1f090 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
1f0a0 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69  sary..  */.  uni
1f0b0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
1f0c0 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d   pInode = pDbFd-
1f0d0 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e  >pInode;.  pShmN
1f0e0 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53  ode = pInode->pS
1f0f0 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53  hmNode;.  if( pS
1f100 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
1f110 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
1f120 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
1f130 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69      /* fstat() i
1f140 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65  nfo for database
1f150 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a   file */..    /*
1f160 20 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f   Call fstat() to
1f170 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   figure out the 
1f180 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
1f190 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f1a0 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65  . If.    ** a ne
1f1b0 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20  w *-shm file is 
1f1c0 63 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65  created, an atte
1f1d0 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  mpt will be made
1f1e0 20 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20   to create it.  
1f1f0 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61    ** with the sa
1f200 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 20  me permissions. 
1f210 54 68 65 20 61 63 74 75 61 6c 20 70 65 72 6d 69  The actual permi
1f220 73 73 69 6f 6e 73 20 74 68 65 20 66 69 6c 65 20  ssions the file 
1f230 69 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 2a  is created.    *
1f240 2a 20 77 69 74 68 20 61 72 65 20 73 75 62 6a 65  * with are subje
1f250 63 74 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ct to the curren
1f260 74 20 75 6d 61 73 6b 20 73 65 74 74 69 6e 67 2e  t umask setting.
1f270 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1f280 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68  osFstat(pDbFd->h
1f290 2c 20 26 73 53 74 61 74 29 20 26 26 20 70 49 6e  , &sStat) && pIn
1f2a0 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
1f2b0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  k==0 ){.      rc
1f2c0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1f2d0 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74  FSTAT;.      got
1f2e0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
1f2f0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
1f300 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
1f310 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e  RY.    nShmFilen
1f320 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c  ame = sizeof(SQL
1f330 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
1f340 59 29 20 2b 20 33 30 3b 0a 23 65 6c 73 65 0a 20  Y) + 30;.#else. 
1f350 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20     nShmFilename 
1f360 3d 20 35 20 2b 20 28 69 6e 74 29 73 74 72 6c 65  = 5 + (int)strle
1f370 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  n(pDbFd->zPath);
1f380 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d  .#endif.    pShm
1f390 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Node = sqlite3_m
1f3a0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
1f3b0 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46  ShmNode) + nShmF
1f3c0 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69  ilename );.    i
1f3d0 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  f( pShmNode==0 )
1f3e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1f3f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1f400 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
1f410 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  rr;.    }.    me
1f420 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30  mset(pShmNode, 0
1f430 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  , sizeof(*pShmNo
1f440 64 65 29 29 3b 0a 20 20 20 20 7a 53 68 6d 46 69  de));.    zShmFi
1f450 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f 64  lename = pShmNod
1f460 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  e->zFilename = (
1f470 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b  char*)&pShmNode[
1f480 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  1];.#ifdef SQLIT
1f490 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
1f4a0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1f4b0 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d  intf(nShmFilenam
1f4c0 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  e, zShmFilename,
1f4d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1f4e0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48         SQLITE_SH
1f4f0 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71  M_DIRECTORY "/sq
1f500 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c  lite-shm-%x-%x",
1f510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f520 20 20 20 20 20 20 28 75 33 32 29 73 53 74 61 74        (u32)sStat
1f530 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53  .st_ino, (u32)sS
1f540 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c  tat.st_dev);.#el
1f550 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  se.    sqlite3_s
1f560 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
1f570 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  name, zShmFilena
1f580 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44  me, "%s-shm", pD
1f590 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
1f5a0 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
1f5b0 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ix3(pDbFd->zPath
1f5c0 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
1f5d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d  .#endif.    pShm
1f5e0 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  Node->h = -1;.  
1f5f0 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d    pDbFd->pInode-
1f600 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
1f610 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  Node;.    pShmNo
1f620 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62  de->pInode = pDb
1f630 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20  Fd->pInode;.    
1f640 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
1f650 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
1f660 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
1f670 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66  EX_FAST);.    if
1f680 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
1f690 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
1f6a0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1f6b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
1f6c0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
1f6d0 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
1f6e0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
1f6f0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
1f700 63 68 61 72 20 2a 7a 52 4f 3b 0a 20 20 20 20 20  char *zRO;.     
1f710 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
1f720 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
1f730 54 3b 0a 20 20 20 20 20 20 7a 52 4f 20 3d 20 73  T;.      zRO = s
1f740 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
1f750 65 74 65 72 28 70 44 62 46 64 2d 3e 7a 50 61 74  eter(pDbFd->zPat
1f760 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d  h, "readonly_shm
1f770 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  ");.      if( zR
1f780 4f 20 26 26 20 73 71 6c 69 74 65 33 47 65 74 42  O && sqlite3GetB
1f790 6f 6f 6c 65 61 6e 28 7a 52 4f 29 20 29 7b 0a 20  oolean(zRO) ){. 
1f7a0 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73         openFlags
1f7b0 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20   = O_RDONLY;.   
1f7c0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69       pShmNode->i
1f7d0 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
1f7e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
1f7f0 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73  mNode->h = robus
1f800 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e  t_open(zShmFilen
1f810 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
1f820 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30  (sStat.st_mode&0
1f830 37 37 37 29 29 3b 0a 20 20 20 20 20 20 69 66 28  777));.      if(
1f840 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29   pShmNode->h<0 )
1f850 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  {.        if( pS
1f860 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20  hmNode->h<0 ){. 
1f870 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
1f880 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1f890 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
1f8a0 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c   "open", zShmFil
1f8b0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
1f8c0 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
1f8d0 65 72 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  err;.        }. 
1f8e0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
1f8f0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1f900 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  if another proce
1f910 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
1f920 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63  e dead-man switc
1f930 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 6e  h..      ** If n
1f940 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  ot, truncate the
1f950 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
1f960 6e 67 74 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  ngth. .      */.
1f970 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1f980 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
1f990 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
1f9a0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52  k(pShmNode, F_WR
1f9b0 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  LCK, UNIX_SHM_DM
1f9c0 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  S, 1)==SQLITE_OK
1f9d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1f9e0 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
1f9f0 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29  (pShmNode->h, 0)
1fa00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1fa10 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
1fa20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
1fa30 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63 61 74 65  OPEN, "ftruncate
1fa40 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  ", zShmFilename)
1fa50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1fa60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1fa70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1fa80 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
1fa90 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1faa0 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c  hmNode, F_RDLCK,
1fab0 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
1fac0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1fad0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
1fae0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
1faf0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
1fb00 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
1fb10 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
1fb20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
1fb30 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  */.  p->pShmNode
1fb40 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66   = pShmNode;.#if
1fb50 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1fb60 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
1fb70 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
1fb80 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
1fb90 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
1fba0 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
1fbb0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1fbc0 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
1fbd0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
1fbe0 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
1fbf0 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
1fc00 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
1fc10 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
1fc20 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
1fc30 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
1fc40 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
1fc50 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
1fc60 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a  uct unixShm) obj
1fc70 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
1fc80 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
1fc90 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
1fca0 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
1fcb0 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
1fcc0 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
1fcd0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
1fce0 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
1fcf0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
1fd00 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
1fd10 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
1fd20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
1fd30 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  tex .  ** mutex.
1fd40 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
1fd50 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1fd60 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1fd70 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
1fd80 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
1fd90 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
1fda0 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
1fdb0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1fdc0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
1fdd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fde0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
1fdf0 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
1fe00 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
1fe10 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
1fe20 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54  bFd);       /* T
1fe30 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
1fe40 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
1fe50 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
1fe60 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78  _free(p);.  unix
1fe70 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
1fe80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1fe90 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1fea0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
1feb0 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
1fec0 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
1fed0 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61  n of the .** sha
1fee0 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
1fef0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
1ff00 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
1ff10 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
1ff20 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e  egions .** are n
1ff30 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
1ff40 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
1ff50 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
1ff60 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
1ff70 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  n .** bytes in s
1ff80 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
1ff90 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
1ffa0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1ffb0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
1ffc0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
1ffd0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1ffe0 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64  , if the bExtend
1fff0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
20000 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
20010 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
20020 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
20030 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
20040 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
20050 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
20060 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
20070 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
20080 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
20090 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
200a0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
200b0 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64  . If .** bExtend
200c0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
200d0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
200e0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
200f0 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
20100 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
20110 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
20120 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
20130 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
20140 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
20150 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
20160 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
20170 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
20180 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
20190 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
201a0 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
201b0 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
201c0 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a  is processes .**
201d0 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
201e0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
201f0 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
20200 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
20210 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d  e mapped .** mem
20220 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
20230 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
20240 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
20250 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
20260 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
20270 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
20280 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
20290 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
202a0 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
202b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
202c0 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
202d0 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
202e0 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
202f0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
20300 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
20310 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20  int bExtend,    
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20330 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
20340 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
20350 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
20360 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
20370 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
20380 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
20390 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
203a0 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
203b0 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68  le*)fd;.  unixSh
203c0 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e  m *p;.  unixShmN
203d0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
203e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
203f0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  _OK;..  /* If th
20400 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
20410 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
20420 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
20430 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  en it now. */.  
20440 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  if( pDbFd->pShm=
20450 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75  =0 ){.    rc = u
20460 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
20470 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
20480 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20490 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
204a0 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d   }..  p = pDbFd-
204b0 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64  >pShm;.  pShmNod
204c0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
204d0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
204e0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
204f0 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
20500 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68  t( szRegion==pSh
20510 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
20520 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
20530 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73  gion==0 );.  ass
20540 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
20550 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
20560 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
20570 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
20580 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
20590 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
205a0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
205b0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
205c0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
205d0 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
205e0 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  );..  if( pShmNo
205f0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
20600 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  gion ){.    char
20610 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20   **apNew;       
20620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20630 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d  * New apRegion[]
20640 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
20650 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69  t nByte = (iRegi
20660 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20  on+1)*szRegion; 
20670 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
20680 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
20690 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
206a0 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
206b0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
206c0 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a   by fstat() */..
206d0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
206e0 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
206f0 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d  n;..    if( pShm
20700 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
20710 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
20720 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e  sted region is n
20730 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  ot mapped into t
20740 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
20750 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20  dress space..   
20760 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
20770 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65  ee if it has bee
20780 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65  n allocated (i.e
20790 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64  . if the wal-ind
207a0 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20  ex file is.     
207b0 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
207c0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
207d0 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
207e0 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
207f0 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 53    if( osFstat(pS
20800 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61  hmNode->h, &sSta
20810 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
20820 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
20830 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  SHMSIZE;.       
20840 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
20850 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  t;.      }.  .  
20860 20 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74      if( sStat.st
20870 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20  _size<nByte ){. 
20880 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
20890 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
208a0 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
208b0 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64  xist. If bExtend
208c0 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
208d0 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69     ** false, exi
208e0 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
208f0 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
20900 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
20910 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20  eturned..       
20920 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41   **.        ** A
20930 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66  lternatively, if
20940 20 62 45 78 74 65 6e 64 20 69 73 20 74 72 75 65   bExtend is true
20950 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28  , use ftruncate(
20960 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  ) to allocate.  
20970 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71        ** the req
20980 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
20990 67 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  gion..        */
209a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 62 45  .        if( !bE
209b0 78 74 65 6e 64 20 29 20 67 6f 74 6f 20 73 68 6d  xtend ) goto shm
209c0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
209d0 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
209e0 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d  uncate(pShmNode-
209f0 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20  >h, nByte) ){.  
20a00 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
20a10 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
20a20 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
20a30 22 66 74 72 75 6e 63 61 74 65 22 2c 0a 20 20 20  "ftruncate",.   
20a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a50 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
20a60 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
20a70 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
20a80 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
20a90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
20aa0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
20ab0 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
20ac0 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
20ad0 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
20ae0 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
20af0 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68  .    apNew = (ch
20b00 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65  ar **)sqlite3_re
20b10 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70  alloc(.        p
20b20 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
20b30 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73  n, (iRegion+1)*s
20b40 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20  izeof(char *).  
20b50 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70    );.    if( !ap
20b60 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20  New ){.      rc 
20b70 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
20b80 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
20b90 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
20ba0 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65    }.    pShmNode
20bb0 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e  ->apRegion = apN
20bc0 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 70 53  ew;.    while(pS
20bd0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
20be0 3d 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20 20 20  =iRegion){.     
20bf0 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20   void *pMem;.   
20c00 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
20c10 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >h>=0 ){.       
20c20 20 70 4d 65 6d 20 3d 20 6d 6d 61 70 28 30 2c 20   pMem = mmap(0, 
20c30 73 7a 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20  szRegion,.      
20c40 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
20c50 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f  isReadonly ? PRO
20c60 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45  T_READ : PROT_RE
20c70 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a  AD|PROT_WRITE, .
20c80 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f              MAP_
20c90 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65  SHARED, pShmNode
20ca0 2d 3e 68 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ->h, pShmNode->n
20cb0 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 0a  Region*szRegion.
20cc0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
20cd0 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50     if( pMem==MAP
20ce0 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20  _FAILED ){.     
20cf0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
20d00 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
20d10 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61  ERR_SHMMAP, "mma
20d20 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  p", pShmNode->zF
20d30 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
20d40 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
20d50 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
20d60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20d70 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69       pMem = sqli
20d80 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67  te3_malloc(szReg
20d90 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ion);.        if
20da0 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20  ( pMem==0 ){.   
20db0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
20dc0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
20dd0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
20de0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
20df0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
20e00 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e  Mem, 0, szRegion
20e10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20e20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
20e30 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
20e40 65 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20  egion] = pMem;. 
20e50 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e       pShmNode->n
20e60 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  Region++;.    }.
20e70 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74    }..shmpage_out
20e80 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  :.  if( pShmNode
20e90 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f  ->nRegion>iRegio
20ea0 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70  n ){.    *pp = p
20eb0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
20ec0 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65  n[iRegion];.  }e
20ed0 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
20ee0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d  ;.  }.  if( pShm
20ef0 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
20f00 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
20f10 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  K ) rc = SQLITE_
20f20 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69  READONLY;.  sqli
20f30 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
20f40 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
20f50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20f60 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
20f70 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
20f80 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
20f90 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  y segment..**.**
20fa0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72   Note that the r
20fb0 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
20fc0 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45  een SHAREd and E
20fd0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69  XCLUSIVE locks i
20fe0 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69  s a little.** di
20ff0 66 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61  fferent here tha
21000 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20  n in posix.  In 
21010 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20  xShmLock(), one 
21020 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f  can go from unlo
21030 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65  cked.** to share
21040 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72  d and back or fr
21050 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65  om unlocked to e
21060 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63  xclusive and bac
21070 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a  k.  But one may.
21080 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73  ** not go from s
21090 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69  hared to exclusi
210a0 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75  ve or from exclu
210b0 73 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a  sive to shared..
210c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
210d0 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  ixShmLock(.  sql
210e0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
210f0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
21100 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
21110 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
21120 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  ry */.  int ofst
21130 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21140 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b     /* First lock
21150 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
21160 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
21170 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
21180 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21190 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71   of locks to acq
211a0 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
211b0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
211c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211d0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
211e0 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29  th the lock */.)
211f0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
21200 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
21210 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  )fd;      /* Con
21220 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20  nection holding 
21230 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
21240 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20  .  unixShm *p = 
21250 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20  pDbFd->pShm;    
21260 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21270 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65  shared memory be
21280 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  ing locked */.  
21290 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20  unixShm *pX;    
212a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212b0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
212c0 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
212d0 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78  blings */.  unix
212e0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
212f0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
21300 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
21310 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a  ing file iNode *
21320 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
21330 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
21340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
21350 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  ult code */.  u1
21360 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  6 mask;         
21370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21380 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c      /* Mask of l
21390 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20  ocks to take or 
213a0 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73  release */..  as
213b0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d  sert( pShmNode==
213c0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
213d0 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73  ShmNode );.  ass
213e0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
213f0 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
21400 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
21410 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73  ( ofst>=0 && ofs
21420 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  t+n<=SQLITE_SHM_
21430 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  NLOCK );.  asser
21440 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73  t( n>=1 );.  ass
21450 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c  ert( flags==(SQL
21460 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
21470 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
21480 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
21490 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
214a0 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
214b0 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20  _EXCLUSIVE).    
214c0 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
214d0 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
214e0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
214f0 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
21500 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
21510 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
21520 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
21530 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   );.  assert( n=
21540 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  =1 || (flags & S
21550 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
21560 49 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  IVE)!=0 );.  ass
21570 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
21580 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
21590 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
215a0 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
215b0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
215c0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
215d0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
215e0 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20  =0 );..  mask = 
215f0 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20  (1<<(ofst+n)) - 
21600 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73  (1<<ofst);.  ass
21610 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b  ert( n>1 || mask
21620 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20  ==(1<<ofst) );. 
21630 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
21640 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
21650 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
21660 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
21670 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
21680 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
21690 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
216a0 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
216b0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
216c0 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
216d0 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
216e0 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
216f0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
21700 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
21710 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
21720 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
21730 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
21740 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
21750 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
21760 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
21770 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
21780 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
21790 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
217a0 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
217b0 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
217c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
217d0 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
217e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
217f0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
21800 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43  pShmNode, F_UNLC
21810 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
21820 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
21830 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
21840 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
21850 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
21860 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
21870 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
21880 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21890 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
218a0 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
218b0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
218c0 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65  ask;.    } .  }e
218d0 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
218e0 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
218f0 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
21900 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
21910 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
21920 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
21930 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
21940 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
21950 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
21960 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
21970 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
21980 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
21990 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
219a0 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
219b0 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
219c0 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
219d0 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
219e0 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
219f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
21a00 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
21a10 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
21a20 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
21a30 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
21a40 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
21a50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21a60 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
21a70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
21a80 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
21a90 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
21aa0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
21ab0 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
21ac0 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
21ad0 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
21ae0 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
21af0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21b00 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
21b10 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
21b20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
21b30 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
21b40 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c  (pShmNode, F_RDL
21b50 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
21b60 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
21b70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21b80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
21ba0 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c      /* Get the l
21bb0 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b  ocal shared lock
21bc0 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
21bd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21be0 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
21bf0 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d  k |= mask;.    }
21c00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
21c10 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69   Make sure no si
21c20 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
21c30 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61  s hold locks tha
21c40 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69  t will block thi
21c50 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20  s.    ** lock.  
21c60 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72  If any do, retur
21c70 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69  n SQLITE_BUSY ri
21c80 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f  ght away..    */
21c90 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
21ca0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
21cb0 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
21cc0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
21cd0 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
21ce0 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72  !=0 || (pX->shar
21cf0 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  edMask & mask)!=
21d00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
21d10 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
21d20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21d30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
21d40 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78     /* Get the ex
21d50 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74  clusive locks at
21d60 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
21d70 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63  l.  Then if succ
21d80 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c  essful.    ** al
21d90 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61  so mark the loca
21da0 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20  l connection as 
21db0 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20  being locked..  
21dc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
21dd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21de0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
21df0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
21e00 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66  ode, F_WRLCK, of
21e10 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
21e20 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
21e30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21e40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
21e50 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20   (p->sharedMask 
21e60 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20  & mask)==0 );.  
21e70 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
21e80 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
21e90 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
21ea0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
21eb0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
21ec0 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
21ed0 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d  "SHM-LOCK shmid-
21ee0 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25  %d, pid-%d got %
21ef0 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20  03x,%03x\n",.   
21f00 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67          p->id, g
21f10 65 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61 72  etpid(), p->shar
21f20 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d  edMask, p->exclM
21f30 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ask));.  return 
21f40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
21f50 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20  lement a memory 
21f60 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72  barrier or memor
21f70 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65  y fence on share
21f80 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a  d memory.  .**.*
21f90 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20  * All loads and 
21fa0 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66  stores begun bef
21fb0 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20  ore the barrier 
21fc0 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  must complete be
21fd0 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64  fore.** any load
21fe0 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20   or store begun 
21ff0 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65  after the barrie
22000 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
22010 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72  d unixShmBarrier
22020 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
22030 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 20 20   *fd            
22040 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
22050 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
22060 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
22070 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  /.){.  UNUSED_PA
22080 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 75  RAMETER(fd);.  u
22090 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
220a0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
220b0 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  x();.}../*.** Cl
220c0 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ose a connection
220d0 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   to shared-memor
220e0 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75  y.  Delete the u
220f0 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74  nderlying .** st
22100 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46  orage if deleteF
22110 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lag is true..**.
22120 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  ** If there is n
22130 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  o shared memory 
22140 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22150 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
22160 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
22170 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73  ine is a harmles
22180 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  s no-op..*/.stat
22190 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e  ic int unixShmUn
221a0 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  map(.  sqlite3_f
221b0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
221c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
221d0 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
221e0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
221f0 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20  deleteFlag      
22200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
22210 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d  elete shared-mem
22220 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ory if true */.)
22230 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20  {.  unixShm *p; 
22240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22250 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
22260 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73  ction to be clos
22270 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  ed */.  unixShmN
22280 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
22290 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
222a0 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
222b0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
222c0 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20    unixShm **pp; 
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222e0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
222f0 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f   over sibling co
22300 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75  nnections */.  u
22310 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  nixFile *pDbFd; 
22320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22330 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
22340 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
22350 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e  /..  pDbFd = (un
22360 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  ixFile*)fd;.  p 
22370 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
22380 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
22390 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
223a0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
223b0 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72  hmNode;..  asser
223c0 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
223d0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
223e0 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
223f0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
22400 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
22410 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  e );..  /* Remov
22420 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66  e connection p f
22430 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63  rom the set of c
22440 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63  onnections assoc
22450 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20  iated.  ** with 
22460 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71  pShmNode */.  sq
22470 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
22480 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
22490 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53  x);.  for(pp=&pS
224a0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
224b0 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26  (*pp)!=p; pp = &
224c0 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a  (*pp)->pNext){}.
224d0 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
224e0 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65  ;..  /* Free the
224f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f   connection p */
22500 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
22510 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  p);.  pDbFd->pSh
22520 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  m = 0;.  sqlite3
22530 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
22540 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a  mNode->mutex);..
22550 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65    /* If pShmNode
22560 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68  ->nRef has reach
22570 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ed 0, then close
22580 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
22590 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f    ** shared-memo
225a0 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a  ry file, too */.
225b0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
225c0 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ();.  assert( pS
225d0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29  hmNode->nRef>0 )
225e0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ;.  pShmNode->nR
225f0 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d  ef--;.  if( pShm
22600 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Node->nRef==0 ){
22610 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46  .    if( deleteF
22620 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d  lag && pShmNode-
22630 3e 68 3e 3d 30 20 29 20 6f 73 55 6e 6c 69 6e 6b  >h>=0 ) osUnlink
22640 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65  (pShmNode->zFile
22650 6e 61 6d 65 29 3b 0a 20 20 20 20 75 6e 69 78 53  name);.    unixS
22660 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a  hmPurge(pDbFd);.
22670 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
22680 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
22690 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
226a0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
226b0 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30  unixShmMap     0
226c0 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
226d0 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66  mLock    0.# def
226e0 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69  ine unixShmBarri
226f0 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e  er 0.# define un
22700 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23  ixShmUnmap   0.#
22710 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
22720 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
22730 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20   */../*.** Here 
22740 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ends the impleme
22750 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73  ntation of all s
22760 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
22770 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ods..**.********
22780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
22790 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nd sqlite3_file 
227a0 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  Methods ********
227b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227c0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
227d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22810 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ******/../*.** T
22820 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
22830 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
22840 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f  s of sqlite3_io_
22850 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20  methods objects 
22860 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  that.** implemen
22870 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c  t various file l
22880 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
22890 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74  s.  It also cont
228a0 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
228b0 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20  .** of "finder" 
228c0 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69  functions.  A fi
228d0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73  nder-function is
228e0 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20   used to locate 
228f0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  the appropriate.
22900 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ** sqlite3_io_me
22910 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72  thods object for
22920 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
22930 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
22940 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69  e pAppData.** fi
22950 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74  eld of the sqlit
22960 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63  e3_vfs VFS objec
22970 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ts are initializ
22980 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72  ed to be pointer
22990 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72  s to.** the corr
229a0 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  ect finder-funct
229b0 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53  ion for that VFS
229c0 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e  ..**.** Most fin
229d0 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  der functions re
229e0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
229f0 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65  o a fixed sqlite
22a00 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20  3_io_methods.** 
22a10 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c  object.  The onl
22a20 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69  y interesting fi
22a30 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73  nder-function is
22a40 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
22a50 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b  r, which.** look
22a60 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73  s at the filesys
22a70 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69  tem type and tri
22a80 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20  es to guess the 
22a90 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  best locking.** 
22aa0 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68  strategy from th
22ab0 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69  at..**.** For fi
22ac0 6e 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20  nder-funtion F, 
22ad0 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20  two objects are 
22ae0 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  created:.**.**  
22af0 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66    (1) The real f
22b00 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e  inder-function n
22b10 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a  amed "FImpt()"..
22b20 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63  **.**    (2) A c
22b30 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20  onstant pointer 
22b40 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
22b50 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e   named just "F".
22b60 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e  .**.**.** A poin
22b70 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69  ter to the F poi
22b80 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20  nter is used as 
22b90 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c  the pAppData val
22ba0 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62  ue for VFS.** ob
22bb0 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20  jects.  We have 
22bc0 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65  to do this inste
22bd0 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41  ad of letting pA
22be0 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20  ppData point.** 
22bf0 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20  directly at the 
22c00 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
22c10 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20  since C90 rules 
22c20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a  prevent a void*.
22c30 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20  ** from be cast 
22c40 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  into a function 
22c50 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a  pointer..**.**.*
22c60 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20  * Each instance 
22c70 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65  of this macro ge
22c80 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65  nerates two obje
22c90 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  cts:.**.**   *  
22ca0 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74  A constant sqlit
22cb0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
22cc0 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44  ject call METHOD
22cd0 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e   that has lockin
22ce0 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64  g.**      method
22cf0 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  s CLOSE, LOCK, U
22d00 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b  NLOCK, CKRESLOCK
22d10 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20  ..**.**   *  An 
22d20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65  I/O method finde
22d30 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  r function calle
22d40 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65  d FINDER that re
22d50 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  turns a pointer.
22d60 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d  **      to the M
22d70 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20  ETHOD object in 
22d80 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c  the previous bul
22d90 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  let..*/.#define 
22da0 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52  IOMETHODS(FINDER
22db0 2c 20 4d 45 54 48 4f 44 2c 20 56 45 52 53 49 4f  , METHOD, VERSIO
22dc0 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  N, CLOSE, LOCK, 
22dd0 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20  UNLOCK, CKLOCK) 
22de0 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
22df0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
22e00 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20  ethods METHOD = 
22e10 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e30 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e      \.   VERSION
22e40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22e50 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
22e60 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
22e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e80 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20     \.   CLOSE,  
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ed0 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c    \.   unixRead,
22ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ef0 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20     /* xRead */  
22f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c   \.   unixWrite,
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20    /* xWrite */  
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f70 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74  \.   unixTruncat
22f80 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
22f90 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
22fc0 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20  .   unixSync,   
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fe0 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20  /* xSync */     
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
23010 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c     unixFileSize,
23020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23030 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20  * xFileSize */  
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23050 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
23060 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20    LOCK,         
23070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23080 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20   xLock */       
23090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230a0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
230b0 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   UNLOCK,        
230c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
230d0 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  xUnlock */      
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230f0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
23100 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  CKLOCK,         
23110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23120 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
23130 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
23140 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
23150 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  nixFileControl, 
23160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
23170 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20  ileControl */   
23180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23190 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
231a0 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  ixSectorSize,   
231b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
231c0 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20  ctorSize */     
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231e0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
231f0 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
23200 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76  istics,  /* xDev
23210 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20  iceCapabilities 
23220 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
23230 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
23240 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20  ShmMap,         
23250 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
23260 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ap */           
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23280 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
23290 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
232a0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
232b0 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
232c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232d0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
232e0 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
232f0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
23300 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20  rier */         
23310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23320 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
23330 55 6e 6d 61 70 20 20 20 20 20 20 20 20 20 20 20  Unmap           
23340 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61       /* xShmUnma
23350 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  p */            
23360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23370 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20     \.};         
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233c0 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
233d0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
233e0 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70  ods *FINDER##Imp
233f0 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  l(const char *z,
23400 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20   unixFile *p){  
23410 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41   \.  UNUSED_PARA
23420 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44  METER(z); UNUSED
23430 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20  _PARAMETER(p);  
23440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23460 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48  \.  return &METH
23470 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OD;             
23480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
234b0 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .}              
234c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
23500 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
23510 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
23520 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29  *(*const FINDER)
23530 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
23540 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20  xFile *p)    \. 
23550 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70     = FINDER##Imp
23560 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61  l;../*.** Here a
23570 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71  re all of the sq
23580 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
23590 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63   objects for eac
235a0 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  h of the.** lock
235b0 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
235c0 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   Functions that 
235d0 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20  return pointers 
235e0 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73  to these methods
235f0 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65  .** are also cre
23600 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f  ated..*/.IOMETHO
23610 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e  DS(.  posixIoFin
23620 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
23630 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
23640 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73  on name */.  pos
23650 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ixIoMethods,    
23660 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
23670 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
23680 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c  ect name */.  2,
23690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236a0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
236b0 64 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61 62  d memory is enab
236c0 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  led */.  unixClo
236d0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
236e0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
236f0 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63  hod */.  unixLoc
23700 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
23710 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
23720 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f  od */.  unixUnlo
23730 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
23740 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
23750 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65  hod */.  unixChe
23760 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
23770 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
23780 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
23790 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  */.).IOMETHODS(.
237a0 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72    nolockIoFinder
237b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ,           /* F
237c0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
237d0 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49  ame */.  nolockI
237e0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
237f0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
23800 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
23810 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
23820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23830 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
23840 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
23850 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73   */.  nolockClos
23860 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
23870 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
23880 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b   */.  nolockLock
23890 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
238a0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
238b0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63  */.  nolockUnloc
238c0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
238d0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
238e0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63   */.  nolockChec
238f0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
23900 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
23910 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
23920 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64  ).IOMETHODS(.  d
23930 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  otlockIoFinder, 
23940 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
23950 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
23960 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d   */.  dotlockIoM
23970 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
23980 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
23990 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
239a0 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
239b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239c0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
239d0 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
239e0 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c  .  dotlockClose,
239f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23a00 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
23a10 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20  .  dotlockLock, 
23a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23a30 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
23a40 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c    dotlockUnlock,
23a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23a60 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
23a70 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  .  dotlockCheckR
23a80 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20  eservedLock  /* 
23a90 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
23aa0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a  ck method */.)..
23ab0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
23ac0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
23ad0 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49  && !OS_VXWORKS.I
23ae0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63  OMETHODS(.  floc
23af0 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
23b00 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
23b10 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
23b20 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  .  flockIoMethod
23b30 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
23b40 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
23b50 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
23b60 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
23b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23b80 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
23b90 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
23ba0 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  flockClose,     
23bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
23bc0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
23bd0 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  flockLock,      
23be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
23bf0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  ck method */.  f
23c00 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
23c10 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
23c20 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
23c30 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  flockCheckReserv
23c40 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68  edLock    /* xCh
23c50 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
23c60 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
23c70 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  if..#if OS_VXWOR
23c80 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  KS.IOMETHODS(.  
23c90 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  semIoFinder,    
23ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
23cb0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
23cc0 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68  e */.  semIoMeth
23cd0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
23ce0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
23cf0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
23d00 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
23d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
23d30 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
23d40 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20  /.  semClose,   
23d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23d60 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
23d70 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20  /.  semLock,    
23d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23d90 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
23da0 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20  .  semUnlock,   
23db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23dc0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
23dd0 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65 73 65  /.  semCheckRese
23de0 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
23df0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
23e00 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
23e10 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
23e20 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
23e30 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
23e40 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
23e50 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f  METHODS(.  afpIo
23e60 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
23e70 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
23e80 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
23e90 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20    afpIoMethods, 
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
23eb0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
23ec0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
23ed0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23ef0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
23f00 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61   disabled */.  a
23f10 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  fpClose,        
23f20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
23f30 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  se method */.  a
23f40 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  fpLock,         
23f50 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
23f60 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  k method */.  af
23f70 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  pUnlock,        
23f80 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
23f90 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  ck method */.  a
23fa0 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fpCheckReservedL
23fb0 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
23fc0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
23fd0 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
23fe0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  f../*.** The pro
23ff0 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  xy locking metho
24000 64 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65  d is a "super-me
24010 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e  thod" in the sen
24020 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70  se that it.** op
24030 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69  ens secondary fi
24040 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
24050 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64  or the conch and
24060 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a   lock files and.
24070 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78 79  ** it uses proxy
24080 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c  , dot-file, AFP,
24090 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63   and flock() loc
240a0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
240b0 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61  those.** seconda
240c0 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74  ry files.  For t
240d0 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  his reason, the 
240e0 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d  division that im
240f0 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78  plements.** prox
24100 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63  y locking is loc
24110 61 74 65 64 20 6d 75 63 68 20 66 75 72 74 68 65  ated much furthe
24120 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69  r down in the fi
24130 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  le.  But we need
24140 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20  .** to go ahead 
24150 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20 73  and define the s
24160 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
24170 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e  s and finder fun
24180 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f  ction.** for pro
24190 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e  xy locking here.
241a0 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20    So we forward 
241b0 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20  declare the I/O 
241c0 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20  methods..*/.#if 
241d0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
241e0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
241f0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
24200 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  E.static int pro
24210 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
24220 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69  file*);.static i
24230 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c  nt proxyLock(sql
24240 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
24250 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
24260 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  xyUnlock(sqlite3
24270 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74  _file*, int);.st
24280 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68  atic int proxyCh
24290 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
242a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
242b0 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28  nt*);.IOMETHODS(
242c0 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72  .  proxyIoFinder
242d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
242e0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
242f0 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49  name */.  proxyI
24300 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
24310 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
24320 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
24330 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
24340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24350 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
24360 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
24370 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73  d */.  proxyClos
24380 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
24390 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
243a0 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  d */.  proxyLock
243b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
243c0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
243d0 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63   */.  proxyUnloc
243e0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
243f0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
24400 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63  d */.  proxyChec
24410 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
24420 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
24430 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
24440 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66  .).#endif../* nf
24450 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31  s lockd on OSX 1
24460 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65  0.3+ doesn't cle
24470 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77  ar write locks w
24480 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  hen a read lock 
24490 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65  is set */.#if de
244a0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
244b0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
244c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
244d0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73  IOMETHODS(.  nfs
244e0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
244f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
24500 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
24510 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64  */.  nfsIoMethod
24520 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
24530 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
24540 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
24550 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
24560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24570 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
24580 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
24590 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
245a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
245b0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
245c0 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20  */.  unixLock,  
245d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245e0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
245f0 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20  */.  nfsUnlock, 
24600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24610 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
24620 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b  d */.  unixCheck
24630 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
24640 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
24650 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
24660 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
24670 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
24680 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
24690 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
246a0 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66  E./* .** This "f
246b0 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20  inder" function 
246c0 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65  attempts to dete
246d0 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c  rmine the best l
246e0 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
246f0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61  .** for the data
24700 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50  base file "fileP
24710 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72  ath".  It then r
24720 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74  eturns the sqlit
24730 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
24740 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
24750 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72  lements that str
24760 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ategy..**.** Thi
24770 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20  s is for MacOSX 
24780 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
24790 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
247a0 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f  _methods *autolo
247b0 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a  ckIoFinderImpl(.
247c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
247d0 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61  lePath,    /* na
247e0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
247f0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  se file */.  uni
24800 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20  xFile *pNew     
24810 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69        /* open fi
24820 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  le object for th
24830 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24840 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63  */.){.  static c
24850 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70 70  onst struct Mapp
24860 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ing {.    const 
24870 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65  char *zFilesyste
24880 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
24890 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79  /* Filesystem ty
248a0 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63  pe name */.    c
248b0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
248c0 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64  methods *pMethod
248d0 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69  s;   /* Appropri
248e0 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ate locking meth
248f0 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d  od */.  } aMap[]
24900 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22   = {.    { "hfs"
24910 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74  ,    &posixIoMet
24920 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75  hods },.    { "u
24930 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f  fs",    &posixIo
24940 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
24950 20 22 61 66 70 66 73 22 2c 20 20 26 61 66 70 49   "afpfs",  &afpI
24960 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
24970 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70  { "smbfs",  &afp
24980 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
24990 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f   { "webdav", &no
249a0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  lockIoMethods },
249b0 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20  .    { 0, 0 }.  
249c0 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  };.  int i;.  st
249d0 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
249e0 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  fo;.  struct flo
249f0 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20  ck lockInfo;..  
24a00 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b  if( !filePath ){
24a10 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50  .    /* If fileP
24a20 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  ath==NULL that m
24a30 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c  eans we are deal
24a40 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73  ing with a trans
24a50 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a  ient file.    **
24a60 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
24a70 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
24a80 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
24a90 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
24aa0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74  ;.  }.  if( stat
24ab0 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73  fs(filePath, &fs
24ac0 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20  Info) != -1 ){. 
24ad0 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f     if( fsInfo.f_
24ae0 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e  flags & MNT_RDON
24af0 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LY ){.      retu
24b00 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
24b10 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ods;.    }.    f
24b20 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e  or(i=0; aMap[i].
24b30 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b  zFilesystem; i++
24b40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
24b50 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
24b60 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d  ypename, aMap[i]
24b70 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30  .zFilesystem)==0
24b80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
24b90 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68  rn aMap[i].pMeth
24ba0 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ods;.      }.   
24bb0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66   }.  }..  /* Def
24bc0 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c  ault case. Handl
24bd0 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65  es, amongst othe
24be0 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20  rs, "nfs"..  ** 
24bf0 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20  Test byte-range 
24c00 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c  lock using fcntl
24c10 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20  (). If the call 
24c20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20  succeeds, .  ** 
24c30 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
24c40 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
24c50 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65  orts POSIX style
24c60 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20   locks. .  */.  
24c70 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
24c80 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
24c90 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
24ca0 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
24cb0 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
24cc0 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
24cd0 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f  F_RDLCK;.  if( o
24ce0 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20  sFcntl(pNew->h, 
24cf0 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
24d00 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
24d10 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
24d20 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
24d30 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "nfs")==0 ){.   
24d40 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f     return &nfsIo
24d50 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65  Methods;.    } e
24d60 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75  lse {.      retu
24d70 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
24d80 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ds;.    }.  }els
24d90 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64  e{.    return &d
24da0 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  otlockIoMethods;
24db0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f  .  }.}.static co
24dc0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
24dd0 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e  ethods .  *(*con
24de0 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  st autolockIoFin
24df0 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  der)(const char*
24e00 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75  ,unixFile*) = au
24e10 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
24e20 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  pl;..#endif /* d
24e30 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
24e40 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
24e50 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
24e60 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f   */..#if OS_VXWO
24e70 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  RKS && SQLITE_EN
24e80 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
24e90 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22  LE./* .** This "
24ea0 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
24eb0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
24ec0 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20  ermine the best 
24ed0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
24ee0 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74   .** for the dat
24ef0 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65  abase file "file
24f00 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20  Path".  It then 
24f10 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69  returns the sqli
24f20 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
24f30 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  * object that im
24f40 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74  plements that st
24f50 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rategy..**.** Th
24f60 69 73 20 69 73 20 66 6f 72 20 56 58 57 6f 72 6b  is is for VXWork
24f70 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  s only..*/.stati
24f80 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
24f90 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f  io_methods *auto
24fa0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
24fb0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
24fc0 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20  filePath,    /* 
24fd0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
24fe0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
24ff0 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20  nixFile *pNew   
25000 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 6f          /* the o
25010 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20  pen file object 
25020 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66  */.){.  struct f
25030 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a  lock lockInfo;..
25040 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20    if( !filePath 
25050 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c  ){.    /* If fil
25060 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74  ePath==NULL that
25070 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
25080 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61  aling with a tra
25090 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20  nsient file.    
250a0 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
250b0 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
250c0 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ed. */.    retur
250d0 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
250e0 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65  ds;.  }..  /* Te
250f0 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73  st if fcntl() is
25100 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75   supported and u
25110 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c  se POSIX style l
25120 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72  ocks..  ** Other
25130 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 74  wise fall back t
25140 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61  o the named sema
25150 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20  phore method..  
25160 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
25170 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
25180 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
25190 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
251a0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
251b0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
251c0 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
251d0 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77  if( osFcntl(pNew
251e0 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
251f0 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
25200 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73  .    return &pos
25210 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ixIoMethods;.  }
25220 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
25230 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a   &semIoMethods;.
25240 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e    }.}.static con
25250 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
25260 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73  thods .  *(*cons
25270 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  t autolockIoFind
25280 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  er)(const char*,
25290 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74  unixFile*) = aut
252a0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
252b0 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53  l;..#endif /* OS
252c0 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49  _VXWORKS && SQLI
252d0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
252e0 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  G_STYLE */../*.*
252f0 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20 74 79  * An abstract ty
25300 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72  pe for a pointer
25310 20 74 6f 20 61 20 49 4f 20 6d 65 74 68 6f 64 20   to a IO method 
25320 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a  finder function:
25330 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e 73  .*/.typedef cons
25340 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
25350 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74  hods *(*finder_t
25360 79 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  ype)(const char*
25370 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f  ,unixFile*);.../
25380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
253a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
253b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
253c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
253d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
253e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65  ********* sqlite
253f0 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a  3_vfs methods **
25400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
25420 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63   This division c
25430 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c  ontains the impl
25440 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65  ementation of me
25450 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  thods on the.** 
25460 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65  sqlite3_vfs obje
25470 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ct..*/../*.** In
25480 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e  itialize the con
25490 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69  tents of the uni
254a0 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
254b0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49  pointed to by pI
254c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
254d0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
254e0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
254f0 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f  pVfs,      /* Po
25500 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a  inter to vfs obj
25510 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20  ect */.  int h, 
25520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25530 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
25540 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65  scriptor of file
25550 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
25560 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 2c 20  .  int syncDir, 
25570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
25580 75 65 20 74 6f 20 73 79 6e 63 20 64 69 72 65 63  ue to sync direc
25590 74 6f 72 79 20 6f 6e 20 66 69 72 73 74 20 73 79  tory on first sy
255a0 6e 63 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  nc */.  sqlite3_
255b0 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20  file *pId,      
255c0 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20  /* Write to the 
255d0 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
255e0 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
255f0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
25600 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
25610 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
25620 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  pened */.  int n
25630 6f 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  oLock,          
25640 20 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69     /* Omit locki
25650 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  ng if true */.  
25660 69 6e 74 20 69 73 44 65 6c 65 74 65 2c 20 20 20  int isDelete,   
25670 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
25680 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72  e on close if tr
25690 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 65  ue */.  int isRe
256a0 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20  adOnly          
256b0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 66  /* True if the f
256c0 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65  ile is opened re
256d0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 29 7b 0a 20 20  ad-only */.){.  
256e0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
256f0 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69  _methods *pLocki
25700 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46  ngStyle;.  unixF
25710 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69  ile *pNew = (uni
25720 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69  xFile *)pId;.  i
25730 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25740 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  K;..  assert( pN
25750 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c  ew->pInode==NULL
25760 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d 65   );..  /* Parame
25770 74 65 72 20 69 73 44 65 6c 65 74 65 20 69 73 20  ter isDelete is 
25780 6f 6e 6c 79 20 75 73 65 64 20 6f 6e 20 76 78 77  only used on vxw
25790 6f 72 6b 73 2e 20 45 78 70 72 65 73 73 20 74 68  orks. Express th
257a0 69 73 20 65 78 70 6c 69 63 69 74 6c 79 20 0a 20  is explicitly . 
257b0 20 2a 2a 20 68 65 72 65 20 74 6f 20 70 72 65 76   ** here to prev
257c0 65 6e 74 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  ent compiler war
257d0 6e 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73  nings about unus
257e0 65 64 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20  ed parameters.. 
257f0 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
25800 41 4d 45 54 45 52 28 69 73 44 65 6c 65 74 65 29  AMETER(isDelete)
25810 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20  ;..  /* Usually 
25820 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61  the path zFilena
25830 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  me should not be
25840 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
25850 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65  name. The.  ** e
25860 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e  xception is when
25870 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f   opening the pro
25880 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20  xy "conch" file 
25890 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20  in builds that. 
258a0 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20   ** include the 
258b0 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f  special Apple lo
258c0 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20  cking styles..  
258d0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
258e0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
258f0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
25900 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72  NG_STYLE.  asser
25910 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  t( zFilename==0 
25920 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
25930 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66  ='/' .    || pVf
25940 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f  s->pAppData==(vo
25950 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46  id*)&autolockIoF
25960 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20  inder );.#else. 
25970 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
25980 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
25990 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65  me[0]=='/' );.#e
259a0 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f  ndif..  /* No lo
259b0 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20  cking occurs in 
259c0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
259d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  */.  assert( zFi
259e0 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 6e 6f 4c  lename!=0 || noL
259f0 6f 63 6b 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ock );..  OSTRAC
25a00 45 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64  E(("OPEN    %-3d
25a10 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65   %s\n", h, zFile
25a20 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  name));.  pNew->
25a30 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 7a  h = h;.  pNew->z
25a40 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
25a50 3b 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70  ;.  if( memcmp(p
25a60 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78  Vfs->zName,"unix
25a70 2d 65 78 63 6c 22 2c 31 30 29 3d 3d 30 20 29 7b  -excl",10)==0 ){
25a80 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
25a90 6c 61 67 73 20 3d 20 55 4e 49 58 46 49 4c 45 5f  lags = UNIXFILE_
25aa0 45 58 43 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  EXCL;.  }else{. 
25ab0 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
25ac0 67 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  gs = 0;.  }.  if
25ad0 28 20 69 73 52 65 61 64 4f 6e 6c 79 20 29 7b 0a  ( isReadOnly ){.
25ae0 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
25af0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
25b00 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  RDONLY;.  }.  if
25b10 28 20 73 79 6e 63 44 69 72 20 29 7b 0a 20 20 20  ( syncDir ){.   
25b20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
25b30 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49 52   |= UNIXFILE_DIR
25b40 53 59 4e 43 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f  SYNC;.  }..#if O
25b50 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77  S_VXWORKS.  pNew
25b60 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46  ->pId = vxworksF
25b70 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e  indFileId(zFilen
25b80 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ame);.  if( pNew
25b90 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pId==0 ){.    
25ba0 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20  noLock = 1;.    
25bb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
25bc0 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  M;.  }.#endif.. 
25bd0 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20   if( noLock ){. 
25be0 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
25bf0 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68   = &nolockIoMeth
25c00 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
25c10 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
25c20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70  = (**(finder_typ
25c30 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74  e*)pVfs->pAppDat
25c40 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e  a)(zFilename, pN
25c50 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ew);.#if SQLITE_
25c60 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
25c70 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68  TYLE.    /* Cach
25c80 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74  e zFilename in t
25c90 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
25ca0 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c  xt (AFP and dotl
25cb0 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f  ock override) fo
25cc0 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f  r.    ** proxyLo
25cd0 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73  ck activation is
25ce0 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74   possible (remot
25cf0 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64  e proxy is based
25d00 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20   on db name).   
25d10 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65   ** zFilename re
25d20 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
25d30 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
25d40 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a  , to support */.
25d50 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
25d60 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64  gContext = (void
25d70 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e  *)zFilename;.#en
25d80 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
25d90 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
25da0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a  &posixIoMethods.
25db0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
25dc0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
25dd0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
25de0 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f  STYLE.    || pLo
25df0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e  ckingStyle == &n
25e00 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64  fsIoMethods.#end
25e10 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78  if.  ){.    unix
25e20 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
25e30 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
25e40 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
25e50 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
25e60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25e70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
25e80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
25e90 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   in findInodeInf
25ea0 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66  o(), close the f
25eb0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20  ile descriptor. 
25ec0 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74       ** immediat
25ed0 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65  ely, before rele
25ee0 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e  asing the mutex.
25ef0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
25f00 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20   may fail.      
25f10 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ** in two scenar
25f20 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ios:.      **.  
25f30 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63      **   (a) A c
25f40 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66  all to fstat() f
25f50 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  ailed..      ** 
25f60 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66    (b) A malloc f
25f70 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ailed..      **.
25f80 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69        ** Scenari
25f90 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f  o (b) may only o
25fa0 63 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63  ccur if the proc
25fb0 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e  ess is holding n
25fc0 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  o other.      **
25fd0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
25fe0 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  s open on the sa
25ff0 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  me file. If ther
26000 65 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c  e were other fil
26010 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
26020 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66  iptors on this f
26030 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c  ile, then no mal
26040 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71  loc would be req
26050 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
26060 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  * findInodeInfo(
26070 29 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ). If this is th
26080 65 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75  e case, it is qu
26090 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73  ite safe to clos
260a0 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c  e.      ** handl
260b0 65 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67  e h - as it is g
260c0 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e  uaranteed that n
260d0 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69  o posix locks wi
260e0 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20  ll be released. 
260f0 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67       ** by doing
26100 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20   so..      **.  
26110 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72      ** If scenar
26120 69 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68  io (a) caused th
26130 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69  e error then thi
26140 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73  ngs are not so s
26150 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  afe. The.      *
26160 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d  * implicit assum
26170 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68  ption here is th
26180 61 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61  at if fstat() fa
26190 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20  ils, things are 
261a0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68  in.      ** such
261b0 20 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20   bad shape that 
261c0 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20  dropping a lock 
261d0 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d  or two doesn't m
261e0 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20  atter much..    
261f0 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73    */.      robus
26200 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
26210 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
26220 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a    h = -1;.    }.
26230 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
26240 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53  ex();.  }..#if S
26250 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
26260 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
26270 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
26280 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
26290 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66  kingStyle == &af
262a0 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
262b0 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67    /* AFP locking
262c0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
262d0 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
262e0 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
262f0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70  n.    ** the afp
26300 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a  LockingContext..
26310 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f      */.    afpLo
26320 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
26330 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f  tx;.    pNew->lo
26340 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
26350 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ctx = sqlite3_ma
26360 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
26370 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  tx) );.    if( p
26380 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ctx==0 ){.      
26390 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
263a0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
263b0 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65      /* NB: zFile
263c0 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20  name exists and 
263d0 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
263e0 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20  til the file is 
263f0 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  closed.      ** 
26400 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71  according to req
26410 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e  uirement F11141.
26420 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e    So we do not n
26430 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20  eed to make a.  
26440 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
26450 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a  he filename. */.
26460 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61        pCtx->dbPa
26470 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
26480 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65        pCtx->rese
26490 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rved = 0;.      
264a0 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20  srandomdev();.  
264b0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
264c0 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ex();.      rc =
264d0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
264e0 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
264f0 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  de);.      if( r
26500 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
26510 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
26520 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69  free(pNew->locki
26530 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ngContext);.    
26540 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
26550 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
26560 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d  __);.        h =
26570 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
26580 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
26590 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20  x();        .   
265a0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
265b0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
265c0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c  ngStyle == &dotl
265d0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  ockIoMethods ){.
265e0 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c      /* Dotfile l
265f0 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
26600 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
26610 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
26620 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
26630 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  he dotlockLockin
26640 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f  gContext .    */
26650 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  .    char *zLock
26660 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46  File;.    int nF
26670 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73  ilename;.    ass
26680 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d  ert( zFilename!=
26690 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61  0 );.    nFilena
266a0 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  me = (int)strlen
266b0 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b  (zFilename) + 6;
266c0 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d  .    zLockFile =
266d0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
266e0 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d  _malloc(nFilenam
266f0 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63  e);.    if( zLoc
26700 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  kFile==0 ){.    
26710 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
26720 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
26730 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
26740 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65  printf(nFilename
26750 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73  , zLockFile, "%s
26760 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  " DOTLOCK_SUFFIX
26770 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
26780 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f    }.    pNew->lo
26790 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a  ckingContext = z
267a0 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23  LockFile;.  }..#
267b0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
267c0 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
267d0 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f  gStyle == &semIo
267e0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
267f0 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
26800 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  e locking uses t
26810 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
26820 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  it needs to be. 
26830 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69     ** included i
26840 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67  n the semLocking
26850 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20  Context.    */. 
26860 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
26870 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
26880 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
26890 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
268a0 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  ;.    if( (rc==S
268b0 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e  QLITE_OK) && (pN
268c0 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
268d0 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ==NULL) ){.     
268e0 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20   char *zSemName 
268f0 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e  = pNew->pInode->
26900 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20  aSemName;.      
26910 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c  int n;.      sql
26920 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
26930 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d  X_PATHNAME, zSem
26940 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c  Name, "/%s.sem",
26950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26960 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49          pNew->pI
26970 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
26980 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e  e);.      for( n
26990 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b  =1; zSemName[n];
269a0 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69   n++ ).        i
269b0 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d  f( zSemName[n]==
269c0 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e  '/' ) zSemName[n
269d0 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70  ] = '_';.      p
269e0 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
269f0 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65  m = sem_open(zSe
26a00 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20  mName, O_CREAT, 
26a10 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20  0666, 1);.      
26a20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  if( pNew->pInode
26a30 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41  ->pSem == SEM_FA
26a40 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
26a50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
26a60 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
26a70 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
26a80 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  e[0] = '\0';.   
26a90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
26aa0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
26ab0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
26ac0 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f   pNew->lastErrno
26ad0 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57   = 0;.#if OS_VXW
26ae0 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53  ORKS.  if( rc!=S
26af0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26b00 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73  if( h>=0 ) robus
26b10 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
26b20 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
26b30 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e  h = -1;.    osUn
26b40 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
26b50 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d 20  .    isDelete = 
26b60 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69  0;.  }.  pNew->i
26b70 73 44 65 6c 65 74 65 20 3d 20 69 73 44 65 6c 65  sDelete = isDele
26b80 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  te;.#endif.  if(
26b90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26ba0 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  {.    if( h>=0 )
26bb0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
26bc0 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
26bd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
26be0 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70  New->pMethod = p
26bf0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
26c00 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
26c10 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
26c20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
26c30 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
26c40 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77  a directory in w
26c50 68 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70  hich to put temp
26c60 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20  orary files..** 
26c70 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74  If no suitable t
26c80 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69  emporary file di
26c90 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66  rectory can be f
26ca0 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ound, return NUL
26cb0 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
26cc0 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d  st char *unixTem
26cd0 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a  pFileDir(void){.
26ce0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
26cf0 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
26d00 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30  {.     0,.     0
26d10 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70  ,.     "/var/tmp
26d20 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  ",.     "/usr/tm
26d30 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c  p",.     "/tmp",
26d40 0a 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f  .     0        /
26d50 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f  * List terminato
26d60 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73 69  r */.  };.  unsi
26d70 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73 74  gned int i;.  st
26d80 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
26d90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
26da0 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72 73  r = 0;..  azDirs
26db0 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  [0] = sqlite3_te
26dc0 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20  mp_directory;.  
26dd0 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29  if( !azDirs[1] )
26de0 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74   azDirs[1] = get
26df0 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
26e00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
26e10 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
26e20 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44  f(azDirs[0]); zD
26e30 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b  ir=azDirs[i++]){
26e40 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  .    if( zDir==0
26e50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
26e60 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69 72   if( osStat(zDir
26e70 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e  , &buf) ) contin
26e80 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49  ue;.    if( !S_I
26e90 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SDIR(buf.st_mode
26ea0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
26eb0 20 20 69 66 28 20 6f 73 41 63 63 65 73 73 28 7a    if( osAccess(z
26ec0 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74 69  Dir, 07) ) conti
26ed0 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  nue;.    break;.
26ee0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44 69    }.  return zDi
26ef0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r;.}../*.** Crea
26f00 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
26f10 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
26f20 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
26f30 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
26f40 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
26f50 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ess and must be 
26f60 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
26f70 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70  ld at least.** p
26f80 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
26f90 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
26fa0 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
26fb0 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
26fc0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
26fd0 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
26fe0 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b  ned char zChars[
26ff0 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67  ] =.    "abcdefg
27000 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
27010 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46  xyz".    "ABCDEF
27020 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
27030 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34  WXYZ".    "01234
27040 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e  56789";.  unsign
27050 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  ed int i, j;.  c
27060 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b  onst char *zDir;
27070 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
27080 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
27090 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
270a0 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
270b0 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
270c0 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
270d0 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
270e0 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
270f0 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
27100 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
27110 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d  ing. .  */.  Sim
27120 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
27130 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
27140 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75  R );..  zDir = u
27150 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29  nixTempFileDir()
27160 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20  ;.  if( zDir==0 
27170 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20  ) zDir = ".";.. 
27180 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
27190 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
271a0 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
271b0 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
271c0 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61  ry file .  ** na
271d0 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  me. If it is not
271e0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
271f0 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66  ERROR..  */.  if
27200 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20  ( (strlen(zDir) 
27210 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f  + strlen(SQLITE_
27220 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
27230 29 20 2b 20 31 37 29 20 3e 3d 20 28 73 69 7a 65  ) + 17) >= (size
27240 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72  _t)nBuf ){.    r
27250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
27260 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20  OR;.  }..  do{. 
27270 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
27280 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75  ntf(nBuf-17, zBu
27290 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54  f, "%s/"SQLITE_T
272a0 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c  EMP_FILE_PREFIX,
272b0 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20   zDir);.    j = 
272c0 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66  (int)strlen(zBuf
272d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
272e0 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
272f0 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  Buf[j]);.    for
27300 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
27310 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75   j++){.      zBu
27320 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
27330 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
27340 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
27350 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
27360 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   ];.    }.    zB
27370 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68  uf[j] = 0;.  }wh
27380 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28 7a 42  ile( osAccess(zB
27390 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  uf,0)==0 );.  re
273a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
273b0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
273c0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
273d0 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
273e0 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52  APPLE__)./*.** R
273f0 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66  outine to transf
27400 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69  orm a unixFile i
27410 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b  nto a proxy-lock
27420 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a  ing unixFile..**
27430 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
27440 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63  in the proxy-loc
27450 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20  k division, but 
27460 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e  used by unixOpen
27470 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f  ().** if SQLITE_
27480 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
27490 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e  KING is defined.
274a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
274b0 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
274c0 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c  xFile(unixFile*,
274d0 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23   const char*);.#
274e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  endif../*.** Sea
274f0 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65  rch for an unuse
27500 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
27510 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65  r that was opene
27520 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
27530 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20  e .** file (not 
27540 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73  a journal or mas
27550 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
27560 29 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  ) identified by 
27570 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74  pathname.** zPat
27580 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50  h with SQLITE_OP
27590 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74  EN_XXX flags mat
275a0 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73  ching those pass
275b0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
275c0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  .** argument to 
275d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
275e0 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65  *.** Such a file
275f0 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20   descriptor may 
27600 65 78 69 73 74 20 69 66 20 61 20 64 61 74 61 62  exist if a datab
27610 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  ase connection w
27620 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74  as closed.** but
27630 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
27640 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
27650 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f  could not be clo
27660 73 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65  sed because some
27670 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64  .** other file d
27680 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f  escriptor open o
27690 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  n the same file 
276a0 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c  is holding a fil
276b0 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72  e-lock..** Refer
276c0 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20   to comments in 
276d0 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20  the unixClose() 
276e0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65  function and the
276f0 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74   lengthy comment
27700 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22  .** describing "
27710 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c  Posix Advisory L
27720 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73  ocking" at the s
27730 74 61 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c  tart of this fil
27740 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65  e for .** furthe
27750 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c  r details. Also,
27760 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a   ticket #4018..*
27770 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62  *.** If a suitab
27780 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
27790 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
277a0 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  n it is returned
277b0 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20  . If no.** such 
277c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
277d0 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69  is located, -1 i
277e0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
277f0 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64  tatic UnixUnused
27800 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65  Fd *findReusable
27810 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  Fd(const char *z
27820 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29  Path, int flags)
27830 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  {.  UnixUnusedFd
27840 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a   *pUnused = 0;..
27850 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72    /* Do not sear
27860 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64  ch for an unused
27870 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
27880 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74   on vxworks. Not
27890 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78   because.  ** vx
278a0 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20  works would not 
278b0 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65  benefit from the
278c0 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68   change (it migh
278d0 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72  t, we're not sur
278e0 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63  e),.  ** but bec
278f0 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74  ause no way to t
27900 65 73 74 20 69 74 20 69 73 20 63 75 72 72 65 6e  est it is curren
27910 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49  tly available. I
27920 74 20 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a  t is better .  *
27930 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72  * not to risk br
27940 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73  eaking vxworks s
27950 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73  upport for the s
27960 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f  ake of such an o
27970 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61  bscure .  ** fea
27980 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f  ture.  */.#if !O
27990 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
279a0 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
279b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279c0 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73   /* Results of s
279d0 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20  tat() call */.. 
279e0 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61 6c   /* A stat() cal
279f0 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20 76  l may fail for v
27a00 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20  arious reasons. 
27a10 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  If this happens,
27a20 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f   it is.  ** almo
27a30 73 74 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  st certain that 
27a40 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f  an open() call o
27a50 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 20  n the same path 
27a60 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a  will also fail..
27a70 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65    ** For this re
27a80 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f  ason, if an erro
27a90 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
27aa0 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72 65  stat() call here
27ab0 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e  , it is.  ** ign
27ac0 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20 72  ored and -1 is r
27ad0 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c  eturned. The cal
27ae0 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f 20  ler will try to 
27af0 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a  open a new file.
27b00 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
27b10 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68  on the same path
27b20 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74 75  , fail, and retu
27b30 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53  rn an error to S
27b40 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  QLite..  **.  **
27b50 20 45 76 65 6e 20 69 66 20 61 20 73 75 62 73 65   Even if a subse
27b60 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c  quent open() cal
27b70 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c 20  l does succeed, 
27b80 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73  the consequences
27b90 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61   of.  ** not sea
27ba0 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65 73  rching for a res
27bb0 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63  usable file desc
27bc0 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20 64  riptor are not d
27bd0 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30  ire.  */.  if( 0
27be0 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20  ==osStat(zPath, 
27bf0 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 75  &sStat) ){.    u
27c00 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
27c10 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78 45  node;..    unixE
27c20 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
27c30 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
27c40 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ist;.    while( 
27c50 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f 64  pInode && (pInod
27c60 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d 73  e->fileId.dev!=s
27c70 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20 20  Stat.st_dev.    
27c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c90 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65   || pInode->file
27ca0 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73 74  Id.ino!=sStat.st
27cb0 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  _ino) ){.       
27cc0 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
27cd0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
27ce0 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a    if( pInode ){.
27cf0 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64        UnixUnused
27d00 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66  Fd **pp;.      f
27d10 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70  or(pp=&pInode->p
27d20 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28  Unused; *pp && (
27d30 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61  *pp)->flags!=fla
27d40 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e  gs; pp=&((*pp)->
27d50 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70  pNext));.      p
27d60 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20  Unused = *pp;.  
27d70 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20      if( pUnused 
27d80 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d  ){.        *pp =
27d90 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b   pUnused->pNext;
27da0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27db0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
27dc0 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  x();.  }.#endif 
27dd0 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57     /* if !OS_VXW
27de0 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ORKS */.  return
27df0 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a   pUnused;.}../*.
27e00 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
27e10 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75 6e   is called by un
27e20 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74 65  ixOpen() to dete
27e30 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20 70  rmine the unix p
27e40 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f  ermissions.** to
27e50 20 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c 65   create new file
27e60 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65 72  s with. If no er
27e70 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
27e80 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
27e90 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20  turned.** and a 
27ea0 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66  value suitable f
27eb0 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20 74 68  or passing as th
27ec0 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
27ed0 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a   to open(2) is.*
27ee0 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d  * written to *pM
27ef0 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ode. If an IO er
27f00 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
27f10 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
27f20 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
27f30 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
27f40 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20  f *pMode is not 
27f50 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
27f60 49 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  If the file bein
27f70 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20 74 65  g opened is a te
27f80 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 69 74  mporary file, it
27f90 20 69 73 20 61 6c 77 61 79 73 20 63 72 65 61 74   is always creat
27fa0 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6f  ed with.** the o
27fb0 63 74 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73  ctal permissions
27fc0 20 30 36 30 30 20 28 72 65 61 64 2f 77 72 69 74   0600 (read/writ
27fd0 61 62 6c 65 20 62 79 20 6f 77 6e 65 72 20 6f 6e  able by owner on
27fe0 6c 79 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65  ly). If the file
27ff0 0a 2a 2a 20 69 73 20 61 20 64 61 74 61 62 61 73  .** is a databas
28000 65 20 6f 72 20 6d 61 73 74 65 72 20 6a 6f 75 72  e or master jour
28010 6e 61 6c 20 66 69 6c 65 2c 20 69 74 20 69 73 20  nal file, it is 
28020 63 72 65 61 74 65 64 20 77 69 74 68 20 74 68 65  created with the
28030 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a   permissions .**
28040 20 6d 61 73 6b 20 53 51 4c 49 54 45 5f 44 45 46   mask SQLITE_DEF
28050 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
28060 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e  SIONS..**.** Fin
28070 61 6c 6c 79 2c 20 69 66 20 74 68 65 20 66 69 6c  ally, if the fil
28080 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69  e being opened i
28090 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c  s a WAL or regul
280a0 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ar journal file,
280b0 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66   then .** this f
280c0 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20  unction queries 
280d0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
280e0 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69  for the permissi
280f0 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63  ons on the .** c
28100 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74  orresponding dat
28110 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73  abase file and s
28120 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68  ets *pMode to th
28130 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76  is value. Whenev
28140 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c  er .** possible,
28150 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c   WAL and journal
28160 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
28170 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
28180 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a  e permissions .*
28190 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61  * as the associa
281a0 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
281b0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
281c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
281d0 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69  3_NAMES option i
281e0 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
281f0 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
28200 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76  filename is unav
28210 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f  ailable.  But 8_
28220 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20  3_NAMES is only 
28230 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20  used for.** FAT 
28240 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20  filesystems and 
28250 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e  permissions do n
28260 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c  ot matter there,
28270 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20   so just use.** 
28280 74 68 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d  the default perm
28290 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  issions..*/.stat
282a0 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74  ic int findCreat
282b0 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e  eFileMode(.  con
282c0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
282d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
282e0 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f  Path of file (po
282f0 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72  ssibly) being cr
28300 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66  eated */.  int f
28310 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
28320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
28330 61 67 73 20 70 61 73 73 65 64 20 61 73 20 34 74  ags passed as 4t
28340 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f  h argument to xO
28350 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f  pen() */.  mode_
28360 74 20 2a 70 4d 6f 64 65 20 20 20 20 20 20 20 20  t *pMode        
28370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
28380 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74  T: Permissions t
28390 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68  o open file with
283a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
283b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
283c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
283d0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d  rn Code */.  *pM
283e0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ode = SQLITE_DEF
283f0 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
28400 53 49 4f 4e 53 3b 0a 20 20 69 66 28 20 66 6c 61  SIONS;.  if( fla
28410 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
28420 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45  N_WAL|SQLITE_OPE
28430 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20  N_MAIN_JOURNAL) 
28440 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b  ){.    char zDb[
28450 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
28460 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
28470 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20   file path */.  
28480 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20    int nDb;      
28490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
284b0 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20  id bytes in zDb 
284c0 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
284d0 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
284e0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f       /* Output o
284f0 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61  f stat() on data
28500 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
28510 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20    /* zPath is a 
28520 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72  path to a WAL or
28530 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
28540 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
28550 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a  ck derives.    *
28560 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  * the path to th
28570 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
28580 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20  abase file from 
28590 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63  zPath. This bloc
285a0 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a  k handles.    **
285b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e   the following n
285c0 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  aming convention
285d0 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
285e0 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
285f0 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a  -journal".    **
28600 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
28610 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22  -wal".    **   "
28620 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75  <path to db>-jou
28630 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20  rnalNN".    **  
28640 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77   "<path to db>-w
28650 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20  alNN".    **.   
28660 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20   ** where NN is 
28670 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72  a decimal number
28680 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20  . The NN naming 
28690 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20  schemes are .   
286a0 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20   ** used by the 
286b0 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63  test_multiplex.c
286c0 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a   module..    */.
286d0 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65      nDb = sqlite
286e0 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29  3Strlen30(zPath)
286f0 20 2d 20 31 3b 20 0a 23 69 66 64 65 66 20 53 51   - 1; .#ifdef SQ
28700 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
28710 4e 41 4d 45 53 0a 20 20 20 20 77 68 69 6c 65 28  NAMES.    while(
28720 20 6e 44 62 3e 30 20 26 26 20 73 71 6c 69 74 65   nDb>0 && sqlite
28730 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74 68 5b 6e  3Isalnum(zPath[n
28740 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b 0a 20 20  Db]) ) nDb--;.  
28750 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c 20    if( nDb==0 || 
28760 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20  zPath[nDb]!='-' 
28770 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
28780 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 77 68  OK;.#else.    wh
28790 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21  ile( zPath[nDb]!
287a0 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 61 73  ='-' ){.      as
287b0 73 65 72 74 28 20 6e 44 62 3e 30 20 29 3b 0a 20  sert( nDb>0 );. 
287c0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 50 61       assert( zPa
287d0 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27 20 29 3b  th[nDb]!='\n' );
287e0 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20  .      nDb--;.  
287f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6d    }.#endif.    m
28800 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74 68  emcpy(zDb, zPath
28810 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b  , nDb);.    zDb[
28820 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  nDb] = '\0';..  
28830 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28    if( 0==osStat(
28840 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  zDb, &sStat) ){.
28850 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 73        *pMode = s
28860 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30  Stat.st_mode & 0
28870 37 37 37 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  777;.    }else{.
28880 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
28890 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
288a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
288b0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
288c0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
288d0 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65  SE ){.    *pMode
288e0 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20 72   = 0600;.  }.  r
288f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
28900 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65  ** Open the file
28910 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50   zPath..** .** P
28920 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53  reviously, the S
28930 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75  QLite OS layer u
28940 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74 69  sed three functi
28950 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  ons in place of 
28960 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a  this.** one:.**.
28970 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
28980 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b  OpenReadWrite();
28990 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
289a0 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b  sOpenReadOnly();
289b0 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
289c0 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29  sOpenExclusive()
289d0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ;.**.** These ca
289e0 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  lls correspond t
289f0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
28a00 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
28a10 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  flags:.**.**    
28a20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20   ReadWrite() -> 
28a30 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20 7c      (READWRITE |
28a40 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20   CREATE).**     
28a50 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20  ReadOnly()  ->  
28a60 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a     (READONLY) .*
28a70 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73  *     OpenExclus
28a80 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52  ive() -> (READWR
28a90 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45  ITE | CREATE | E
28aa0 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20  XCLUSIVE).**.** 
28ab0 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c  The old OpenExcl
28ac0 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65 64  usive() accepted
28ad0 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d   a boolean argum
28ae0 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e  ent - "delFlag".
28af0 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65   If.** true, the
28b00 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67   file was config
28b10 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d  ured to be autom
28b20 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
28b30 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c   when the.** fil
28b40 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e  e handle closed.
28b50 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65 20   To achieve the 
28b60 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e  same effect usin
28b70 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69  g this new .** i
28b80 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74 68  nterface, add th
28b90 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  e DELETEONCLOSE 
28ba0 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70  flag to those sp
28bb0 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f  ecified above fo
28bc0 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73  r .** OpenExclus
28bd0 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ive()..*/.static
28be0 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20   int unixOpen(. 
28bf0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
28c00 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fs,           /*
28c10 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68 69   The VFS for whi
28c20 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20 78  ch this is the x
28c30 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Open method */. 
28c40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
28c50 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  th,           /*
28c60 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c   Pathname of fil
28c70 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a  e to be opened *
28c80 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
28c90 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
28ca0 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
28cb0 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69  criptor to be fi
28cc0 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74  lled in */.  int
28cd0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
28ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
28cf0 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74  ut flags to cont
28d00 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  rol the opening 
28d10 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  */.  int *pOutFl
28d20 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
28d30 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67    /* Output flag
28d40 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51  s returned to SQ
28d50 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a  Lite core */.){.
28d60 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20    unixFile *p = 
28d70 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c  (unixFile *)pFil
28d80 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  e;.  int fd = -1
28d90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28da0 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
28db0 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20  riptor returned 
28dc0 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  by open() */.  i
28dd0 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30  nt openFlags = 0
28de0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
28df0 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   Flags to pass t
28e00 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  o open() */.  in
28e10 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26  t eType = flags&
28e20 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20  0xFFFFFF00;  /* 
28e30 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Type of file to 
28e40 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  open */.  int no
28e50 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
28e60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
28e70 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67   to omit locking
28e80 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20   primitives */. 
28e90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
28ea0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
28eb0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75  /* Function Retu
28ec0 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 69 6e  rn Code */..  in
28ed0 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
28ee0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
28ef0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
28f00 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
28f10 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
28f20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
28f30 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
28f40 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
28f50 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
28f60 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
28f70 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
28f80 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
28f90 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
28fa0 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
28fb0 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
28fc0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
28fd0 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51  ADWRITE);.#if SQ
28fe0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
28ff0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
29000 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28  isAutoProxy  = (
29010 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
29020 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a  PEN_AUTOPROXY);.
29030 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
29040 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
29050 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
29060 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73  OCKING_STYLE.  s
29070 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
29080 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  nfo;.#endif..  /
29090 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
290a0 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66  master or main-f
290b0 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69  ile journal, thi
290c0 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
290d0 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65  open.  ** a file
290e0 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74  -descriptor on t
290f0 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f  he directory too
29100 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  . The first time
29110 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a   unixSync().  **
29120 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64   is called the d
29130 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
29140 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
29150 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63   fsync()ed and c
29160 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20  lose()d..  */.  
29170 69 6e 74 20 73 79 6e 63 44 69 72 20 3d 20 28 69  int syncDir = (i
29180 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20  sCreate && (.   
29190 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49       eType==SQLI
291a0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
291b0 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
291c0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
291d0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
291e0 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
291f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
29200 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61    ));..  /* If a
29210 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
29220 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
29230 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
29240 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
29250 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
29260 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
29270 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
29280 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
29290 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
292a0 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41   zTmpname[MAX_PA
292b0 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e  THNAME+1];.  con
292c0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
292d0 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68   zPath;..  /* Ch
292e0 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  eck the followin
292f0 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  g statements are
29300 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a   true: .  **.  *
29310 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20  *   (a) Exactly 
29320 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57  one of the READW
29330 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c  RITE and READONL
29340 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20  Y flags must be 
29350 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20  set, and .  **  
29360 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69   (b) if CREATE i
29370 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44  s set, then READ
29380 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  WRITE must also 
29390 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a  be set, and.  **
293a0 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53     (c) if EXCLUS
293b0 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  IVE is set, then
293c0 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
293d0 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20  o be set..  **  
293e0 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e   (d) if DELETEON
293f0 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68  CLOSE is set, th
29400 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
29410 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f  lso be set..  */
29420 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61  .  assert((isRea
29430 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65  donly==0 || isRe
29440 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28  adWrite==0) && (
29450 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69  isReadWrite || i
29460 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61  sReadonly));.  a
29470 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d  ssert(isCreate==
29480 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
29490 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78  );.  assert(isEx
294a0 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73  clusive==0 || is
294b0 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72  Create);.  asser
294c0 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c  t(isDelete==0 ||
294d0 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f   isCreate);..  /
294e0 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d  * The main DB, m
294f0 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c  ain journal, WAL
29500 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72   file and master
29510 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76   journal are nev
29520 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74  er .  ** automat
29530 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20  ically deleted. 
29540 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65  Nor are they eve
29550 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
29560 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
29570 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
29580 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
29590 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
295a0 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
295b0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
295c0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
295d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
295e0 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
295f0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
29600 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
29610 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
29620 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
29630 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
29640 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
29650 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
29660 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a  TE_OPEN_WAL );..
29670 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
29680 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
29690 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20   has set one of 
296a0 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20  the "file-type" 
296b0 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65  flags. */.  asse
296c0 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
296d0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20  E_OPEN_MAIN_DB  
296e0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
296f0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
29700 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  B .       || eTy
29710 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
29720 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
29730 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
29740 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
29750 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
29760 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  ==SQLITE_OPEN_SU
29770 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54  BJOURNAL   || eT
29780 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
29790 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
297a0 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
297b0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52  ==SQLITE_OPEN_TR
297c0 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54  ANSIENT_DB || eT
297d0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
297e0 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d  _WAL.  );..  mem
297f0 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
29800 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20  (unixFile));..  
29810 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  if( eType==SQLIT
29820 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
29830 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64  {.    UnixUnused
29840 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20  Fd *pUnused;.   
29850 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52   pUnused = findR
29860 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c  eusableFd(zName,
29870 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
29880 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20   pUnused ){.    
29890 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e    fd = pUnused->
298a0 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  fd;.    }else{. 
298b0 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73       pUnused = s
298c0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
298d0 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b  zeof(*pUnused));
298e0 0a 20 20 20 20 20 20 69 66 28 20 21 70 55 6e 75  .      if( !pUnu
298f0 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  sed ){.        r
29900 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
29910 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
29920 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64  }.    p->pUnused
29930 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 7d 65   = pUnused;.  }e
29940 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29  lse if( !zName )
29950 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
29960 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75  e is NULL, the u
29970 70 70 65 72 20 6c 61 79 65 72 20 69 73 20 72 65  pper layer is re
29980 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20  questing a temp 
29990 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  file. */.    ass
299a0 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20  ert(isDelete && 
299b0 21 73 79 6e 63 44 69 72 29 3b 0a 20 20 20 20 72  !syncDir);.    r
299c0 63 20 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e  c = unixGetTempn
299d0 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame(MAX_PATHNAME
299e0 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  +1, zTmpname);. 
299f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29a00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
29a10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
29a20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e     zName = zTmpn
29a30 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ame;.  }..  /* D
29a40 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c  etermine the val
29a50 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20  ue of the flags 
29a60 70 61 72 61 6d 65 74 65 72 20 70 61 73 73 65 64  parameter passed
29a70 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74 69   to POSIX functi
29a80 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20  on.  ** open(). 
29a90 54 68 65 73 65 20 6d 75 73 74 20 62 65 20 63 61  These must be ca
29aa0 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69 66  lculated even if
29ab0 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20 63   open() is not c
29ac0 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74  alled, as.  ** t
29ad0 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72 65  hey may be store
29ae0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
29af0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64   file handle and
29b00 20 75 73 65 64 20 62 79 20 74 68 65 20 0a 20 20   used by the .  
29b10 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65 27 20  ** 'conch file' 
29b20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e  locking function
29b30 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a  s later on.  */.
29b40 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79    if( isReadonly
29b50 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d   )  openFlags |=
29b60 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28   O_RDONLY;.  if(
29b70 20 69 73 52 65 61 64 57 72 69 74 65 20 29 20 6f   isReadWrite ) o
29b80 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
29b90 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61  WR;.  if( isCrea
29ba0 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67  te )    openFlag
29bb0 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20  s |= O_CREAT;.  
29bc0 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20  if( isExclusive 
29bd0 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28  ) openFlags |= (
29be0 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f  O_EXCL|O_NOFOLLO
29bf0 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20  W);.  openFlags 
29c00 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c  |= (O_LARGEFILE|
29c10 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66  O_BINARY);..  if
29c20 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f  ( fd<0 ){.    mo
29c30 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20  de_t openMode;  
29c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29c50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72  ermissions to cr
29c60 65 61 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a  eate file with *
29c70 2f 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 43  /.    rc = findC
29c80 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e  reateFileMode(zN
29c90 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65  ame, flags, &ope
29ca0 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20  nMode);.    if( 
29cb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29cc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
29cd0 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20 20  p->pUnused );.  
29ce0 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
29cf0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
29d00 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
29d10 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
29d20 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72  URNAL );.      r
29d30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
29d40 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
29d50 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e  open(zName, open
29d60 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29  Flags, openMode)
29d70 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
29d80 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20  OPENX   %-3d %s 
29d90 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d  0%o\n", fd, zNam
29da0 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a  e, openFlags));.
29db0 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20      if( fd<0 && 
29dc0 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26  errno!=EISDIR &&
29dd0 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
29de0 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a  !isExclusive ){.
29df0 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20        /* Failed 
29e00 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  to open the file
29e10 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
29e20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64  access. Try read
29e30 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  -only. */.      
29e40 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
29e50 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
29e60 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
29e70 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ATE);.      open
29e80 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57  Flags &= ~(O_RDW
29e90 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20  R|O_CREAT);.    
29ea0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
29eb0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
29ec0 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
29ed0 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
29ee0 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d      isReadonly =
29ef0 20 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72   1;.      fd = r
29f00 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65  obust_open(zName
29f10 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65  , openFlags, ope
29f20 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nMode);.    }.  
29f30 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
29f40 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
29f50 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
29f60 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
29f70 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n", zName);.    
29f80 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
29f90 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
29fa0 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30 20    assert( fd>=0 
29fb0 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61  );.  if( pOutFla
29fc0 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46  gs ){.    *pOutF
29fd0 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
29fe0 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e 75  }..  if( p->pUnu
29ff0 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70 55  sed ){.    p->pU
2a000 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a  nused->fd = fd;.
2a010 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e      p->pUnused->
2a020 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  flags = flags;. 
2a030 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65   }..  if( isDele
2a040 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  te ){.#if OS_VXW
2a050 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d  ORKS.    zPath =
2a060 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20 20   zName;.#else.  
2a070 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65    osUnlink(zName
2a080 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  );.#endif.  }.#i
2a090 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2a0a0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2a0b0 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65  else{.    p->ope
2a0c0 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
2a0d0 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  gs;.  }.#endif..
2a0e0 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45  #ifdef FD_CLOEXE
2a0f0 43 0a 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  C.  osFcntl(fd, 
2a100 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c  F_SETFD, osFcntl
2a110 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29  (fd, F_GETFD, 0)
2a120 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a   | FD_CLOEXEC);.
2a130 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b  #endif..  noLock
2a140 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45   = eType!=SQLITE
2a150 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a  _OPEN_MAIN_DB;..
2a160 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f    .#if defined(_
2a170 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c  _APPLE__) || SQL
2a180 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2a190 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66  NG_STYLE.  if( f
2a1a0 73 74 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e  statfs(fd, &fsIn
2a1b0 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) == -1 ){.   
2a1c0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69   ((unixFile*)pFi
2a1d0 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  le)->lastErrno =
2a1e0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 6f 62 75   errno;.    robu
2a1f0 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20  st_close(p, fd, 
2a200 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72  __LINE__);.    r
2a210 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2a220 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20  RR_ACCESS;.  }. 
2a230 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d   if (0 == strncm
2a240 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66  p("msdos", fsInf
2a250 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
2a260 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78  5)) {.    ((unix
2a270 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73  File*)pFile)->fs
2a280 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
2a290 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
2a2a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
2a2b0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2a2c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2a2d0 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45  #if SQLITE_PREFE
2a2e0 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a  R_PROXY_LOCKING.
2a2f0 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20    isAutoProxy = 
2a300 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  1;.#endif.  if( 
2a310 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28  isAutoProxy && (
2a320 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20  zPath!=NULL) && 
2a330 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66  (!noLock) && pVf
2a340 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  s->xOpen ){.    
2a350 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d  char *envforce =
2a360 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
2a370 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
2a380 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75  ING");.    int u
2a390 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20  seProxy = 0;..  
2a3a0 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43    /* SQLITE_FORC
2a3b0 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d  E_PROXY_LOCKING=
2a3c0 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61  =1 means force a
2a3d0 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c  lways use proxy,
2a3e0 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a   0 means .    **
2a3f0 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78 79   never use proxy
2a400 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65  , NULL means use
2a410 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c   proxy for non-l
2a420 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e  ocal files only.
2a430 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76    */.    if( env
2a440 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20  force!=NULL ){. 
2a450 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20       useProxy = 
2a460 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30  atoi(envforce)>0
2a470 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a480 20 20 20 69 66 28 20 73 74 61 74 66 73 28 7a 50     if( statfs(zP
2a490 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ath, &fsInfo) ==
2a4a0 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   -1 ){.        /
2a4b0 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65  * In theory, the
2a4c0 20 63 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c 20   close(fd) call 
2a4d0 69 73 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e 20  is sub-optimal. 
2a4e0 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
2a4f0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  ed.        ** wi
2a500 74 68 20 66 64 20 69 73 20 61 20 64 61 74 61 62  th fd is a datab
2a510 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 20 74 68  ase file, and th
2a520 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 63 6f  ere are other co
2a530 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a 20  nnections open. 
2a540 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 61         ** on tha
2a550 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
2a560 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e  currently holdin
2a570 67 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  g advisory locks
2a580 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20 20 20 20   on it,.        
2a590 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  ** then the call
2a5a0 20 74 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c 6c   to close() will
2a5b0 20 63 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c 6f   cancel those lo
2a5c0 63 6b 73 2e 20 49 6e 20 70 72 61 63 74 69 63 65  cks. In practice
2a5d0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 27  ,.        ** we'
2a5e0 72 65 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  re assuming that
2a5f0 20 73 74 61 74 66 73 28 29 20 64 6f 65 73 6e 27   statfs() doesn'
2a600 74 20 66 61 69 6c 20 76 65 72 79 20 6f 66 74 65  t fail very ofte
2a610 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20 20 20 20  n. At least.    
2a620 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c 65      ** not while
2a630 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
2a640 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 62  riptors opened b
2a650 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
2a660 73 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ss on.        **
2a670 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 61   the same file a
2a680 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a  re working.  */.
2a690 20 20 20 20 20 20 20 20 70 2d 3e 6c 61 73 74 45          p->lastE
2a6a0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
2a6b0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2a6c0 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(p, fd, __LINE
2a6d0 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  __);.        rc 
2a6e0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  = SQLITE_IOERR_A
2a6f0 43 43 45 53 53 3b 0a 20 20 20 20 20 20 20 20 67  CCESS;.        g
2a700 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
2a710 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
2a720 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73   useProxy = !(fs
2a730 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54  Info.f_flags&MNT
2a740 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  _LOCAL);.    }. 
2a750 20 20 20 69 66 28 20 75 73 65 50 72 6f 78 79 20     if( useProxy 
2a760 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  ){.      rc = fi
2a770 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66  llInUnixFile(pVf
2a780 73 2c 20 66 64 2c 20 73 79 6e 63 44 69 72 2c 20  s, fd, syncDir, 
2a790 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f  pFile, zPath, no
2a7a0 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
2a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7c0 69 73 44 65 6c 65 74 65 2c 20 69 73 52 65 61 64  isDelete, isRead
2a7d0 6f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 69 66 28  only);.      if(
2a7e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a7f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
2a800 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
2a810 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a  xFile((unixFile*
2a820 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22  )pFile, ":auto:"
2a830 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2a840 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2a860 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c   unixClose to cl
2a870 65 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75  ean up the resou
2a880 72 63 65 73 20 61 64 64 65 64 20 69 6e 20 66 69  rces added in fi
2a890 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20  llInUnixFile .  
2a8a0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63          ** and c
2a8b0 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72  lear all the str
2a8c0 75 63 74 75 72 65 27 73 20 72 65 66 65 72 65 6e  ucture's referen
2a8d0 63 65 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c  ces.  Specifical
2a8e0 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ly, .          *
2a8f0 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  * pFile->pMethod
2a900 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73  s will be NULL s
2a910 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65  o sqlite3OsClose
2a920 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70   will be a no-op
2a930 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20   .          */. 
2a940 20 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f           unixClo
2a950 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  se(pFile);.     
2a960 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2a970 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a980 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  }.      goto ope
2a990 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
2a9a0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  }.  }.#endif.  .
2a9b0 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
2a9c0 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20  xFile(pVfs, fd, 
2a9d0 73 79 6e 63 44 69 72 2c 20 70 46 69 6c 65 2c 20  syncDir, pFile, 
2a9e0 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20  zPath, noLock,. 
2a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa00 20 20 20 20 20 69 73 44 65 6c 65 74 65 2c 20 69       isDelete, i
2aa10 73 52 65 61 64 6f 6e 6c 79 29 3b 0a 6f 70 65 6e  sReadonly);.open
2aa20 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28  _finished:.  if(
2aa30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2aa40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
2aa50 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  ee(p->pUnused);.
2aa60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2aa70 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  .}.../*.** Delet
2aa80 65 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50  e the file at zP
2aa90 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53  ath. If the dirS
2aaa0 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ync argument is 
2aab0 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a  true, fsync().**
2aac0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61   the directory a
2aad0 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  fter deleting th
2aae0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
2aaf0 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65  c int unixDelete
2ab00 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2ab10 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a  *NotUsed,     /*
2ab20 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20   VFS containing 
2ab30 74 68 69 73 20 61 73 20 74 68 65 20 78 44 65 6c  this as the xDel
2ab40 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ete method */.  
2ab50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2ab60 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  h,        /* Nam
2ab70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
2ab80 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74  deleted */.  int
2ab90 20 64 69 72 53 79 6e 63 20 20 20 20 20 20 20 20   dirSync        
2aba0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
2abb0 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65 63  e, fsync() direc
2abc0 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
2abd0 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  ing file */.){. 
2abe0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2abf0 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  _OK;.  UNUSED_PA
2ac00 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2ac10 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
2ac20 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
2ac30 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b  E_IOERR_DELETE);
2ac40 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28  .  if( osUnlink(
2ac50 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 26 26 20  zPath)==(-1) && 
2ac60 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b  errno!=ENOENT ){
2ac70 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
2ac80 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2ac90 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75  IOERR_DELETE, "u
2aca0 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a  nlink", zPath);.
2acb0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
2acc0 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
2acd0 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63  NC.  if( dirSync
2ace0 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a   ){.    int fd;.
2acf0 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44      rc = osOpenD
2ad00 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20  irectory(zPath, 
2ad10 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &fd);.    if( rc
2ad20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23  ==SQLITE_OK ){.#
2ad30 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2ad40 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64      if( fsync(fd
2ad50 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20  )==-1 ).#else.  
2ad60 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64      if( fsync(fd
2ad70 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ) ).#endif.     
2ad80 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   {.        rc = 
2ad90 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
2ada0 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
2adb0 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50  YNC, "fsync", zP
2adc0 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
2add0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
2ade0 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (0, fd, __LINE__
2adf0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
2ae00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
2ae10 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63  OPEN ){.      rc
2ae20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2ae30 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
2ae40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2ae50 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78  *.** Test the ex
2ae60 69 73 74 61 6e 63 65 20 6f 66 20 6f 72 20 61 63  istance of or ac
2ae70 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
2ae80 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20   of file zPath. 
2ae90 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66  The.** test perf
2aea0 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e  ormed depends on
2aeb0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c   the value of fl
2aec0 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ags:.**.**     S
2aed0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
2aee0 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66  STS: Return 1 if
2aef0 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
2af00 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
2af10 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
2af20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
2af30 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e   file is read an
2af40 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20  d writable..**  
2af50 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
2af60 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72  _READONLY: Retur
2af70 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
2af80 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a  is readable..**.
2af90 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  ** Otherwise ret
2afa0 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
2afb0 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28   int unixAccess(
2afc0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2afd0 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54 68  NotUsed,   /* Th
2afe0 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67  e VFS containing
2aff0 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d 65   this xAccess me
2b000 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
2b010 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
2b020 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68 65    /* Path of the
2b030 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65   file to examine
2b040 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
2b050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b060 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e 74   What do we want
2b070 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74 20   to learn about 
2b080 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f 20  the zPath file? 
2b090 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  */.  int *pResOu
2b0a0 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
2b0b0 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f 6f  Write result boo
2b0c0 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  lean here */.){.
2b0d0 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b    int amode = 0;
2b0e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2b0f0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2b100 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
2b110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2b120 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a  OERR_ACCESS; );.
2b130 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20    switch( flags 
2b140 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
2b150 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
2b160 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
2b170 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  F_OK;.      brea
2b180 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
2b190 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
2b1a0 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  ITE:.      amode
2b1b0 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20   = W_OK|R_OK;.  
2b1c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
2b1d0 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
2b1e0 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20 61 6d  S_READ:.      am
2b1f0 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20  ode = R_OK;.    
2b200 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65    break;..    de
2b210 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
2b220 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c  ert(!"Invalid fl
2b230 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a  ags argument");.
2b240 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
2b250 20 28 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68   (osAccess(zPath
2b260 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20  , amode)==0);.  
2b270 69 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54  if( flags==SQLIT
2b280 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20  E_ACCESS_EXISTS 
2b290 26 26 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20  && *pResOut ){. 
2b2a0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
2b2b0 75 66 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f  uf;.    if( 0==o
2b2c0 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62 75  sStat(zPath, &bu
2b2d0 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69 7a  f) && buf.st_siz
2b2e0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  e==0 ){.      *p
2b2f0 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  ResOut = 0;.    
2b300 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
2b310 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
2b320 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
2b330 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
2b340 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
2b350 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20  e. The relative 
2b360 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65  path.** is store
2b370 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69  d as a nul-termi
2b380 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20  nated string in 
2b390 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
2b3a0 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74  ed to by.** zPat
2b3b0 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70  h. .**.** zOut p
2b3c0 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
2b3d0 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71  r of at least sq
2b3e0 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
2b3f0 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28  name bytes .** (
2b400 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41  in this case, MA
2b410 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73  X_PATHNAME bytes
2b420 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68  ). The full-path
2b430 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a   is written to.*
2b440 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65  * this buffer be
2b450 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
2b460 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2b470 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a  ixFullPathname(.
2b480 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2b490 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
2b4a0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
2b4b0 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  s object */.  co
2b4c0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
2b4d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2b4e0 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65  ossibly relative
2b4f0 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   input path */. 
2b500 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20   int nOut,      
2b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b520 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74  * Size of output
2b530 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
2b540 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74   */.  char *zOut
2b550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b560 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
2b570 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a  ffer */.){..  /*
2b580 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
2b590 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
2b5a0 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
2b5b0 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
2b5c0 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
2b5d0 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
2b5e0 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
2b5f0 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
2b600 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
2b610 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54  ction failing. T
2b620 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75  his function cou
2b630 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20  ld fail if, for 
2b640 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a  example, the.  *
2b650 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e  * current workin
2b660 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  g directory has 
2b670 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20  been unlinked.. 
2b680 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
2b690 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
2b6a0 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20  LITE_ERROR );.. 
2b6b0 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d   assert( pVfs->m
2b6c0 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50  xPathname==MAX_P
2b6d0 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55  ATHNAME );.  UNU
2b6e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
2b6f0 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75  fs);..  zOut[nOu
2b700 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69  t-1] = '\0';.  i
2b710 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27  f( zPath[0]=='/'
2b720 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2b730 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a  snprintf(nOut, z
2b740 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68  Out, "%s", zPath
2b750 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2b760 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66  int nCwd;.    if
2b770 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74 2c  ( osGetcwd(zOut,
2b780 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20   nOut-1)==0 ){. 
2b790 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
2b7a0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2b7b0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
2b7c0 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29 3b  getcwd", zPath);
2b7d0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64 20  .    }.    nCwd 
2b7e0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f  = (int)strlen(zO
2b7f0 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
2b800 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 6e  _snprintf(nOut-n
2b810 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d  Cwd, &zOut[nCwd]
2b820 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b  , "/%s", zPath);
2b830 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2b840 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66  LITE_OK;.}...#if
2b850 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b860 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
2b870 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
2b880 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
2b890 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
2b8a0 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
2b8b0 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
2b8c0 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
2b8d0 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
2b8e0 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
2b8f0 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64  ..*/.#include <d
2b900 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76  lfcn.h>.static v
2b910 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28  oid *unixDlOpen(
2b920 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2b930 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72  Used, const char
2b940 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
2b950 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2b960 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
2b970 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65  urn dlopen(zFile
2b980 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c  name, RTLD_NOW |
2b990 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d   RTLD_GLOBAL);.}
2b9a0 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ../*.** SQLite c
2b9b0 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
2b9c0 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  on immediately a
2b9d0 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75  fter a call to u
2b9e0 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a  nixDlSym() or.**
2b9f0 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61   unixDlOpen() fa
2ba00 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e  ils (returns a n
2ba10 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66  ull pointer). If
2ba20 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64   a more detailed
2ba30 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67   error.** messag
2ba40 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  e is available, 
2ba50 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  it is written to
2ba60 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20   zBufOut. If no 
2ba70 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
2ba80 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a   is available, z
2ba90 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75  BufOut is left u
2baa0 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51  nmodified and SQ
2bab0 4c 69 74 65 20 75 73 65 73 20 61 20 64 65 66 61  Lite uses a defa
2bac0 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73  ult.** error mes
2bad0 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sage..*/.static 
2bae0 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72  void unixDlError
2baf0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2bb00 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
2bb10 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b   char *zBufOut){
2bb20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2bb30 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  Err;.  UNUSED_PA
2bb40 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2bb50 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
2bb60 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64  ex();.  zErr = d
2bb70 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20  lerror();.  if( 
2bb80 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  zErr ){.    sqli
2bb90 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
2bba0 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22  f, zBufOut, "%s"
2bbb0 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75  , zErr);.  }.  u
2bbc0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2bbd0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  .}.static void (
2bbe0 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74  *unixDlSym(sqlit
2bbf0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2bc00 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20   void *p, const 
2bc10 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64  char*zSym))(void
2bc20 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43  ){.  /* .  ** GC
2bc30 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63  C with -pedantic
2bc40 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74 68 61  -errors says tha
2bc50 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61  t C90 does not a
2bc60 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20  llow a void* to 
2bc70 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74  be.  ** cast int
2bc80 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  o a pointer to a
2bc90 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20   function.  And 
2bca0 79 65 74 20 74 68 65 20 6c 69 62 72 61 72 79 20  yet the library 
2bcb0 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a  dlsym() routine.
2bcc0 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76    ** returns a v
2bcd0 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20 72 65  oid* which is re
2bce0 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
2bcf0 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53  o a function.  S
2bd00 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a  o how do we.  **
2bd10 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74   use dlsym() wit
2bd20 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f  h -pedantic-erro
2bd30 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  rs?.  **.  ** Va
2bd40 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69  riable x below i
2bd50 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20  s defined to be 
2bd60 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
2bd70 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20  unction taking. 
2bd80 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76   ** parameters v
2bd90 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63  oid* and const c
2bda0 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69  har* and returni
2bdb0 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ng a pointer to 
2bdc0 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a  a function..  **
2bdd0 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78   We initialize x
2bde0 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74   by assigning it
2bdf0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2be00 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69  e dlsym() functi
2be10 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61  on..  ** (That a
2be20 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  ssignment requir
2be30 65 73 20 61 20 63 61 73 74 2e 29 20 20 54 68 65  es a cast.)  The
2be40 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75  n we call the fu
2be50 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a  nction that.  **
2be60 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a   x points to.  .
2be70 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77    **.  ** This w
2be80 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e  ork-around is un
2be90 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63  likely to work c
2bea0 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20  orrectly on any 
2beb0 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a  system where.  *
2bec0 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e  * you really can
2bed0 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63 74  not cast a funct
2bee0 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f  ion pointer into
2bef0 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65   void*.  But the
2bf00 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f  n, on the.  ** o
2bf10 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d  ther hand, dlsym
2bf20 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  () will not work
2bf30 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74 65   on such a syste
2bf40 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20  m either, so we 
2bf50 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65  have.  ** not re
2bf60 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69  ally lost anythi
2bf70 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20  ng..  */.  void 
2bf80 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e  (*(*x)(void*,con
2bf90 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29  st char*))(void)
2bfa0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2bfb0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2bfc0 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28   x = (void(*(*)(
2bfd0 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
2bfe0 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b  *))(void))dlsym;
2bff0 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70  .  return (*x)(p
2c000 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69  , zSym);.}.stati
2c010 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f  c void unixDlClo
2c020 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  se(sqlite3_vfs *
2c030 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70  NotUsed, void *p
2c040 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45  Handle){.  UNUSE
2c050 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2c060 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28  sed);.  dlclose(
2c070 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73  pHandle);.}.#els
2c080 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f  e /* if SQLITE_O
2c090 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
2c0a0 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a  ON is defined: *
2c0b0 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  /.  #define unix
2c0c0 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66  DlOpen  0.  #def
2c0d0 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20  ine unixDlError 
2c0e0 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
2c0f0 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66  DlSym   0.  #def
2c100 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20  ine unixDlClose 
2c110 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
2c120 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73  Write nBuf bytes
2c130 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20   of random data 
2c140 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
2c150 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a  buffer zBuf..*/.
2c160 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
2c170 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
2c180 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2c190 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
2c1a0 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f  zBuf){.  UNUSED_
2c1b0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2c1c0 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69  d);.  assert((si
2c1d0 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65  ze_t)nBuf>=(size
2c1e0 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f  of(time_t)+sizeo
2c1f0 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20  f(int)));..  /* 
2c200 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69  We have to initi
2c210 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72  alize zBuf to pr
2c220 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66  event valgrind f
2c230 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20  rom reporting.  
2c240 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20  ** errors.  The 
2c250 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20 62  reports issued b
2c260 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69  y valgrind are i
2c270 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f  ncorrect - we wo
2c280 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20  uld.  ** prefer 
2c290 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e  that the randomn
2c2a0 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65 64  ess be increased
2c2b0 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f   by making use o
2c2c0 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69  f the.  ** unini
2c2d0 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69  tialized space i
2c2e0 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c  n zBuf - but val
2c2f0 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e  grind errors ten
2c300 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20  d to worry.  ** 
2c310 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74  some users.  Rat
2c320 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20  her than argue, 
2c330 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72 20  it seems easier 
2c340 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69  just to initiali
2c350 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c  ze.  ** the whol
2c360 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65  e array and sile
2c370 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76  nce valgrind, ev
2c380 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
2c390 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73   less randomness
2c3a0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e  .  ** in the ran
2c3b0 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20  dom seed..  **. 
2c3c0 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67   ** When testing
2c3d0 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a  , initializing z
2c3e0 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73  Buf[] to zero is
2c3f0 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61   all we do.  Tha
2c400 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61  t means.  ** tha
2c410 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  t we always use 
2c420 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20  the same random 
2c430 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e  number sequence.
2c440 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65    This makes the
2c450 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65  .  ** tests repe
2c460 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d  atable..  */.  m
2c470 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e  emset(zBuf, 0, n
2c480 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66 69 6e  Buf);.#if !defin
2c490 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
2c4a0 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 2c    {.    int pid,
2c4b0 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f   fd;.    fd = ro
2c4c0 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f  bust_open("/dev/
2c4d0 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e  urandom", O_RDON
2c4e0 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  LY, 0);.    if( 
2c4f0 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69  fd<0 ){.      ti
2c500 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69  me_t t;.      ti
2c510 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65  me(&t);.      me
2c520 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73  mcpy(zBuf, &t, s
2c530 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20  izeof(t));.     
2c540 20 70 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b   pid = getpid();
2c550 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  .      memcpy(&z
2c560 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20  Buf[sizeof(t)], 
2c570 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64  &pid, sizeof(pid
2c580 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
2c590 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65  ( sizeof(t)+size
2c5a0 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f 74  of(pid)<=(size_t
2c5b0 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20 6e  )nBuf );.      n
2c5c0 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29 20  Buf = sizeof(t) 
2c5d0 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20  + sizeof(pid);. 
2c5e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c5f0 64 6f 7b 20 6e 42 75 66 20 3d 20 6f 73 52 65 61  do{ nBuf = osRea
2c600 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66  d(fd, zBuf, nBuf
2c610 29 3b 20 7d 77 68 69 6c 65 28 20 6e 42 75 66 3c  ); }while( nBuf<
2c620 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
2c630 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73  R );.      robus
2c640 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f  t_close(0, fd, _
2c650 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a  _LINE__);.    }.
2c660 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
2c670 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a  urn nBuf;.}.../*
2c680 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
2c690 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
2c6a0 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
2c6b0 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
2c6c0 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
2c6d0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2c6e0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65   microseconds we
2c6f0 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a   want to sleep..
2c700 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
2c710 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lue is the numbe
2c720 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
2c730 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61  s of sleep actua
2c740 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  lly.** requested
2c750 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c   from the underl
2c760 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73  ying operating s
2c770 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20  ystem, a number 
2c780 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62  which.** might b
2c790 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
2c7a0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
2c7b0 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74  rgument, but not
2c7c0 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68   less.** than th
2c7d0 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  e argument..*/.s
2c7e0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c  tatic int unixSl
2c7f0 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
2c800 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69  *NotUsed, int mi
2c810 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66  croseconds){.#if
2c820 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
2c830 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 70  ruct timespec sp
2c840 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d  ;..  sp.tv_sec =
2c850 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20   microseconds / 
2c860 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76  1000000;.  sp.tv
2c870 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65  _nsec = (microse
2c880 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30 29  conds % 1000000)
2c890 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73   * 1000;.  nanos
2c8a0 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b  leep(&sp, NULL);
2c8b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2c8c0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2c8d0 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
2c8e0 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  nds;.#elif defin
2c8f0 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20  ed(HAVE_USLEEP) 
2c900 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20  && HAVE_USLEEP. 
2c910 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63   usleep(microsec
2c920 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  onds);.  UNUSED_
2c930 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2c940 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63  d);.  return mic
2c950 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65  roseconds;.#else
2c960 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d  .  int seconds =
2c970 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39   (microseconds+9
2c980 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a  99999)/1000000;.
2c990 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29    sleep(seconds)
2c9a0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2c9b0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2c9c0 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a   return seconds*
2c9d0 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a  1000000;.#endif.
2c9e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
2c9f0 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c  lowing variable,
2ca00 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e   if set to a non
2ca10 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20  -zero value, is 
2ca20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a  interpreted as.*
2ca30 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
2ca40 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
2ca50 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74  70 and is used t
2ca60 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  o set the result
2ca70 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73   of.** sqlite3Os
2ca80 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75  CurrentTime() du
2ca90 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f  ring testing..*/
2caa0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2cab0 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
2cac0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30  current_time = 0
2cad0 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65  ;  /* Fake syste
2cae0 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64  m time in second
2caf0 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f  s since 1970. */
2cb00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
2cb10 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
2cb20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
2cb30 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
2cb40 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74  ime).  Write int
2cb50 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20  o *piNow.** the 
2cb60 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
2cb70 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
2cb80 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d  n Day number tim
2cb90 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20  es 86_400_000.  
2cba0 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64  In.** other word
2cbb0 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70  s, write into *p
2cbc0 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20  iNow the number 
2cbd0 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
2cbe0 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e  since the Julian
2cbf0 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f  .** epoch of noo
2cc00 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f  n in Greenwich o
2cc10 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34  n November 24, 4
2cc20 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e  714 B.C accordin
2cc30 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c  g to the.** prol
2cc40 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20  eptic Gregorian 
2cc50 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20  calendar..**.** 
2cc60 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75  On success, retu
2cc70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52  rn SQLITE_OK.  R
2cc80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2cc90 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 61  OR if the time a
2cca0 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e  nd date .** cann
2ccb0 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
2ccc0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
2ccd0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
2cce0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2ccf0 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e  Used, sqlite3_in
2cd00 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73  t64 *piNow){.  s
2cd10 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2cd20 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70  te3_int64 unixEp
2cd30 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28  och = 24405875*(
2cd40 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
2cd50 34 30 30 30 30 3b 0a 20 20 69 6e 74 20 72 63 20  40000;.  int rc 
2cd60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66  = SQLITE_OK;.#if
2cd70 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54   defined(NO_GETT
2cd80 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a  OD).  time_t t;.
2cd90 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70    time(&t);.  *p
2cda0 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33  iNow = ((sqlite3
2cdb0 5f 69 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b  _int64)t)*1000 +
2cdc0 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69   unixEpoch;.#eli
2cdd0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
2cde0 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73  truct timespec s
2cdf0 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74  Now;.  clock_get
2ce00 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54  time(CLOCK_REALT
2ce10 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a  IME, &sNow);.  *
2ce20 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63  piNow = unixEpoc
2ce30 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65  h + 1000*(sqlite
2ce40 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f  3_int64)sNow.tv_
2ce50 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73  sec + sNow.tv_ns
2ce60 65 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73  ec/1000000;.#els
2ce70 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  e.  struct timev
2ce80 61 6c 20 73 4e 6f 77 3b 0a 20 20 69 66 28 20 67  al sNow;.  if( g
2ce90 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f  ettimeofday(&sNo
2cea0 77 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  w, 0)==0 ){.    
2ceb0 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f  *piNow = unixEpo
2cec0 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74  ch + 1000*(sqlit
2ced0 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76  e3_int64)sNow.tv
2cee0 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75  _sec + sNow.tv_u
2cef0 73 65 63 2f 31 30 30 30 3b 0a 20 20 7d 65 6c 73  sec/1000;.  }els
2cf00 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
2cf10 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65  TE_ERROR;.  }.#e
2cf20 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
2cf30 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
2cf40 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
2cf50 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f  ime ){.    *piNo
2cf60 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65  w = 1000*(sqlite
2cf70 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f  3_int64)sqlite3_
2cf80 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75  current_time + u
2cf90 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65  nixEpoch;.  }.#e
2cfa0 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41  ndif.  UNUSED_PA
2cfb0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2cfc0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2cfd0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
2cfe0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
2cff0 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
2d000 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
2d010 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72  Write the.** cur
2d020 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
2d030 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
2d040 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ay number into *
2d050 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74  prNow and.** ret
2d060 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
2d070 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
2d080 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
2d090 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
2d0a0 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74   int unixCurrent
2d0b0 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Time(sqlite3_vfs
2d0c0 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c   *NotUsed, doubl
2d0d0 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c  e *prNow){.  sql
2d0e0 69 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20 30  ite3_int64 i = 0
2d0f0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e  ;.  int rc;.  UN
2d100 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2d110 6f 74 55 73 65 64 29 3b 0a 20 20 72 63 20 3d 20  otUsed);.  rc = 
2d120 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49  unixCurrentTimeI
2d130 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a  nt64(0, &i);.  *
2d140 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30  prNow = i/864000
2d150 30 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20 72  00.0;.  return r
2d160 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61  c;.}../*.** We a
2d170 64 64 65 64 20 74 68 65 20 78 47 65 74 4c 61 73  dded the xGetLas
2d180 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20  tError() method 
2d190 77 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74 69  with the intenti
2d1a0 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a  on of providing.
2d1b0 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65  ** better low-le
2d1c0 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67  vel error messag
2d1d0 65 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e  es when operatin
2d1e0 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d  g-system problem
2d1f0 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72  s come up.** dur
2d200 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61  ing SQLite opera
2d210 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66 61  tion.  But so fa
2d220 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20  r, none of that 
2d230 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65  has been impleme
2d240 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63  nted.** in the c
2d250 6f 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72 6f  ore.  So this ro
2d260 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
2d270 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c  alled.  For now,
2d280 20 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a   it is merely.**
2d290 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e   a place-holder.
2d2a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2d2b0 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  nixGetLastError(
2d2c0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2d2d0 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
2d2e0 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65  d2, char *NotUse
2d2f0 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d3){.  UNUSED_PA
2d300 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2d310 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2d320 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a  ETER(NotUsed2);.
2d330 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2d340 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20  ER(NotUsed3);.  
2d350 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
2d360 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2d370 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
2d380 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
2d390 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
2d3a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d3b0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2d3c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d3d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d3e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
2d400 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
2d410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d450 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
2d460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
2d470 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67  in Proxy Locking
2d480 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
2d490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d4a0 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f  *.**.** Proxy lo
2d4b0 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65 72  cking is a "uber
2d4c0 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22  -locking-method"
2d4d0 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20   in this sense: 
2d4e0 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20   It uses the.** 
2d4f0 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65  other locking me
2d500 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61  thods on seconda
2d510 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20  ry lock files.  
2d520 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
2d530 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72   a.** meta-layer
2d540 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65   over top of the
2d550 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69   primitive locki
2d560 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  ng implemented a
2d570 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  bove.  For.** th
2d580 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64  is reason, the d
2d590 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70  ivision that imp
2d5a0 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79  lements of proxy
2d5b0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65   locking is defe
2d5c0 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61  rred.** until la
2d5d0 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28  te in the file (
2d5e0 68 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20  here) after all 
2d5f0 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f  of the other I/O
2d600 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a   methods have.**
2d610 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20   been defined - 
2d620 73 6f 20 74 68 61 74 20 74 68 65 20 70 72 69 6d  so that the prim
2d630 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  itive locking me
2d640 74 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61  thods are availa
2d650 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63  ble.** as servic
2d660 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20  es to help with 
2d670 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
2d680 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b  on of proxy lock
2d690 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a  ing..**.****.**.
2d6a0 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c  ** The default l
2d6b0 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69  ocking schemes i
2d6c0 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79 74  n SQLite use byt
2d6d0 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e  e-range locks on
2d6e0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2d6f0 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e   file to coordin
2d700 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72  ate safe, concur
2d710 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d  rent access by m
2d720 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a  ultiple readers.
2d730 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b  ** and writers [
2d740 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  http://sqlite.or
2d750 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c  g/lockingv3.html
2d760 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69 6c  ].  The five fil
2d770 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61  e locking.** sta
2d780 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50  tes (UNLOCKED, P
2d790 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20  ENDING, SHARED, 
2d7a0 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53  RESERVED, EXCLUS
2d7b0 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  IVE) are impleme
2d7c0 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58  nted.** as POSIX
2d7d0 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f   read & write lo
2d7e0 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20 73  cks over fixed s
2d7f0 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20  et of locations 
2d800 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20  (via fsctl),.** 
2d810 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f  on AFP and SMB o
2d820 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62 79  nly exclusive by
2d830 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
2d840 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61  re available via
2d850 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f   fsctl.** with _
2d860 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
2d870 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
2d880 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20  ckPB2) to track 
2d890 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74 65  the same 5 state
2d8a0 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74  s..** To simulat
2d8b0 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74  e a F_RDLCK on t
2d8c0 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c  he shared range,
2d8d0 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d   on AFP a random
2d8e0 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61  ly selected.** a
2d8f0 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73 68  ddress in the sh
2d900 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
2d910 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44  ken for a SHARED
2d920 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72   lock, the entir
2d930 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67  e.** shared rang
2d940 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
2d950 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2d960 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45  ):.**.**      PE
2d970 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20  NDING_BYTE      
2d980 20 20 30 78 34 30 30 30 30 30 30 30 09 09 20 20    0x40000000..  
2d990 20 09 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52   ..**      RESER
2d9a0 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20 30  VED_BYTE       0
2d9b0 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20  x40000001.**    
2d9c0 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20    SHARED_RANGE  
2d9d0 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 32        0x40000002
2d9e0 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a   -> 0x40000200.*
2d9f0 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
2da00 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  well on the loca
2da10 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62  l file system, b
2da20 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c  ut shows a nearl
2da30 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f  y 100x.** slowdo
2da40 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f  wn in read perfo
2da50 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65  rmance on AFP be
2da60 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63 6c  cause the AFP cl
2da70 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a  ient disables.**
2da80 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65 20   the read cache 
2da90 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20  when byte-range 
2daa0 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e  locks are presen
2dab0 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65  t.  Enabling the
2dac0 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65   read.** cache e
2dad0 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20 63  xposes a cache c
2dae0 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d  oherency problem
2daf0 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74   that is present
2db00 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20   on all OS X.** 
2db10 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72  supported networ
2db20 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20  k file systems. 
2db30 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74   NFS and AFP bot
2db40 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a  h observe the.**
2db50 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73   close-to-open s
2db60 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73  emantics for ens
2db70 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65  uring cache cohe
2db80 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f  rency.** [http:/
2db90 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65  /nfs.sourceforge
2dba0 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77  .net/#faq_a8], w
2dbb0 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66  hich does not ef
2dbc0 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64  fectively.** add
2dbd0 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72 65  ress the require
2dbe0 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72  ments for concur
2dbf0 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61 63  rent database ac
2dc00 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65  cess by multiple
2dc10 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20  .** readers and 
2dc20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70  writers.** [http
2dc30 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f  ://www.nabble.co
2dc40 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d  m/SQLite-on-NFS-
2dc50 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d  cache-coherency-
2dc60 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d  td15655701.html]
2dc70 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65  ..**.** To addre
2dc80 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e  ss the performan
2dc90 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68  ce and cache coh
2dca0 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70  erency issues, p
2dcb0 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  roxy file lockin
2dcc0 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65  g.** changes the
2dcd0 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61 63   way database ac
2dce0 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c  cess is controll
2dcf0 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61  ed by limiting a
2dd00 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69  ccess to a.** si
2dd10 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74  ngle host at a t
2dd20 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66  ime and moving f
2dd30 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66  ile locks off of
2dd40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2dd50 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61  le.** and onto a
2dd60 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74   proxy file on t
2dd70 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
2dd80 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a  stem.  .**.**.**
2dd90 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63   Using proxy loc
2dda0 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ks.** ----------
2ddb0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20  -------.**.** C 
2ddc0 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69  APIs.**.**  sqli
2ddd0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
2dde0 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c  (db, dbname, SQL
2ddf0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
2de00 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20  YFILE,.**       
2de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22  <proxy_path> | "
2de30 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71  :auto:");.**  sq
2de40 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
2de50 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
2de60 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
2de70 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78 79  OXYFILE, &<proxy
2de80 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a  _path>);.**.**.*
2de90 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a  * SQL pragmas.**
2dea0 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74  .**  PRAGMA [dat
2deb0 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  abase.]lock_prox
2dec0 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61  y_file=<proxy_pa
2ded0 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20  th> | :auto:.** 
2dee0 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
2def0 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
2df00 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79  le.**.** Specify
2df10 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61  ing ":auto:" mea
2df20 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72 65  ns that if there
2df30 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65   is a conch file
2df40 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67   with a matching
2df50 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69  .** host ID in i
2df60 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61 74  t, the proxy pat
2df70 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  h in the conch f
2df80 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ile will be used
2df90 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61  , otherwise.** a
2dfa0 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73 65   proxy path base
2dfb0 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20  d on the user's 
2dfc0 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61  temp dir.** (via
2dfd0 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52   confstr(_CS_DAR
2dfe0 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
2dff0 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20  R,...)) will be 
2e000 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
2e010 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c  actual proxy fil
2e020 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61  e name is genera
2e030 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d  ted from the nam
2e040 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68  e and path of th
2e050 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
2e060 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  le.  For example
2e070 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f  :.**.**       Fo
2e080 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68 20  r database path 
2e090 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64  "/Users/me/foo.d
2e0a0 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65  b" .**       The
2e0b0 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20   lock path will 
2e0c0 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c  be "<tmpdir>/sql
2e0d0 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73  iteplocks/_Users
2e0e0 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a  _me_foo.db:auto:
2e0f0 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20  ").**.** Once a 
2e100 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f  lock proxy is co
2e110 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20 64  nfigured for a d
2e120 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2e130 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a  on, it can not.*
2e140 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f  * be removed, ho
2e150 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65 20  wever it may be 
2e160 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64 69  switched to a di
2e170 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61  fferent proxy pa
2e180 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62  th via.** the ab
2e190 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d 69  ove APIs (assumi
2e1a0 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  ng the conch fil
2e1b0 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68  e is not being h
2e1c0 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a  eld by another.*
2e1d0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20  * connection or 
2e1e0 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a  process). .**.**
2e1f0 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f  .** How proxy lo
2e200 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d  cking works.** -
2e210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e220 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f  ------.**.** Pro
2e230 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  xy file locking 
2e240 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79  relies primarily
2e250 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70   on two new supp
2e260 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a  orting files: .*
2e270 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20  *.**   *  conch 
2e280 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63  file to limit ac
2e290 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
2e2a0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73  base file to a s
2e2b0 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20  ingle host.**   
2e2c0 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a     at a time.**.
2e2d0 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69  **   *  proxy fi
2e2e0 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20 70  le to act as a p
2e2f0 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64 76  roxy for the adv
2e300 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d  isory locks norm
2e310 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b  ally.**      tak
2e320 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
2e330 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  se.**.** The con
2e340 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65  ch file - to use
2e350 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73   a proxy file, s
2e360 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73 74  qlite must first
2e370 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68   "hold the conch
2e380 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61  ".** by taking a
2e390 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73  n sqlite-style s
2e3a0 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
2e3b0 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65  e conch file, re
2e3c0 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  ading the.** con
2e3d0 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72  tents and compar
2e3e0 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20 75  ing the host's u
2e3f0 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28 73  nique host ID (s
2e400 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f  ee below) and lo
2e410 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68  ck.** proxy path
2e420 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c   against the val
2e430 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
2e440 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f  e conch.  The co
2e450 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73  nch file is.** s
2e460 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d  tored in the sam
2e470 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74  e directory as t
2e480 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e490 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61   and the file na
2e4a0 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e  me.** is pattern
2e4b0 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61 74  ed after the dat
2e4c0 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2e4d0 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61  as ".<databasena
2e4e0 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49  me>-conch"..** I
2e4f0 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
2e500 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
2e510 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e 74   or it's content
2e520 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74  s do not match t
2e530 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e  he.** host ID an
2e540 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c  d/or proxy path,
2e550 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69   then the lock i
2e560 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61  s escalated to a
2e570 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c  n exclusive.** l
2e580 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63  ock and the conc
2e590 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20  h file contents 
2e5a0 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20  is updated with 
2e5b0 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20  the host ID and 
2e5c0 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e  proxy.** path an
2e5d0 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f  d the lock is do
2e5e0 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73 68  wngraded to a sh
2e5f0 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e  ared lock again.
2e600 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a    If the conch.*
2e610 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f  * is held by ano
2e620 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 77 69  ther process (wi
2e630 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  th a shared lock
2e640 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ), the exclusive
2e650 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61   lock.** will fa
2e660 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55  il and SQLITE_BU
2e670 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  SY is returned..
2e680 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  **.** The proxy 
2e690 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d  file - a single-
2e6a0 62 79 74 65 20 66 69 6c 65 20 75 73 65 64 20 66  byte file used f
2e6b0 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20  or all advisory 
2e6c0 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f  file locks.** no
2e6d0 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20  rmally taken on 
2e6e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e6f0 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  e.   This allows
2e700 20 66 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e   for safe sharin
2e710 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  g.** of the data
2e720 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75  base file for mu
2e730 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61  ltiple readers a
2e740 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68  nd writers on th
2e750 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28  e same.** host (
2e760 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65  the conch ensure
2e770 73 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20  s that they all 
2e780 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63  use the same loc
2e790 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a  al lock file)..*
2e7a0 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20  *.** Requesting 
2e7b0 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64  the lock proxy d
2e7c0 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74  oes not immediat
2e7d0 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e  ely take the con
2e7e0 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c  ch, it is.** onl
2e7f0 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65  y taken when the
2e800 20 66 69 72 73 74 20 72 65 71 75 65 73 74 20 74   first request t
2e810 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20  o lock database 
2e820 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a  file is made.  .
2e830 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  ** This matches 
2e840 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66  the semantics of
2e850 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c   the traditional
2e860 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   locking behavio
2e870 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e  r, where.** open
2e880 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ing a connection
2e890 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
2e8a0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b  ile does not tak
2e8b0 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a  e a lock on it..
2e8c0 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f  ** The shared lo
2e8d0 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66  ck and an open f
2e8e0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
2e8f0 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e  re maintained un
2e900 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e  til .** the conn
2e910 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61  ection to the da
2e920 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64  tabase is closed
2e930 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  . .**.** The pro
2e940 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  xy file and the 
2e950 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65  lock file are ne
2e960 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74  ver deleted so t
2e970 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a  hey only need.**
2e980 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 74   to be created t
2e990 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
2e9a0 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a  ey are used..**.
2e9b0 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ** Configuration
2e9c0 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d   options.** ----
2e9d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e9e0 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f  -.**.**  SQLITE_
2e9f0 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
2ea00 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  KING.**.**      
2ea10 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   Database files 
2ea20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d  accessed on non-
2ea30 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
2ea40 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20  ms are.**       
2ea50 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f  automatically co
2ea60 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f  nfigured for pro
2ea70 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b  xy locking, lock
2ea80 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20   files are.**   
2ea90 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61      named automa
2eaa0 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68  tically using th
2eab0 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a  e same logic as.
2eac0 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41 20  **       PRAGMA 
2ead0 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
2eae0 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a  ":auto:".**    .
2eaf0 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59  **  SQLITE_PROXY
2eb00 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20  _DEBUG.**.**    
2eb10 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c     Enables the l
2eb20 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20  ogging of error 
2eb30 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67 20  messages during 
2eb40 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20  host id file.** 
2eb50 20 20 20 20 20 20 72 65 74 72 69 65 76 61 6c 20        retrieval 
2eb60 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a  and creation.**.
2eb70 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  **  LOCKPROXYDIR
2eb80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65  .**.**       Ove
2eb90 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61 75  rrides the defau
2eba0 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73 65  lt directory use
2ebb0 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79  d for lock proxy
2ebc0 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20   files that.**  
2ebd0 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61       are named a
2ebe0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61  utomatically via
2ebf0 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65   the ":auto:" se
2ec00 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c  tting.**.**  SQL
2ec10 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
2ec20 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
2ec30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72  .**.**       Per
2ec40 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20  missions to use 
2ec50 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20  when creating a 
2ec60 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74  directory for st
2ec70 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20  oring the.**    
2ec80 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69     lock proxy fi
2ec90 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77  les, only used w
2eca0 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  hen LOCKPROXYDIR
2ecb0 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20   is not set..** 
2ecc0 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73     .**    .** As
2ecd0 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65   mentioned above
2ece0 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20  , when compiled 
2ecf0 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46  with SQLITE_PREF
2ed00 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
2ed10 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65  ,.** setting the
2ed20 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
2ed30 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52  iable SQLITE_FOR
2ed40 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
2ed50 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f   to 1 will.** fo
2ed60 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  rce proxy lockin
2ed70 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  g to be used for
2ed80 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
2ed90 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64  file opened, and
2eda0 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65   0.** will force
2edb0 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79   automatic proxy
2edc0 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64   locking to be d
2edd0 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20  isabled for all 
2ede0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
2edf0 73 20 28 65 78 70 6c 69 63 69 74 79 20 63 61 6c  s (explicity cal
2ee00 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f  ling the SQLITE_
2ee10 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
2ee20 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73  E pragma or.** s
2ee30 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72  qlite_file_contr
2ee40 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66  ol API is not af
2ee50 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54 45  fected by SQLITE
2ee60 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
2ee70 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  KING)..*/../*.**
2ee80 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
2ee90 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
2eea0 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23   on MacOSX .*/.#
2eeb0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2eec0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2eed0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2eee0 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  TYLE../*.** The 
2eef0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2ef00 65 78 74 20 68 61 73 20 74 68 65 20 70 61 74 68  ext has the path
2ef10 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74   and file struct
2ef20 75 72 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d  ures for the rem
2ef30 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61  ote .** and loca
2ef40 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e  l proxy files in
2ef50 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73   it.*/.typedef s
2ef60 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69  truct proxyLocki
2ef70 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c  ngContext proxyL
2ef80 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73  ockingContext;.s
2ef90 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69  truct proxyLocki
2efa0 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e  ngContext {.  un
2efb0 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
2efc0 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  e;         /* Op
2efd0 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  en conch file */
2efe0 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69  .  char *conchFi
2eff0 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  lePath;         
2f000 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
2f010 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75  onch file */.  u
2f020 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
2f030 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  xy;         /* O
2f040 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  pen proxy lock f
2f050 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c  ile */.  char *l
2f060 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20  ockProxyPath;   
2f070 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2f080 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
2f090 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2f0a0 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  dbPath;         
2f0b0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2f0c0 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
2f0d0 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65  */.  int conchHe
2f0e0 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
2f0f0 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f    /* 1 if the co
2f100 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20  nch is held, -1 
2f110 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20  if lockless */. 
2f120 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e   void *oldLockin
2f130 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a  gContext;     /*
2f140 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e   Original lockin
2f150 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74  gcontext to rest
2f160 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a  ore on close */.
2f170 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74    sqlite3_io_met
2f180 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64  hods const *pOld
2f190 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f  Method;     /* O
2f1a0 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68  riginal I/O meth
2f1b0 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f  ods for close */
2f1c0 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20  .};../* .** The 
2f1d0 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
2f1e0 70 61 74 68 20 66 6f 72 20 74 68 65 20 64 61 74  path for the dat
2f1f0 61 62 61 73 65 20 61 74 20 64 62 50 61 74 68 20  abase at dbPath 
2f200 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2f210 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68  lPath, .** which
2f220 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76   must point to v
2f230 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d  alid, writable m
2f240 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75  emory large enou
2f250 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20  gh for a maxLen 
2f260 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70  length.** file p
2f270 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ath. .*/.static 
2f280 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b  int proxyGetLock
2f290 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  Path(const char 
2f2a0 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c  *dbPath, char *l
2f2b0 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78  Path, size_t max
2f2c0 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b  Len){.  int len;
2f2d0 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20  .  int dbLen;.  
2f2e0 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c  int i;..#ifdef L
2f2f0 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65  OCKPROXYDIR.  le
2f300 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74  n = strlcpy(lPat
2f310 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c  h, LOCKPROXYDIR,
2f320 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a   maxLen);.#else.
2f330 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57  # ifdef _CS_DARW
2f340 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
2f350 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f  .  {.    if( !co
2f360 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e  nfstr(_CS_DARWIN
2f370 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20  _USER_TEMP_DIR, 
2f380 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29  lPath, maxLen) )
2f390 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
2f3a0 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66  ("GETLOCKPATH  f
2f3b0 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25  ailed %s errno=%
2f3c0 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  d pid=%d\n",.   
2f3d0 20 20 20 20 20 20 20 20 20 20 20 20 6c 50 61 74              lPat
2f3e0 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69 64  h, errno, getpid
2f3f0 28 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ()));.      retu
2f400 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2f410 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LOCK;.    }.    
2f420 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50  len = strlcat(lP
2f430 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63  ath, "sqliteploc
2f440 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20  ks", maxLen);   
2f450 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c   .  }.# else.  l
2f460 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61  en = strlcpy(lPa
2f470 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78  th, "/tmp/", max
2f480 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65  Len);.# endif.#e
2f490 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74  ndif..  if( lPat
2f4a0 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b  h[len-1]!='/' ){
2f4b0 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  .    len = strlc
2f4c0 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d  at(lPath, "/", m
2f4d0 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20  axLen);.  }.  . 
2f4e0 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68   /* transform th
2f4f0 65 20 64 62 20 70 61 74 68 20 74 6f 20 61 20 75  e db path to a u
2f500 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65  nique cache name
2f510 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69   */.  dbLen = (i
2f520 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68  nt)strlen(dbPath
2f530 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69  );.  for( i=0; i
2f540 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e  <dbLen && (i+len
2f550 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b  +7)<(int)maxLen;
2f560 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
2f570 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20  c = dbPath[i];. 
2f580 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20     lPath[i+len] 
2f590 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63  = (c=='/')?'_':c
2f5a0 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b  ;.  }.  lPath[i+
2f5b0 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72  len]='\0';.  str
2f5c0 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75  lcat(lPath, ":au
2f5d0 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20  to:", maxLen);. 
2f5e0 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f   OSTRACE(("GETLO
2f5f0 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f  CKPATH  proxy lo
2f600 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
2f610 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74  d\n", lPath, get
2f620 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72  pid()));.  retur
2f630 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2f640 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20  /* . ** Creates 
2f650 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e  the lock file an
2f660 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69  d any missing di
2f670 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63  rectories in loc
2f680 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63  kPath. */.static
2f690 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65   int proxyCreate
2f6a0 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
2f6b0 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a  har *lockPath){.
2f6c0 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20    int i, len;.  
2f6d0 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48  char buf[MAXPATH
2f6e0 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72  LEN];.  int star
2f6f0 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65  t = 0;.  .  asse
2f700 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c  rt(lockPath!=NUL
2f710 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20  L);.  /* try to 
2f720 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69  create all the i
2f730 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72 65  ntermediate dire
2f740 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e  ctories */.  len
2f750 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c   = (int)strlen(l
2f760 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b  ockPath);.  buf[
2f770 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d  0] = lockPath[0]
2f780 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c  ;.  for( i=1; i<
2f790 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  len; i++ ){.    
2f7a0 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20  if( lockPath[i] 
2f7b0 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73  == '/' && (i - s
2f7c0 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20  tart > 0) ){.   
2f7d0 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72     /* only mkdir
2f7e0 20 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20   if leaf dir != 
2f7f0 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e  "." or "/" or ".
2f800 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ." */.      if( 
2f810 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d  i-start>2 || (i-
2f820 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b  start==1 && buf[
2f830 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26  start] != '.' &&
2f840 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
2f850 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  /') .         ||
2f860 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20   (i-start==2 && 
2f870 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e  buf[start] != '.
2f880 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31  ' && buf[start+1
2f890 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20  ] != '.') ){.   
2f8a0 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27       buf[i]='\0'
2f8b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 73  ;.        if( os
2f8c0 4d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54  Mkdir(buf, SQLIT
2f8d0 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
2f8e0 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20  IR_PERMISSIONS) 
2f8f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
2f900 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20   err=errno;.    
2f910 20 20 20 20 20 20 69 66 28 20 65 72 72 21 3d 45        if( err!=E
2f920 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20  EXIST ) {.      
2f930 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
2f940 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20  CREATELOCKPATH  
2f950 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20  FAILED creating 
2f960 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %s, ".          
2f970 20 20 20 20 20 20 20 20 20 20 20 22 27 25 73 27             "'%s'
2f980 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
2f990 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20  =%s pid=%d\n",. 
2f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9b0 20 20 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f      buf, strerro
2f9c0 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68  r(err), lockPath
2f9d0 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
2f9e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2f9f0 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20   err;.          
2fa00 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2fa10 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d    }.      start=
2fa20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  i+1;.    }.    b
2fa30 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68  uf[i] = lockPath
2fa40 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  [i];.  }.  OSTRA
2fa50 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50  CE(("CREATELOCKP
2fa60 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20  ATH  proxy lock 
2fa70 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
2fa80 22 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74  ", lockPath, get
2fa90 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72  pid()));.  retur
2faa0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n 0;.}../*.** Cr
2fab0 65 61 74 65 20 61 20 6e 65 77 20 56 46 53 20 66  eate a new VFS f
2fac0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
2fad0 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
2fae0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
2faf0 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
2fb00 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66  ) and open the f
2fb10 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22  ile named "path"
2fb20 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73   in the file des
2fb30 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  criptor..**.** T
2fb40 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
2fb50 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c  ponsible not onl
2fb60 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68  y for closing th
2fb70 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2fb80 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f  r.** but also fo
2fb90 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65  r freeing the me
2fba0 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
2fbb0 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 64 65  with the file de
2fbc0 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61  scriptor..*/.sta
2fbd0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65  tic int proxyCre
2fbe0 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20  ateUnixFile(.   
2fbf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
2fc00 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74  h,        /* pat
2fc10 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e  h for the new un
2fc20 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e  ixFile */.    un
2fc30 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c  ixFile **ppFile,
2fc40 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69         /* unixFi
2fc50 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 72  le created and r
2fc60 65 74 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a  eturned by ref *
2fc70 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b  /.    int islock
2fc80 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f  file           /
2fc90 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69  * if non zero mi
2fca0 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20  ssing dirs will 
2fcb0 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20  be created */.) 
2fcc0 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  {.  int fd = -1;
2fcd0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
2fce0 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
2fcf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f  LITE_OK;.  int o
2fd00 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57  penFlags = O_RDW
2fd10 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73  R | O_CREAT;.  s
2fd20 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79  qlite3_vfs dummy
2fd30 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e  Vfs;.  int terrn
2fd40 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75  o = 0;.  UnixUnu
2fd50 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
2fd60 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20   NULL;..  /* 1. 
2fd70 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65  first try to ope
2fd80 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c  n/create the fil
2fd90 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61  e.  ** 2. if tha
2fda0 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69  t fails, and thi
2fdb0 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65  s is a lock file
2fdc0 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72   (not-conch), tr
2fdd0 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20  y creating.  ** 
2fde0 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63  the parent direc
2fdf0 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20  tories and then 
2fe00 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20  try again..  ** 
2fe10 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  3. if that fails
2fe20 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68  , try to open th
2fe30 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79  e file read-only
2fe40 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  .  ** otherwise 
2fe50 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66 20  return BUSY (if 
2fe60 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41  lock file) or CA
2fe70 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63  NTOPEN for the c
2fe80 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20  onch file.  */. 
2fe90 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52   pUnused = findR
2fea0 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20  eusableFd(path, 
2feb0 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66  openFlags);.  if
2fec0 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
2fed0 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66   fd = pUnused->f
2fee0 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
2fef0 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65  pUnused = sqlite
2ff00 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
2ff10 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20  *pUnused));.    
2ff20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a  if( !pUnused ){.
2ff30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2ff40 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2ff50 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
2ff60 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  ){.    fd = robu
2ff70 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
2ff80 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f  enFlags, SQLITE_
2ff90 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
2ffa0 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74  MISSIONS);.    t
2ffb0 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  errno = errno;. 
2ffc0 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65     if( fd<0 && e
2ffd0 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20  rrno==ENOENT && 
2ffe0 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20  islockfile ){.  
2fff0 20 20 20 20 69 66 28 20 70 72 6f 78 79 43 72 65      if( proxyCre
30000 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68  ateLockPath(path
30010 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  ) == SQLITE_OK )
30020 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20 72  {.        fd = r
30030 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c  obust_open(path,
30040 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49   openFlags, SQLI
30050 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
30060 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
30070 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
30080 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
30090 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f    openFlags = O_
300a0 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d  RDONLY;.    fd =
300b0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
300c0 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51  h, openFlags, SQ
300d0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
300e0 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
300f0 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72      terrno = err
30100 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64  no;.  }.  if( fd
30110 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  <0 ){.    if( is
30120 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20  lockfile ){.    
30130 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30140 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BUSY;.    }.    
30150 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20  switch (terrno) 
30160 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45 41 43  {.      case EAC
30170 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74  CES:.        ret
30180 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
30190 0a 20 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a  .      case EIO:
301a0 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e   .        return
301b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
301c0 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75  CK; /* even thou
301d0 67 68 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e  gh it is the con
301e0 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61  ch */.      defa
301f0 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74  ult:.        ret
30200 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
30210 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
30220 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20    }.  .  pNew = 
30230 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69  (unixFile *)sqli
30240 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
30250 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28  f(*pNew));.  if(
30260 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20   pNew==NULL ){. 
30270 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
30280 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65  OMEM;.    goto e
30290 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b  nd_create_proxy;
302a0 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e  .  }.  memset(pN
302b0 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  ew, 0, sizeof(un
302c0 69 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77  ixFile));.  pNew
302d0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70  ->openFlags = op
302e0 65 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65  enFlags;.  memse
302f0 74 28 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20  t(&dummyVfs, 0, 
30300 73 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73 29  sizeof(dummyVfs)
30310 29 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41  );.  dummyVfs.pA
30320 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29  ppData = (void*)
30330 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  &autolockIoFinde
30340 72 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e  r;.  dummyVfs.zN
30350 61 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20  ame = "dummy";. 
30360 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66   pUnused->fd = f
30370 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c  d;.  pUnused->fl
30380 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b  ags = openFlags;
30390 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64  .  pNew->pUnused
303a0 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20   = pUnused;.  . 
303b0 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78   rc = fillInUnix
303c0 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20  File(&dummyVfs, 
303d0 66 64 2c 20 30 2c 20 28 73 71 6c 69 74 65 33 5f  fd, 0, (sqlite3_
303e0 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74 68  file*)pNew, path
303f0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
30400 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30410 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d  ){.    *ppFile =
30420 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72   pNew;.    retur
30430 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
30440 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78  .end_create_prox
30450 79 3a 20 20 20 20 0a 20 20 72 6f 62 75 73 74 5f  y:    .  robust_
30460 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64 2c 20  close(pNew, fd, 
30470 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c  __LINE__);.  sql
30480 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
30490 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
304a0 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75  pUnused);.  retu
304b0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
304c0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20   SQLITE_TEST./* 
304d0 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c  simulate multipl
304e0 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74  e hosts by creat
304f0 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69  ing unique hosti
30500 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a  d file paths */.
30510 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74  int sqlite3_host
30520 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64  id_num = 0;.#end
30530 69 66 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58  if..#define PROX
30540 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31  Y_HOSTIDLEN    1
30550 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65  6  /* conch file
30560 20 68 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20   host id length 
30570 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79  */../* Not alway
30580 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  s defined in the
30590 20 68 65 61 64 65 72 73 20 61 73 20 69 74 20 6f   headers as it o
305a0 75 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78  ught to be */.ex
305b0 74 65 72 6e 20 69 6e 74 20 67 65 74 68 6f 73 74  tern int gethost
305c0 75 75 69 64 28 75 75 69 64 5f 74 20 69 64 2c 20  uuid(uuid_t id, 
305d0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d  const struct tim
305e0 65 73 70 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f  espec *wait);../
305f0 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74 20 49  * get the host I
30600 44 20 76 69 61 20 67 65 74 68 6f 73 74 75 75 69  D via gethostuui
30610 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73  d(), pHostID mus
30620 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59  t point to PROXY
30630 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62  _HOSTIDLEN .** b
30640 79 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65  ytes of writable
30650 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
30660 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48  ic int proxyGetH
30670 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63  ostID(unsigned c
30680 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e  har *pHostID, in
30690 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61 73  t *pError){.  as
306a0 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49  sert(PROXY_HOSTI
306b0 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75  DLEN == sizeof(u
306c0 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65  uid_t));.  memse
306d0 74 28 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52  t(pHostID, 0, PR
306e0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a  OXY_HOSTIDLEN);.
306f0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d 41  #if defined(__MA
30700 58 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d  X_OS_X_VERSION_M
30710 49 4e 5f 52 45 51 55 49 52 45 44 29 5c 0a 20 20  IN_REQUIRED)\.  
30720 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
30730 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49  __MAC_OS_X_VERSI
30740 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 3c  ON_MIN_REQUIRED<
30750 31 30 35 30 0a 20 20 7b 0a 20 20 20 20 73 74 61  1050.  {.    sta
30760 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
30770 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75   timespec timeou
30780 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31  t = {1, 0}; /* 1
30790 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a   sec timeout */.
307a0 20 20 20 20 69 66 28 20 67 65 74 68 6f 73 74 75      if( gethostu
307b0 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69  uid(pHostID, &ti
307c0 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20 20 20  meout) ){.      
307d0 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b  int err = errno;
307e0 0a 20 20 20 20 20 20 69 66 28 20 70 45 72 72 6f  .      if( pErro
307f0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 45  r ){.        *pE
30800 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20  rror = err;.    
30810 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
30820 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
30830 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
30840 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
30850 52 28 70 45 72 72 6f 72 29 3b 0a 23 65 6e 64 69  R(pError);.#endi
30860 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
30870 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61  TEST.  /* simula
30880 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74  te multiple host
30890 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e  s by creating un
308a0 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65  ique hostid file
308b0 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20   paths */.  if( 
308c0 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
308d0 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48  um != 0){.    pH
308e0 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72  ostID[0] = (char
308f0 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28  )(pHostID[0] + (
30900 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f  char)(sqlite3_ho
30910 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29  stid_num & 0xFF)
30920 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
30930 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
30940 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63  _OK;.}../* The c
30950 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69  onch file contai
30960 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c 20 68  ns the header, h
30970 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20  ost id and lock 
30980 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64  file path. */.#d
30990 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43  efine PROXY_CONC
309a0 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20  HVERSION 2   /* 
309b0 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c 20 31  1-byte header, 1
309c0 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20  6-byte host id, 
309d0 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20  path */.#define 
309e0 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20  PROXY_HEADERLEN 
309f0 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20     1   /* conch 
30a00 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67  file header leng
30a10 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  th */.#define PR
30a20 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20  OXY_PATHINDEX   
30a30 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45   (PROXY_HEADERLE
30a40 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
30a50 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  N).#define PROXY
30a60 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50  _MAXCONCHLEN  (P
30a70 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50  ROXY_HEADERLEN+P
30a80 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d  ROXY_HOSTIDLEN+M
30a90 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a  AXPATHLEN)../* .
30aa0 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e  ** Takes an open
30ab0 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70   conch file, cop
30ac0 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ies the contents
30ad0 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61   to a new path a
30ae0 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a  nd then moves .*
30af0 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20  * it back.  The 
30b00 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 66 69  newly created fi
30b10 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63 72 69  le's file descri
30b20 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64  ptor is assigned
30b30 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68   to the.** conch
30b40 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20   file structure 
30b50 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20  and finally the 
30b60 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66  original conch f
30b70 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
30b80 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52  s .** closed.  R
30b90 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73  eturns zero if s
30ba0 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74  uccessful..*/.st
30bb0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72  atic int proxyBr
30bc0 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69  eakConchLock(uni
30bd0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75  xFile *pFile, uu
30be0 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a  id_t myHostID){.
30bf0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
30c00 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
30c10 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
30c20 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
30c30 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75  ingContext; .  u
30c40 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
30c50 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
30c60 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61  File;.  char tPa
30c70 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  th[MAXPATHLEN];.
30c80 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59    char buf[PROXY
30c90 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
30ca0 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70   char *cPath = p
30cb0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
30cc0 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61  th;.  size_t rea
30cd0 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65  dLen = 0;.  size
30ce0 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a  _t pathLen = 0;.
30cf0 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34    char errmsg[64
30d00 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64  ] = "";.  int fd
30d10 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20   = -1;.  int rc 
30d20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50  = -1;.  UNUSED_P
30d30 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73 74 49  ARAMETER(myHostI
30d40 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65  D);..  /* create
30d50 20 61 20 6e 65 77 20 70 61 74 68 20 62 79 20 72   a new path by r
30d60 65 70 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c  eplace the trail
30d70 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74  ing '-conch' wit
30d80 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20  h '-break' */.  
30d90 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70  pathLen = strlcp
30da0 79 28 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20  y(tPath, cPath, 
30db0 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69  MAXPATHLEN);.  i
30dc0 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41  f( pathLen>MAXPA
30dd0 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e  THLEN || pathLen
30de0 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72  <6 || .     (str
30df0 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61 74 68  lcpy(&tPath[path
30e00 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c  Len-5], "break",
30e10 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20   6) != 5) ){.   
30e20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
30e30 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
30e40 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20 65 72  ,errmsg,"path er
30e50 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69  ror (len %d)",(i
30e60 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20  nt)pathLen);.   
30e70 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
30e80 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65  ock;.  }.  /* re
30e90 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e  ad the conch con
30ea0 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65  tent */.  readLe
30eb0 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63  n = osPread(conc
30ec0 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50  hFile->h, buf, P
30ed0 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
30ee0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65 61 64  , 0);.  if( read
30ef0 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e  Len<PROXY_PATHIN
30f00 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DEX ){.    sqlit
30f10 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
30f20 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73  of(errmsg),errms
30f30 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20 28 6c  g,"read error (l
30f40 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72 65 61  en %d)",(int)rea
30f50 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20  dLen);.    goto 
30f60 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
30f70 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20 69 74   }.  /* write it
30f80 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65 6d 70   out to the temp
30f90 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69 6c 65  orary break file
30fa0 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75 73   */.  fd = robus
30fb0 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20 28 4f  t_open(tPath, (O
30fc0 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f  _RDWR|O_CREAT|O_
30fd0 45 58 43 4c 29 2c 0a 20 20 20 20 20 20 20 20 20  EXCL),.         
30fe0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
30ff0 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
31000 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66  RMISSIONS);.  if
31010 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 71  ( fd<0 ){.    sq
31020 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
31030 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65  izeof(errmsg), e
31040 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66  rrmsg, "create f
31050 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72  ailed (%d)", err
31060 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  no);.    goto en
31070 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
31080 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74 65 28  .  if( osPwrite(
31090 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c 65 6e  fd, buf, readLen
310a0 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65 5f 74  , 0) != (ssize_t
310b0 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20  )readLen ){.    
310c0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
310d0 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
310e0 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74 65 20   errmsg, "write 
310f0 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
31100 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
31110 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
31120 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28 74  }.  if( rename(t
31130 50 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b 0a  Path, cPath) ){.
31140 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
31150 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
31160 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 72 65  sg), errmsg, "re
31170 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64 29  name failed (%d)
31180 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
31190 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
311a0 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b  k;.  }.  rc = 0;
311b0 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
311c0 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65 20  r, "broke stale 
311d0 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63  lock on %s\n", c
311e0 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f  Path);.  robust_
311f0 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e  close(pFile, con
31200 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e  chFile->h, __LIN
31210 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c  E__);.  conchFil
31220 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e  e->h = fd;.  con
31230 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67  chFile->openFlag
31240 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
31250 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b  REAT;..end_break
31260 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63 20 29  lock:.  if( rc )
31270 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20  {.    if( fd>=0 
31280 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
31290 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20  k(tPath);.      
312a0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
312b0 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  le, fd, __LINE__
312c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  );.    }.    fpr
312d0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 61  intf(stderr, "fa
312e0 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74  iled to break st
312f0 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20  ale lock on %s, 
31300 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72  %s\n", cPath, er
31310 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  rmsg);.  }.  ret
31320 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61  urn rc;.}../* Ta
31330 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ke the requested
31340 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e   lock on the con
31350 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61  ch file and brea
31360 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69  k a stale lock i
31370 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69  f the .** host i
31380 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74  d matches..*/.st
31390 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f  atic int proxyCo
313a0 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  nchLock(unixFile
313b0 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20   *pFile, uuid_t 
313c0 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f  myHostID, int lo
313d0 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79  ckType){.  proxy
313e0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
313f0 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
31400 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
31410 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
31420 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65  ext; .  unixFile
31430 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
31440 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
31450 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
31460 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65  _OK;.  int nTrie
31470 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  s = 0;.  struct 
31480 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f  timespec conchMo
31490 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d 73  dTime;.  .  mems
314a0 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54 69 6d 65  et(&conchModTime
314b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6f 6e 63  , 0, sizeof(conc
314c0 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20 20 64 6f  hModTime));.  do
314d0 20 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63   {.    rc = conc
314e0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
314f0 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
31500 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
31510 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e  lockType);.    n
31520 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66  Tries ++;.    if
31530 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
31540 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  Y ){.      /* If
31550 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64   the lock failed
31560 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20   (busy):.       
31570 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74 20 74  * 1st try: get t
31580 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74  he mod time of t
31590 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30  he conch, wait 0
315a0 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67 61 69  .5s and try agai
315b0 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64  n. .       * 2nd
315c0 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68   try: fail if th
315d0 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67  e mod time chang
315e0 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73  ed or host id is
315f0 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74   different, wait
31600 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20 20 20   .       *      
31610 20 20 20 20 20 31 30 20 73 65 63 20 61 6e 64 20       10 sec and 
31620 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20  try again.      
31630 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72 65 61   * 3rd try: brea
31640 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73  k the lock unles
31650 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68  s the mod time h
31660 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20  as changed..    
31670 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75     */.      stru
31680 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
31690 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 63     if( osFstat(c
316a0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75  onchFile->h, &bu
316b0 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  f) ){.        pF
316c0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
316d0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
316e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
316f0 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
31700 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  }.      .      i
31710 66 28 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a  f( nTries==1 ){.
31720 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64          conchMod
31730 54 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74  Time = buf.st_mt
31740 69 6d 65 73 70 65 63 3b 0a 20 20 20 20 20 20 20  imespec;.       
31750 20 75 73 6c 65 65 70 28 35 30 30 30 30 30 29 3b   usleep(500000);
31760 20 2f 2a 20 77 61 69 74 20 30 2e 35 20 73 65 63   /* wait 0.5 sec
31770 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63   and try the loc
31780 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20  k again*/.      
31790 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20    continue;  .  
317a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
317b0 65 72 74 28 20 6e 54 72 69 65 73 3e 31 20 29 3b  ert( nTries>1 );
317c0 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68  .      if( conch
317d0 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65 63 20 21  ModTime.tv_sec !
317e0 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70  = buf.st_mtimesp
317f0 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20  ec.tv_sec || .  
31800 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54         conchModT
31810 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62  ime.tv_nsec != b
31820 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e  uf.st_mtimespec.
31830 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20 20  tv_nsec ){.     
31840 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
31850 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20  _BUSY;.      }. 
31860 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
31870 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20  nTries==2 ){  . 
31880 20 20 20 20 20 20 20 63 68 61 72 20 74 42 75 66         char tBuf
31890 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c  [PROXY_MAXCONCHL
318a0 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  EN];.        int
318b0 20 6c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63   len = osPread(c
318c0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75  onchFile->h, tBu
318d0 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  f, PROXY_MAXCONC
318e0 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20  HLEN, 0);.      
318f0 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20    if( len<0 ){. 
31900 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
31910 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
31920 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  o;.          ret
31930 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
31940 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d  _LOCK;.        }
31950 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
31960 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  >PROXY_PATHINDEX
31970 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68   && tBuf[0]==(ch
31980 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45  ar)PROXY_CONCHVE
31990 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20  RSION){.        
319a0 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b    /* don't break
319b0 20 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65   the lock if the
319c0 20 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74   host id doesn't
319d0 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20   match */.      
319e0 20 20 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d      if( 0!=memcm
319f0 70 28 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45  p(&tBuf[PROXY_HE
31a00 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74  ADERLEN], myHost
31a10 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44  ID, PROXY_HOSTID
31a20 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  LEN) ){.        
31a30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31a40 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
31a50 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
31a60 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
31a70 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20  don't break the 
31a80 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65  lock on short re
31a90 61 64 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20  ad or a version 
31aa0 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  mismatch */.    
31ab0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
31ac0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
31ad0 20 20 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65    }.        usle
31ae0 65 70 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a  ep(10000000); /*
31af0 20 77 61 69 74 20 31 30 20 73 65 63 20 61 6e 64   wait 10 sec and
31b00 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67   try the lock ag
31b10 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  ain */.        c
31b20 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20  ontinue; .      
31b30 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 61  }.      .      a
31b40 73 73 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33  ssert( nTries==3
31b50 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d   );.      if( 0=
31b60 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68  =proxyBreakConch
31b70 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f  Lock(pFile, myHo
31b80 73 74 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20  stID) ){.       
31b90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
31ba0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63  .        if( loc
31bb0 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  kType==EXCLUSIVE
31bc0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
31bd0 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
31be0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
31bf0 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
31c00 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52  )conchFile, SHAR
31c10 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20  ED_LOCK);       
31c20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20     .        }.  
31c30 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
31c40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
31c50 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
31c60 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
31c70 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
31c80 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20  le, lockType);. 
31c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31ca0 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65  .    }.  } while
31cb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
31cc0 59 20 26 26 20 6e 54 72 69 65 73 3c 33 20 29 3b  Y && nTries<3 );
31cd0 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
31ce0 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65  .}../* Takes the
31cf0 20 63 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67   conch by taking
31d00 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
31d10 6e 64 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74  nd read the cont
31d20 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a  ents conch, if .
31d30 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e  ** lockPath is n
31d40 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73  on-NULL, the hos
31d50 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69  t ID and lock fi
31d60 6c 65 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74  le path must mat
31d70 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20  ch.  A NULL .** 
31d80 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74  lockPath means t
31d90 68 61 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68  hat the lockPath
31da0 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   in the conch fi
31db0 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  le will be used 
31dc0 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20  if the .** host 
31dd0 49 44 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20  IDs match, or a 
31de0 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69  new lock path wi
31df0 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  ll be generated 
31e00 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
31e10 2a 20 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f  * and written to
31e20 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e   the conch file.
31e30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
31e40 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e  roxyTakeConch(un
31e50 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
31e60 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
31e70 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
31e80 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
31e90 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
31ea0 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a  ingContext; .  .
31eb0 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63    if( pCtx->conc
31ec0 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20  hHeld!=0 ){.    
31ed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31ee0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
31ef0 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
31f00 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
31f10 46 69 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f 74  File;.    uuid_t
31f20 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20 20 69   myHostID;.    i
31f30 6e 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20  nt pError = 0;. 
31f40 20 20 20 63 68 61 72 20 72 65 61 64 42 75 66 5b     char readBuf[
31f50 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
31f60 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63  N];.    char loc
31f70 6b 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  kPath[MAXPATHLEN
31f80 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 65 6d  ];.    char *tem
31f90 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c  pLockPath = NULL
31fa0 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53  ;.    int rc = S
31fb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e  QLITE_OK;.    in
31fc0 74 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20  t createConch = 
31fd0 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73 74 49  0;.    int hostI
31fe0 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  dMatch = 0;.    
31ff0 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b  int readLen = 0;
32000 0a 20 20 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c  .    int tryOldL
32010 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20  ockPath = 0;.   
32020 20 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63   int forceNewLoc
32030 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a  kPath = 0;.    .
32040 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 41      OSTRACE(("TA
32050 4b 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20  KECONCH  %d for 
32060 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f  %s pid=%d\n", co
32070 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  nchFile->h,.    
32080 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e           (pCtx->
32090 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20  lockProxyPath ? 
320a0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
320b0 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c  ath : ":auto:"),
320c0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
320d0 20 20 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48    rc = proxyGetH
320e0 6f 73 74 49 44 28 6d 79 48 6f 73 74 49 44 2c 20  ostID(myHostID, 
320f0 26 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 69 66  &pError);.    if
32100 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  ( (rc&0xff)==SQL
32110 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
32120 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
32130 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20  rno = pError;.  
32140 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
32150 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20  econch;.    }.  
32160 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63    rc = proxyConc
32170 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
32180 6f 73 74 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f  ostID, SHARED_LO
32190 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  CK);.    if( rc!
321a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
321b0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
321c0 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20  econch;.    }.  
321d0 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 65 78    /* read the ex
321e0 69 73 74 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c  isting conch fil
321f0 65 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e  e */.    readLen
32200 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28   = seekAndRead((
32210 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46  unixFile*)conchF
32220 69 6c 65 2c 20 30 2c 20 72 65 61 64 42 75 66 2c  ile, 0, readBuf,
32230 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
32240 45 4e 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61  EN);.    if( rea
32250 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  dLen<0 ){.      
32260 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61  /* I/O error: la
32270 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
32280 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20  eekAndRead */.  
32290 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
322a0 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65  rrno = conchFile
322b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
322c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
322d0 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 20  OERR_READ;.     
322e0 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
322f0 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  nch;.    }else i
32300 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f  f( readLen<=(PRO
32310 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
32320 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c  XY_HOSTIDLEN) ||
32330 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 72   .             r
32340 65 61 64 42 75 66 5b 30 5d 21 3d 28 63 68 61 72  eadBuf[0]!=(char
32350 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53  )PROXY_CONCHVERS
32360 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ION ){.      /* 
32370 61 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20  a short read or 
32380 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d  version format m
32390 69 73 6d 61 74 63 68 20 6d 65 61 6e 73 20 77 65  ismatch means we
323a0 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
323b0 61 20 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a 20  a new .      ** 
323c0 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20 20  conch file. .   
323d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 72 65 61     */.      crea
323e0 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20  teConch = 1;.   
323f0 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65   }.    /* if the
32400 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73   host id matches
32410 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70 61   and the lock pa
32420 74 68 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  th already exist
32430 73 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20  s in the conch. 
32440 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20     ** we'll try 
32450 74 6f 20 75 73 65 20 74 68 65 20 70 61 74 68 20  to use the path 
32460 74 68 65 72 65 2c 20 69 66 20 77 65 20 63 61 6e  there, if we can
32470 27 74 20 6f 70 65 6e 20 74 68 61 74 20 70 61 74  't open that pat
32480 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a  h, we'll .    **
32490 20 72 65 74 72 79 20 77 69 74 68 20 61 20 6e 65   retry with a ne
324a0 77 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64  w auto-generated
324b0 20 70 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20   path .    */.  
324c0 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73    do { /* in cas
324d0 65 20 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79  e we need to try
324e0 20 61 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61   again for an :a
324f0 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20  uto: named lock 
32500 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69  file */..      i
32510 66 28 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20  f( !createConch 
32520 26 26 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b  && !forceNewLock
32530 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
32540 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 21 6d  hostIdMatch = !m
32550 65 6d 63 6d 70 28 26 72 65 61 64 42 75 66 5b 50  emcmp(&readBuf[P
32560 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c  ROXY_HEADERLEN],
32570 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20 20 20 20   myHostID, .    
32580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 52                PR
325a0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a  OXY_HOSTIDLEN);.
325b0 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68          /* if th
325c0 65 20 63 6f 6e 63 68 20 68 61 73 20 64 61 74 61  e conch has data
325d0 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e   compare the con
325e0 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  tents */.       
325f0 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b   if( !pCtx->lock
32600 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
32610 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75         /* for au
32620 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c  to-named local l
32630 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63  ock file, just c
32640 68 65 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44  heck the host ID
32650 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20 20   and we'll.     
32660 20 20 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65        ** use the
32670 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65   local lock file
32680 20 70 61 74 68 20 74 68 61 74 27 73 20 61 6c 72   path that's alr
32690 65 61 64 79 20 69 6e 20 74 68 65 72 65 0a 20 20  eady in there.  
326a0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
326b0 20 20 20 20 20 20 69 66 28 20 68 6f 73 74 49 64        if( hostId
326c0 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Match ){.       
326d0 20 20 20 20 20 73 69 7a 65 5f 74 20 70 61 74 68       size_t path
326e0 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d  Len = (readLen -
326f0 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58   PROXY_PATHINDEX
32700 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a  );.            .
32710 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
32720 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48  pathLen>=MAXPATH
32730 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LEN ){.         
32740 20 20 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58       pathLen=MAX
32750 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20  PATHLEN-1;.     
32760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32770 20 20 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b       memcpy(lock
32780 50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50  Path, &readBuf[P
32790 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c  ROXY_PATHINDEX],
327a0 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20   pathLen);.     
327b0 20 20 20 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b         lockPath[
327c0 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20  pathLen] = 0;.  
327d0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f            tempLo
327e0 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74  ckPath = lockPat
327f0 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  h;.            t
32800 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20  ryOldLockPath = 
32810 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;.            /
32820 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20  * create a copy 
32830 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68  of the lock path
32840 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73   if the conch is
32850 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20   taken */.      
32860 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
32870 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20  akeconch;.      
32880 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
32890 6c 73 65 20 69 66 28 20 68 6f 73 74 49 64 4d 61  lse if( hostIdMa
328a0 74 63 68 0a 20 20 20 20 20 20 20 20 20 20 20 20  tch.            
328b0 20 20 20 26 26 20 21 73 74 72 6e 63 6d 70 28 70     && !strncmp(p
328c0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
328d0 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f  th, &readBuf[PRO
328e0 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20  XY_PATHINDEX],. 
328f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32900 20 20 20 20 20 20 20 20 20 20 72 65 61 64 4c 65            readLe
32910 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  n-PROXY_PATHINDE
32920 58 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  X).        ){.  
32930 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68          /* conch
32940 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70   host and lock p
32950 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  ath match */.   
32960 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
32970 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20  takeconch; .    
32980 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
32990 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 69 66      .      /* if
329a0 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74   the conch isn't
329b0 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20 64 6f   writable and do
329c0 65 73 6e 27 74 20 6d 61 74 63 68 2c 20 77 65 20  esn't match, we 
329d0 63 61 6e 27 74 20 74 61 6b 65 20 69 74 20 2a 2f  can't take it */
329e0 0a 20 20 20 20 20 20 69 66 28 20 28 63 6f 6e 63  .      if( (conc
329f0 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  hFile->openFlags
32a00 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 20 29 7b  &O_RDWR) == 0 ){
32a10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
32a20 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
32a30 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
32a40 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20  conch;.      }. 
32a50 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 65       .      /* e
32a60 69 74 68 65 72 20 74 68 65 20 63 6f 6e 63 68 20  ither the conch 
32a70 64 69 64 6e 27 74 20 6d 61 74 63 68 20 6f 72 20  didn't match or 
32a80 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
32a90 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20  e a new one */. 
32aa0 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e       if( !pCtx->
32ab0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
32ac0 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 47 65  .        proxyGe
32ad0 74 4c 6f 63 6b 50 61 74 68 28 70 43 74 78 2d 3e  tLockPath(pCtx->
32ae0 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68  dbPath, lockPath
32af0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
32b00 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50         tempLockP
32b10 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a  ath = lockPath;.
32b20 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74          /* creat
32b30 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
32b40 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79 5f  lock path _only_
32b50 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73   if the conch is
32b60 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20   taken */.      
32b70 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f  }.      .      /
32b80 2a 20 75 70 64 61 74 65 20 63 6f 6e 63 68 20 77  * update conch w
32b90 69 74 68 20 68 6f 73 74 20 61 6e 64 20 70 61 74  ith host and pat
32ba0 68 20 28 74 68 69 73 20 77 69 6c 6c 20 66 61 69  h (this will fai
32bb0 6c 20 69 66 20 6f 74 68 65 72 20 70 72 6f 63 65  l if other proce
32bc0 73 73 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  ss.      ** has 
32bd0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c  a shared lock al
32be0 72 65 61 64 79 29 2c 20 69 66 20 74 68 65 20 68  ready), if the h
32bf0 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2c 20  ost id matches, 
32c00 75 73 65 20 74 68 65 20 62 69 67 0a 20 20 20 20  use the big.    
32c10 20 20 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20 20    ** stick..    
32c20 20 20 2a 2f 0a 20 20 20 20 20 20 66 75 74 69 6d    */.      futim
32c30 65 73 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  es(conchFile->h,
32c40 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66   NULL);.      if
32c50 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20 26 26  ( hostIdMatch &&
32c60 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b   !createConch ){
32c70 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e  .        if( con
32c80 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26  chFile->pInode &
32c90 26 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e  & conchFile->pIn
32ca0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29  ode->nShared>1 )
32cb0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
32cc0 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72  e are trying for
32cd0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
32ce0 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74  ck but another t
32cf0 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20  hread in this.  
32d00 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65           ** same
32d10 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
32d20 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
32d30 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
32d40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
32d50 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
32d60 7d 20 65 6c 73 65 20 7b 20 20 20 20 20 20 20 20  } else {        
32d70 20 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20    .          rc 
32d80 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b  = proxyConchLock
32d90 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44  (pFile, myHostID
32da0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
32db0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
32dc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32dd0 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
32de0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
32df0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
32e00 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c 55  conchFile, EXCLU
32e10 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
32e20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
32e30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32e40 20 20 20 20 20 20 20 63 68 61 72 20 77 72 69 74         char writ
32e50 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d 41  eBuffer[PROXY_MA
32e60 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20  XCONCHLEN];.    
32e70 20 20 20 20 69 6e 74 20 77 72 69 74 65 53 69 7a      int writeSiz
32e80 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 0a  e = 0;.        .
32e90 20 20 20 20 20 20 20 20 77 72 69 74 65 42 75 66          writeBuf
32ea0 66 65 72 5b 30 5d 20 3d 20 28 63 68 61 72 29 50  fer[0] = (char)P
32eb0 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
32ec0 4e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  N;.        memcp
32ed0 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50  y(&writeBuffer[P
32ee0 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c  ROXY_HEADERLEN],
32ef0 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59   myHostID, PROXY
32f00 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20  _HOSTIDLEN);.   
32f10 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c       if( pCtx->l
32f20 6f 63 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e 55  ockProxyPath!=NU
32f30 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
32f40 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42 75  strlcpy(&writeBu
32f50 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49  ffer[PROXY_PATHI
32f60 4e 44 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63  NDEX], pCtx->loc
32f70 6b 50 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50  kProxyPath, MAXP
32f80 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  ATHLEN);.       
32f90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32fa0 20 20 73 74 72 6c 63 70 79 28 26 77 72 69 74 65    strlcpy(&write
32fb0 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54  Buffer[PROXY_PAT
32fc0 48 49 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f 63  HINDEX], tempLoc
32fd0 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  kPath, MAXPATHLE
32fe0 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  N);.        }.  
32ff0 20 20 20 20 20 20 77 72 69 74 65 53 69 7a 65 20        writeSize 
33000 3d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  = PROXY_PATHINDE
33010 58 20 2b 20 73 74 72 6c 65 6e 28 26 77 72 69 74  X + strlen(&writ
33020 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41  eBuffer[PROXY_PA
33030 54 48 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20 20  THINDEX]);.     
33040 20 20 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63     robust_ftrunc
33050 61 74 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ate(conchFile->h
33060 2c 20 77 72 69 74 65 53 69 7a 65 29 3b 0a 20 20  , writeSize);.  
33070 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 57        rc = unixW
33080 72 69 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  rite((sqlite3_fi
33090 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  le *)conchFile, 
330a0 77 72 69 74 65 42 75 66 66 65 72 2c 20 77 72 69  writeBuffer, wri
330b0 74 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  teSize, 0);.    
330c0 20 20 20 20 66 73 79 6e 63 28 63 6f 6e 63 68 46      fsync(conchF
330d0 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 20  ile->h);.       
330e0 20 2f 2a 20 49 66 20 77 65 20 63 72 65 61 74 65   /* If we create
330f0 64 20 61 20 6e 65 77 20 63 6f 6e 63 68 20 66 69  d a new conch fi
33100 6c 65 20 28 6e 6f 74 20 6a 75 73 74 20 75 70 64  le (not just upd
33110 61 74 65 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  ated the content
33120 73 20 6f 66 20 61 20 0a 20 20 20 20 20 20 20 20  s of a .        
33130 20 2a 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68 20   ** valid conch 
33140 66 69 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d 61  file), try to ma
33150 74 63 68 20 74 68 65 20 70 65 72 6d 69 73 73 69  tch the permissi
33160 6f 6e 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ons of the datab
33170 61 73 65 20 0a 20 20 20 20 20 20 20 20 20 2a 2f  ase .         */
33180 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
33190 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 72  =SQLITE_OK && cr
331a0 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20  eateConch ){.   
331b0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74         struct st
331c0 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20  at buf;.        
331d0 20 20 69 6e 74 20 65 72 72 20 3d 20 6f 73 46 73    int err = osFs
331e0 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62  tat(pFile->h, &b
331f0 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  uf);.          i
33200 66 28 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20  f( err==0 ){.   
33210 20 20 20 20 20 20 20 20 20 6d 6f 64 65 5f 74 20           mode_t 
33220 63 6d 6f 64 65 20 3d 20 62 75 66 2e 73 74 5f 6d  cmode = buf.st_m
33230 6f 64 65 26 28 53 5f 49 52 55 53 52 7c 53 5f 49  ode&(S_IRUSR|S_I
33240 57 55 53 52 20 7c 20 53 5f 49 52 47 52 50 7c 53  WUSR | S_IRGRP|S
33250 5f 49 57 47 52 50 20 7c 0a 20 20 20 20 20 20 20  _IWGRP |.       
33260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33280 20 53 5f 49 52 4f 54 48 7c 53 5f 49 57 4f 54 48   S_IROTH|S_IWOTH
33290 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  );.            /
332a0 2a 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74  * try to match t
332b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
332c0 20 52 2f 57 20 70 65 72 6d 69 73 73 69 6f 6e 73   R/W permissions
332d0 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c 75 72 65  , ignore failure
332e0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
332f0 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 20  TE_PROXY_DEBUG. 
33300 20 20 20 20 20 20 20 20 20 20 20 6f 73 46 63 68             osFch
33310 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  mod(conchFile->h
33320 2c 20 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a  , cmode);.#else.
33330 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 7b 0a              do{.
33340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
33350 20 3d 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63   = osFchmod(conc
33360 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29  hFile->h, cmode)
33370 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 77  ;.            }w
33380 68 69 6c 65 28 20 72 63 3d 3d 28 2d 31 29 20 26  hile( rc==(-1) &
33390 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
333a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
333b0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
333c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64           int cod
333d0 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  e = errno;.     
333e0 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
333f0 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64  (stderr, "fchmod
33400 20 25 6f 20 46 41 49 4c 45 44 20 77 69 74 68 20   %o FAILED with 
33410 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
33420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33430 63 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74 72  cmode, code, str
33440 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20  error(code));.  
33450 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
33460 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
33470 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
33480 20 22 66 63 68 6d 6f 64 20 25 6f 20 53 55 43 43   "fchmod %o SUCC
33490 45 44 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a  EDED\n",cmode);.
334a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
334b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
334c0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63             int c
334d0 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  ode = errno;.   
334e0 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
334f0 28 73 74 64 65 72 72 2c 20 22 53 54 41 54 20 46  (stderr, "STAT F
33500 41 49 4c 45 44 5b 25 64 5d 20 77 69 74 68 20 25  AILED[%d] with %
33510 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20  d %s\n", .      
33520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
33530 72 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f  r, code, strerro
33540 72 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66  r(code));.#endif
33550 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
33560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
33570 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e       conchFile->
33580 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
33590 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
335a0 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45  conchFile, SHARE
335b0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 0a  D_LOCK);.      .
335c0 20 20 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63      end_takeconc
335d0 68 3a 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  h:.      OSTRACE
335e0 28 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 43  (("TRANSPROXY: C
335f0 4c 4f 53 45 20 20 25 64 5c 6e 22 2c 20 70 46 69  LOSE  %d\n", pFi
33600 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 69  le->h));.      i
33610 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
33620 20 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46   && pFile->openF
33630 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lags ){.        
33640 69 6e 74 20 66 64 3b 0a 20 20 20 20 20 20 20 20  int fd;.        
33650 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
33660 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 6f 62  ){.          rob
33670 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
33680 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e   pFile->h, __LIN
33690 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  E__);.        }.
336a0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
336b0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 66   = -1;.        f
336c0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
336d0 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46  pCtx->dbPath, pF
336e0 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 0a  ile->openFlags,.
336f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33700 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46        SQLITE_DEF
33710 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
33720 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 20 20  SIONS);.        
33730 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50  OSTRACE(("TRANSP
33740 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e  ROXY: OPEN  %d\n
33750 22 2c 20 66 64 29 29 3b 0a 20 20 20 20 20 20 20  ", fd));.       
33760 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20   if( fd>=0 ){.  
33770 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
33780 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 20 20 7d   = fd;.        }
33790 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
337a0 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rc=SQLITE_CANTOP
337b0 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 51 4c 49  EN_BKPT; /* SQLI
337c0 54 45 5f 42 55 53 59 3f 20 70 72 6f 78 79 54 61  TE_BUSY? proxyTa
337d0 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64 0a 20  keConch called. 
337e0 20 20 20 20 20 20 20 20 20 20 64 75 72 69 6e 67            during
337f0 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20   locking */.    
33800 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
33810 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
33820 54 45 5f 4f 4b 20 26 26 20 21 70 43 74 78 2d 3e  TE_OK && !pCtx->
33830 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20  lockProxy ){.   
33840 20 20 20 20 20 63 68 61 72 20 2a 70 61 74 68 20       char *path 
33850 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3f  = tempLockPath ?
33860 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3a 20   tempLockPath : 
33870 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
33880 61 74 68 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ath;.        rc 
33890 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69  = proxyCreateUni
338a0 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70 43 74  xFile(path, &pCt
338b0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20 31 29  x->lockProxy, 1)
338c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
338d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
338e0 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
338f0 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74  && tryOldLockPat
33900 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  h ){.          /
33910 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74 20 63 72  * we couldn't cr
33920 65 61 74 65 20 74 68 65 20 70 72 6f 78 79 20 6c  eate the proxy l
33930 6f 63 6b 20 66 69 6c 65 20 77 69 74 68 20 74 68  ock file with th
33940 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c 65 20  e old lock file 
33950 70 61 74 68 0a 20 20 20 20 20 20 20 20 20 20 20  path.           
33960 2a 2a 20 73 6f 20 74 72 79 20 61 67 61 69 6e 20  ** so try again 
33970 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e 67 20  via auto-naming 
33980 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  .           */. 
33990 20 20 20 20 20 20 20 20 20 66 6f 72 63 65 4e 65           forceNe
339a0 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20  wLockPath = 1;. 
339b0 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c           tryOldL
339c0 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20  ockPath = 0;.   
339d0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
339e0 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f 20 74   /* go back to t
339f0 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65 20 73  he do {} while s
33a00 74 61 72 74 20 70 6f 69 6e 74 2c 20 74 72 79 20  tart point, try 
33a10 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20  again */.       
33a20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
33a30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33a40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
33a50 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 20   Need to make a 
33a60 63 6f 70 79 20 6f 66 20 70 61 74 68 20 69 66 20  copy of path if 
33a70 77 65 20 65 78 74 72 61 63 74 65 64 20 74 68 65  we extracted the
33a80 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20   value.         
33a90 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 63  ** from the conc
33aa0 68 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 61  h file or the pa
33ab0 74 68 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  th was allocated
33ac0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 0a 20 20   on the stack.  
33ad0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
33ae0 20 20 69 66 28 20 74 65 6d 70 4c 6f 63 6b 50 61    if( tempLockPa
33af0 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
33b00 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
33b10 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
33b20 74 72 44 75 70 28 30 2c 20 74 65 6d 70 4c 6f 63  trDup(0, tempLoc
33b30 6b 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  kPath);.        
33b40 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63    if( !pCtx->loc
33b50 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
33b60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
33b70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
33b80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33b90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
33ba0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33bb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
33bc0 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20  tx->conchHeld = 
33bd0 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  1;.        .    
33be0 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f      if( pCtx->lo
33bf0 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
33c00 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
33c10 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  s ){.          a
33c20 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
33c30 20 2a 61 66 70 43 74 78 3b 0a 20 20 20 20 20 20   *afpCtx;.      
33c40 20 20 20 20 61 66 70 43 74 78 20 3d 20 28 61 66      afpCtx = (af
33c50 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
33c60 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  *)pCtx->lockProx
33c70 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  y->lockingContex
33c80 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70  t;.          afp
33c90 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 70 43  Ctx->dbPath = pC
33ca0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
33cb0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
33cc0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
33cd0 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70      conchFile->p
33ce0 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
33cf0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
33d00 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43  onchFile, NO_LOC
33d10 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
33d20 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45    OSTRACE(("TAKE
33d30 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c  CONCH  %d %s\n",
33d40 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
33d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
33d60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22  ==SQLITE_OK?"ok"
33d70 3a 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20  :"failed"));.   
33d80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
33d90 20 20 7d 20 77 68 69 6c 65 20 28 31 29 3b 20 2f    } while (1); /
33da0 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65  * in case we nee
33db0 64 20 74 6f 20 72 65 74 72 79 20 74 68 65 20 3a  d to retry the :
33dc0 61 75 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c 65 20  auto: lock file 
33dd0 2d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  - .             
33de0 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64      ** we should
33df0 20 6e 65 76 65 72 20 67 65 74 20 68 65 72 65 20   never get here 
33e00 65 78 63 65 70 74 20 76 69 61 20 74 68 65 20 27  except via the '
33e10 63 6f 6e 74 69 6e 75 65 27 20 63 61 6c 6c 2e 20  continue' call. 
33e20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  */.  }.}../*.** 
33e30 49 66 20 70 46 69 6c 65 20 68 6f 6c 64 73 20 61  If pFile holds a
33e40 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e 63 68   lock on a conch
33e50 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 6c 65   file, then rele
33e60 61 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a  ase that lock..*
33e70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
33e80 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 75  xyReleaseConch(u
33e90 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
33ea0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
33eb0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f  TE_OK;         /
33ec0 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65 74  * Subroutine ret
33ed0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 70 72  urn code */.  pr
33ee0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
33ef0 74 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54 68 65  t *pCtx;  /* The
33f00 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
33f10 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 6c   for the proxy l
33f20 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ock */.  unixFil
33f30 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20  e *conchFile;   
33f40 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
33f50 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  the conch file *
33f60 2f 0a 0a 20 20 70 43 74 78 20 3d 20 28 70 72 6f  /..  pCtx = (pro
33f70 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
33f80 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
33f90 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f 6e 63  gContext;.  conc
33fa0 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
33fb0 6e 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54 52 41  nchFile;.  OSTRA
33fc0 43 45 28 28 22 52 45 4c 45 41 53 45 43 4f 4e 43  CE(("RELEASECONC
33fd0 48 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64  H  %d for %s pid
33fe0 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c  =%d\n", conchFil
33ff0 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
34000 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   (pCtx->lockProx
34010 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f  yPath ? pCtx->lo
34020 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a  ckProxyPath : ":
34030 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20 20 20  auto:"), .      
34040 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b       getpid()));
34050 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e  .  if( pCtx->con
34060 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20  chHeld>0 ){.    
34070 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
34080 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
34090 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
340a0 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f  conchFile, NO_LO
340b0 43 4b 29 3b 0a 20 20 7d 0a 20 20 70 43 74 78 2d  CK);.  }.  pCtx-
340c0 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a  >conchHeld = 0;.
340d0 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 4c 45    OSTRACE(("RELE
340e0 41 53 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c  ASECONCH  %d %s\
340f0 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  n", conchFile->h
34100 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63  ,.           (rc
34110 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
34120 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29  k" : "failed")))
34130 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
34140 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
34150 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61  e name of a data
34160 62 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d 70 75  base file, compu
34170 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 69  te the name of i
34180 74 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a  ts conch file..*
34190 2a 20 53 74 6f 72 65 20 74 68 65 20 63 6f 6e 63  * Store the conc
341a0 68 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6d 65  h filename in me
341b0 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
341c0 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
341d0 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43  c()..** Make *pC
341e0 6f 6e 63 68 50 61 74 68 20 70 6f 69 6e 74 20 74  onchPath point t
341f0 6f 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 2e 20  o the new name. 
34200 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
34210 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
34220 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  or SQLITE_NOMEM 
34230 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f 62 74  if unable to obt
34240 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  ain memory..**.*
34250 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * The caller is 
34260 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
34270 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
34280 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  e allocated memo
34290 72 79 0a 2a 2a 20 73 70 61 63 65 20 69 73 20 65  ry.** space is e
342a0 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 2e  ventually freed.
342b0 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50 61  .**.** *pConchPa
342c0 74 68 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  th is set to NUL
342d0 4c 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  L if a memory al
342e0 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
342f0 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
34300 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65   int proxyCreate
34310 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 63 68  ConchPathname(ch
34320 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72  ar *dbPath, char
34330 20 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29 7b 0a   **pConchPath){.
34340 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
34350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34360 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
34370 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28  */.  int len = (
34380 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74  int)strlen(dbPat
34390 68 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66  h); /* Length of
343a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   database filena
343b0 6d 65 20 2d 20 64 62 50 61 74 68 20 2a 2f 0a 20  me - dbPath */. 
343c0 20 63 68 61 72 20 2a 63 6f 6e 63 68 50 61 74 68   char *conchPath
343d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
343e0 2a 20 62 75 66 66 65 72 20 69 6e 20 77 68 69 63  * buffer in whic
343f0 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 63  h to construct c
34400 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20  onch name */..  
34410 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
34420 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20  e for the conch 
34430 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6e 69  filename and ini
34440 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65  tialize the name
34450 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d   to.  ** the nam
34460 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
34470 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
34480 20 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63 68 50   */  .  *pConchP
34490 61 74 68 20 3d 20 63 6f 6e 63 68 50 61 74 68 20  ath = conchPath 
344a0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
344b0 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38  3_malloc(len + 8
344c0 29 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68 50 61  );.  if( conchPa
344d0 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  th==0 ){.    ret
344e0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
344f0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 63  ;.  }.  memcpy(c
34500 6f 6e 63 68 50 61 74 68 2c 20 64 62 50 61 74 68  onchPath, dbPath
34510 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f  , len+1);.  .  /
34520 2a 20 6e 6f 77 20 69 6e 73 65 72 74 20 61 20 22  * now insert a "
34530 2e 22 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61  ." before the la
34540 73 74 20 2f 20 63 68 61 72 61 63 74 65 72 20 2a  st / character *
34550 2f 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d  /.  for( i=(len-
34560 31 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b  1); i>=0; i-- ){
34570 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68 50 61  .    if( conchPa
34580 74 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  th[i]=='/' ){.  
34590 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62      i++;.      b
345a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
345b0 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 27    conchPath[i]='
345c0 2e 27 3b 0a 20 20 77 68 69 6c 65 20 28 20 69 3c  .';.  while ( i<
345d0 6c 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e 63 68  len ){.    conch
345e0 50 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61 74 68  Path[i+1]=dbPath
345f0 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  [i];.    i++;.  
34600 7d 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64 20 74  }..  /* append t
34610 68 65 20 22 2d 63 6f 6e 63 68 22 20 73 75 66 66  he "-conch" suff
34620 69 78 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a  ix to the file *
34630 2f 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f 6e 63  /.  memcpy(&conc
34640 68 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f  hPath[i+1], "-co
34650 6e 63 68 22 2c 20 37 29 3b 0a 20 20 61 73 73 65  nch", 7);.  asse
34660 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  rt( (int)strlen(
34670 63 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20 6c 65  conchPath) == le
34680 6e 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  n+7 );..  return
34690 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
346a0 2f 2a 20 54 61 6b 65 73 20 61 20 66 75 6c 6c 79  /* Takes a fully
346b0 20 63 6f 6e 66 69 67 75 72 65 64 20 70 72 6f 78   configured prox
346c0 79 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20  y locking-style 
346d0 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 73 77  unix file and sw
346e0 69 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f  itches.** the lo
346f0 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  cal lock file pa
34700 74 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th .*/.static in
34710 74 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78  t switchLockProx
34720 79 50 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a  yPath(unixFile *
34730 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61  pFile, const cha
34740 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f  r *path) {.  pro
34750 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
34760 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
34770 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70  ockingContext*)p
34780 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
34790 74 65 78 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c  text;.  char *ol
347a0 64 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f  dPath = pCtx->lo
347b0 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 69  ckProxyPath;.  i
347c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
347d0 4b 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  K;..  if( pFile-
347e0 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
347f0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
34800 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
34810 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69   }  ..  /* nothi
34820 6e 67 20 74 6f 20 64 6f 20 69 66 20 74 68 65 20  ng to do if the 
34830 70 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61  path is NULL, :a
34840 75 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65 73 20  uto: or matches 
34850 74 68 65 20 65 78 69 73 74 69 6e 67 20 70 61 74  the existing pat
34860 68 20 2a 2f 0a 20 20 69 66 28 20 21 70 61 74 68  h */.  if( !path
34870 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30   || path[0]=='\0
34880 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74  ' || !strcmp(pat
34890 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a  h, ":auto:") ||.
348a0 20 20 20 20 28 6f 6c 64 50 61 74 68 20 26 26 20      (oldPath && 
348b0 21 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61 74 68  !strncmp(oldPath
348c0 2c 20 70 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  , path, MAXPATHL
348d0 45 4e 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  EN)) ){.    retu
348e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
348f0 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46  }else{.    unixF
34900 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d  ile *lockProxy =
34910 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
34920 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b  ;.    pCtx->lock
34930 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20  Proxy=NULL;.    
34940 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
34950 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63  = 0;.    if( loc
34960 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a  kProxy!=NULL ){.
34970 20 20 20 20 20 20 72 63 3d 6c 6f 63 6b 50 72 6f        rc=lockPro
34980 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  xy->pMethod->xCl
34990 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
349a0 65 20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a  e *)lockProxy);.
349b0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
349c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
349d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63  sqlite3_free(loc
349e0 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20  kProxy);.    }. 
349f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
34a00 6f 6c 64 50 61 74 68 29 3b 0a 20 20 20 20 70 43  oldPath);.    pC
34a10 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
34a20 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  h = sqlite3DbStr
34a30 44 75 70 28 30 2c 20 70 61 74 68 29 3b 0a 20 20  Dup(0, path);.  
34a40 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63  }.  .  return rc
34a50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65  ;.}../*.** pFile
34a60 20 69 73 20 61 20 66 69 6c 65 20 74 68 61 74 20   is a file that 
34a70 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  has been opened 
34a80 62 79 20 61 20 70 72 69 6f 72 20 78 4f 70 65 6e  by a prior xOpen
34a90 20 63 61 6c 6c 2e 20 20 64 62 50 61 74 68 0a 2a   call.  dbPath.*
34aa0 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20 62 75  * is a string bu
34ab0 66 66 65 72 20 61 74 20 6c 65 61 73 74 20 4d 41  ffer at least MA
34ac0 58 50 41 54 48 4c 45 4e 2b 31 20 63 68 61 72 61  XPATHLEN+1 chara
34ad0 63 74 65 72 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  cters in size..*
34ae0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
34af0 65 20 66 69 6e 64 20 74 68 65 20 66 69 6c 65 6e  e find the filen
34b00 61 6d 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ame associated w
34b10 69 74 68 20 70 46 69 6c 65 20 61 6e 64 20 77 72  ith pFile and wr
34b20 69 74 65 73 20 69 74 0a 2a 2a 20 69 6e 74 20 64  ites it.** int d
34b30 62 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  bPath..*/.static
34b40 20 69 6e 74 20 70 72 6f 78 79 47 65 74 44 62 50   int proxyGetDbP
34b50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75  athForUnixFile(u
34b60 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
34b70 63 68 61 72 20 2a 64 62 50 61 74 68 29 7b 0a 23  char *dbPath){.#
34b80 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
34b90 4c 45 5f 5f 29 0a 20 20 69 66 28 20 70 46 69 6c  LE__).  if( pFil
34ba0 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61  e->pMethod == &a
34bb0 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  fpIoMethods ){. 
34bc0 20 20 20 2f 2a 20 61 66 70 20 73 74 79 6c 65 20     /* afp style 
34bd0 6b 65 65 70 73 20 61 20 72 65 66 65 72 65 6e 63  keeps a referenc
34be0 65 20 74 6f 20 74 68 65 20 64 62 20 70 61 74 68  e to the db path
34bf0 20 69 6e 20 74 68 65 20 66 69 6c 65 50 61 74 68   in the filePath
34c00 20 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a 20 6f   field .    ** o
34c10 66 20 74 68 65 20 73 74 72 75 63 74 20 2a 2f 0a  f the struct */.
34c20 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 74      assert( (int
34c30 29 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70  )strlen((char*)p
34c40 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
34c50 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45  text)<=MAXPATHLE
34c60 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79  N );.    strlcpy
34c70 28 64 62 50 61 74 68 2c 20 28 28 61 66 70 4c 6f  (dbPath, ((afpLo
34c80 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
34c90 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
34ca0 74 65 78 74 29 2d 3e 64 62 50 61 74 68 2c 20 4d  text)->dbPath, M
34cb0 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 20  AXPATHLEN);.  } 
34cc0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 69 66  else.#endif.  if
34cd0 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
34ce0 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65   == &dotlockIoMe
34cf0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
34d00 64 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65 20 75  dot lock style u
34d10 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
34d20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65  context to store
34d30 20 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a 20 20   the dot lock.  
34d40 20 20 2a 2a 20 66 69 6c 65 20 70 61 74 68 20 2a    ** file path *
34d50 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20  /.    int len = 
34d60 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70  strlen((char *)p
34d70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
34d80 74 65 78 74 29 20 2d 20 73 74 72 6c 65 6e 28 44  text) - strlen(D
34d90 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29 3b 0a  OTLOCK_SUFFIX);.
34da0 20 20 20 20 6d 65 6d 63 70 79 28 64 62 50 61 74      memcpy(dbPat
34db0 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65  h, (char *)pFile
34dc0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
34dd0 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 7d 65  , len + 1);.  }e
34de0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20  lse{.    /* all 
34df0 6f 74 68 65 72 20 73 74 79 6c 65 73 20 75 73 65  other styles use
34e00 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
34e10 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68  text to store th
34e20 65 20 64 62 20 66 69 6c 65 20 70 61 74 68 20 2a  e db file path *
34e30 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 74  /.    assert( st
34e40 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c  rlen((char*)pFil
34e50 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
34e60 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29  t)<=MAXPATHLEN )
34e70 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64 62  ;.    strlcpy(db
34e80 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46  Path, (char *)pF
34e90 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
34ea0 65 78 74 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ext, MAXPATHLEN)
34eb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
34ec0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
34ed0 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c 72 65  ** Takes an alre
34ee0 61 64 79 20 66 69 6c 6c 65 64 20 69 6e 20 75 6e  ady filled in un
34ef0 69 78 20 66 69 6c 65 20 61 6e 64 20 61 6c 74 65  ix file and alte
34f00 72 73 20 69 74 20 73 6f 20 61 6c 6c 20 66 69 6c  rs it so all fil
34f10 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 77 69  e locking .** wi
34f20 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  ll be performed 
34f30 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 72 6f  on the local pro
34f40 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20 20 54  xy lock file.  T
34f50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
34f60 6c 64 73 0a 2a 2a 20 61 72 65 20 70 72 65 73 65  lds.** are prese
34f70 72 76 65 64 20 69 6e 20 74 68 65 20 6c 6f 63 6b  rved in the lock
34f80 69 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f 20 74  ing context so t
34f90 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20  hat they can be 
34fa0 72 65 73 74 6f 72 65 64 20 61 6e 64 20 0a 2a 2a  restored and .**
34fb0 20 74 68 65 20 75 6e 69 78 20 73 74 72 75 63 74   the unix struct
34fc0 75 72 65 20 70 72 6f 70 65 72 6c 79 20 63 6c 65  ure properly cle
34fd0 61 6e 65 64 20 75 70 20 61 74 20 63 6c 6f 73 65  aned up at close
34fe0 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63   time:.**  ->loc
34ff0 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a 20 20  kingContext.**  
35000 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73 74 61  ->pMethod.*/.sta
35010 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61  tic int proxyTra
35020 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75  nsformUnixFile(u
35030 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
35040 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
35050 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  ) {.  proxyLocki
35060 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
35070 0a 20 20 63 68 61 72 20 64 62 50 61 74 68 5b 4d  .  char dbPath[M
35080 41 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20 20 20  AXPATHLEN+1];   
35090 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
350a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
350b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b   */.  char *lock
350c0 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74  Path=NULL;.  int
350d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
350e0 0a 20 20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  .  .  if( pFile-
350f0 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
35100 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
35110 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
35120 20 7d 0a 20 20 70 72 6f 78 79 47 65 74 44 62 50   }.  proxyGetDbP
35130 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 70  athForUnixFile(p
35140 46 69 6c 65 2c 20 64 62 50 61 74 68 29 3b 0a 20  File, dbPath);. 
35150 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61   if( !path || pa
35160 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21  th[0]=='\0' || !
35170 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61  strcmp(path, ":a
35180 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20 6c 6f  uto:") ){.    lo
35190 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 7d  ckPath=NULL;.  }
351a0 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 50 61  else{.    lockPa
351b0 74 68 3d 28 63 68 61 72 20 2a 29 70 61 74 68 3b  th=(char *)path;
351c0 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41 43  .  }.  .  OSTRAC
351d0 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20  E(("TRANSPROXY  
351e0 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64  %d for %s pid=%d
351f0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
35200 20 20 20 20 20 20 20 20 20 20 28 6c 6f 63 6b 50            (lockP
35210 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68 20 3a  ath ? lockPath :
35220 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70   ":auto:"), getp
35230 69 64 28 29 29 29 3b 0a 0a 20 20 70 43 74 78 20  id()));..  pCtx 
35240 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
35250 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20  ( sizeof(*pCtx) 
35260 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30  );.  if( pCtx==0
35270 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
35280 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
35290 0a 20 20 6d 65 6d 73 65 74 28 70 43 74 78 2c 20  .  memset(pCtx, 
352a0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  0, sizeof(*pCtx)
352b0 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f 78 79  );..  rc = proxy
352c0 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e  CreateConchPathn
352d0 61 6d 65 28 64 62 50 61 74 68 2c 20 26 70 43 74  ame(dbPath, &pCt
352e0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
352f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
35300 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
35310 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e   = proxyCreateUn
35320 69 78 46 69 6c 65 28 70 43 74 78 2d 3e 63 6f 6e  ixFile(pCtx->con
35330 63 68 46 69 6c 65 50 61 74 68 2c 20 26 70 43 74  chFilePath, &pCt
35340 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c 20 30 29  x->conchFile, 0)
35350 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
35360 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 26 26  LITE_CANTOPEN &&
35370 20 28 28 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c   ((pFile->openFl
35380 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30  ags&O_RDWR) == 0
35390 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  ) ){.      /* if
353a0 20 28 61 29 20 74 68 65 20 6f 70 65 6e 20 66 6c   (a) the open fl
353b0 61 67 73 20 61 72 65 20 6e 6f 74 20 4f 5f 52 44  ags are not O_RD
353c0 57 52 2c 20 28 62 29 20 74 68 65 20 63 6f 6e 63  WR, (b) the conc
353d0 68 20 69 73 6e 27 74 20 74 68 65 72 65 2c 20 61  h isn't there, a
353e0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 63 29 20  nd.      ** (c) 
353f0 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20  the file system 
35400 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68  is read-only, th
35410 65 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c 6f 63  en enable no-loc
35420 6b 69 6e 67 20 61 63 63 65 73 73 2e 0a 20 20 20  king access..   
35430 20 20 20 2a 2a 20 55 67 68 2c 20 73 69 6e 63 65     ** Ugh, since
35440 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30 30 30   O_RDONLY==0x000
35450 30 20 77 65 20 74 65 73 74 20 66 6f 72 20 21 4f  0 we test for !O
35460 5f 52 44 57 52 20 73 69 6e 63 65 20 75 6e 69 78  _RDWR since unix
35470 4f 70 65 6e 20 61 73 73 65 72 74 73 0a 20 20 20  Open asserts.   
35480 20 20 20 2a 2a 20 74 68 61 74 20 6f 70 65 6e 46     ** that openF
35490 6c 61 67 73 20 77 69 6c 6c 20 68 61 76 65 20 6f  lags will have o
354a0 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f 52 44 4f  nly one of O_RDO
354b0 4e 4c 59 20 6f 72 20 4f 5f 52 44 57 52 2e 0a 20  NLY or O_RDWR.. 
354c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
354d0 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
354e0 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  fo;.      struct
354f0 20 73 74 61 74 20 63 6f 6e 63 68 49 6e 66 6f 3b   stat conchInfo;
35500 0a 20 20 20 20 20 20 69 6e 74 20 67 6f 4c 6f 63  .      int goLoc
35510 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a 20 20 20 20  kless = 0;..    
35520 20 20 69 66 28 20 6f 73 53 74 61 74 28 70 43 74    if( osStat(pCt
35530 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
35540 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20 3d 3d  , &conchInfo) ==
35550 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 20 20   -1 ) {.        
35560 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b  int err = errno;
35570 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65 72  .        if( (er
35580 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20 28 73  r==ENOENT) && (s
35590 74 61 74 66 73 28 64 62 50 61 74 68 2c 20 26 66  tatfs(dbPath, &f
355a0 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20 29 7b  sInfo) != -1) ){
355b0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 4c 6f 63  .          goLoc
355c0 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e 66 6f 2e  kless = (fsInfo.
355d0 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44 4f 4e  f_flags&MNT_RDON
355e0 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f 4e 4c  LY) == MNT_RDONL
355f0 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
35600 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67     }.      if( g
35610 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20 20 20  oLockless ){.   
35620 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68       pCtx->conch
35630 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20 72 65  Held = -1; /* re
35640 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f 63 6b  ad only FS/ lock
35650 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  less */.        
35660 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
35670 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
35680 7d 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  }  .  if( rc==SQ
35690 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 50  LITE_OK && lockP
356a0 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74 78 2d  ath ){.    pCtx-
356b0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d  >lockProxyPath =
356c0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
356d0 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a 20  (0, lockPath);. 
356e0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
356f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
35700 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 73 71  Ctx->dbPath = sq
35710 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
35720 20 64 62 50 61 74 68 29 3b 0a 20 20 20 20 69 66   dbPath);.    if
35730 28 20 70 43 74 78 2d 3e 64 62 50 61 74 68 3d 3d  ( pCtx->dbPath==
35740 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63  NULL ){.      rc
35750 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
35760 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
35770 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
35780 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d 65 6d  {.    /* all mem
35790 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ory is allocated
357a0 2c 20 70 72 6f 78 79 73 20 61 72 65 20 63 72 65  , proxys are cre
357b0 61 74 65 64 20 61 6e 64 20 61 73 73 69 67 6e 65  ated and assigne
357c0 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69 74 63  d, .    ** switc
357d0 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  h the locking co
357e0 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f  ntext and pMetho
357f0 64 20 74 68 65 6e 20 72 65 74 75 72 6e 2e 0a 20  d then return.. 
35800 20 20 20 2a 2f 0a 20 20 20 20 70 43 74 78 2d 3e     */.    pCtx->
35810 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oldLockingContex
35820 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t = pFile->locki
35830 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70  ngContext;.    p
35840 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
35850 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20 20 20  text = pCtx;.   
35860 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f   pCtx->pOldMetho
35870 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  d = pFile->pMeth
35880 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  od;.    pFile->p
35890 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78 79 49  Method = &proxyI
358a0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
358b0 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  e{.    if( pCtx-
358c0 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20 0a 20  >conchFile ){ . 
358d0 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68       pCtx->conch
358e0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
358f0 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
35900 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63  ile *)pCtx->conc
35910 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71  hFile);.      sq
35920 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
35930 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20  >conchFile);.   
35940 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
35950 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f  Free(0, pCtx->lo
35960 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  ckProxyPath);.  
35970 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
35980 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
35990 74 68 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65  th); .    sqlite
359a0 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20  3_free(pCtx);.  
359b0 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52  }.  OSTRACE(("TR
359c0 41 4e 53 50 52 4f 58 59 20 20 25 64 20 25 73 5c  ANSPROXY  %d %s\
359d0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
359e0 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51           (rc==SQ
359f0 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
35a00 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a 20 20   "failed")));.  
35a10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
35a20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
35a30 65 20 68 61 6e 64 6c 65 73 20 73 71 6c 69 74 65  e handles sqlite
35a40 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29  3_file_control()
35a50 20 63 61 6c 6c 73 20 74 68 61 74 20 61 72 65 20   calls that are 
35a60 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 70  specific.** to p
35a70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  roxy locking..*/
35a80 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
35a90 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  yFileControl(sql
35aa0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
35ab0 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
35ac0 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  g){.  switch( op
35ad0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
35ae0 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
35af0 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75  YFILE: {.      u
35b00 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
35b10 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
35b20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d        if( pFile-
35b30 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f  >pMethod == &pro
35b40 78 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  xyIoMethods ){. 
35b50 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b         proxyLock
35b60 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
35b70 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
35b80 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e  Context*)pFile->
35b90 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
35ba0 20 20 20 20 20 20 20 20 70 72 6f 78 79 54 61 6b          proxyTak
35bb0 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
35bc0 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d         if( pCtx-
35bd0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
35be0 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f  {.          *(co
35bf0 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67  nst char **)pArg
35c00 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
35c10 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20  xyPath;.        
35c20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
35c30 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a   *(const char **
35c40 29 70 41 72 67 20 3d 20 22 3a 61 75 74 6f 3a 20  )pArg = ":auto: 
35c50 28 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20 20 20  (not held)";.   
35c60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65       }.      } e
35c70 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2a 28  lse {.        *(
35c80 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41  const char **)pA
35c90 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20  rg = NULL;.     
35ca0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
35cb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
35cc0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
35cd0 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
35ce0 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  LE: {.      unix
35cf0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
35d00 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
35d10 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
35d20 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74  TE_OK;.      int
35d30 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 3d 20   isProxyStyle = 
35d40 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20  (pFile->pMethod 
35d50 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f  == &proxyIoMetho
35d60 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ds);.      if( p
35d70 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 63 6f  Arg==NULL || (co
35d80 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72 67 3d  nst char *)pArg=
35d90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
35da0 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29  ( isProxyStyle )
35db0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  {.          /* t
35dc0 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f  urn off proxy lo
35dd0 63 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75 70 70  cking - not supp
35de0 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  orted */.       
35df0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
35e00 52 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f 50 52  RROR /*SQLITE_PR
35e10 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d  OTOCOL? SQLITE_M
35e20 49 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20 20 20  ISUSE?*/;.      
35e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35e40 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70     /* turn off p
35e50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 61  roxy locking - a
35e60 6c 72 65 61 64 79 20 6f 66 66 20 2d 20 4e 4f 4f  lready off - NOO
35e70 50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  P */.          r
35e80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
35e90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35ea0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
35eb0 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 50  nst char *proxyP
35ec0 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ath = (const cha
35ed0 72 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  r *)pArg;.      
35ee0 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79    if( isProxySty
35ef0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
35f00 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
35f10 65 78 74 20 2a 70 43 74 78 20 3d 20 0a 20 20 20  ext *pCtx = .   
35f20 20 20 20 20 20 20 20 20 20 28 70 72 6f 78 79 4c           (proxyL
35f30 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70  ockingContext*)p
35f40 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
35f50 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  text;.          
35f60 69 66 28 20 21 73 74 72 63 6d 70 28 70 41 72 67  if( !strcmp(pArg
35f70 2c 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20 20 20  , ":auto:") .   
35f80 20 20 20 20 20 20 20 20 7c 7c 20 28 70 43 74 78          || (pCtx
35f90 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
35fa0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
35fb0 20 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d    !strncmp(pCtx-
35fc0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20  >lockProxyPath, 
35fd0 70 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41  proxyPath, MAXPA
35fe0 54 48 4c 45 4e 29 29 0a 20 20 20 20 20 20 20 20  THLEN)).        
35ff0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
36000 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
36010 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
36020 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
36030 20 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f   = switchLockPro
36040 78 79 50 61 74 68 28 70 46 69 6c 65 2c 20 70 72  xyPath(pFile, pr
36050 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20  oxyPath);.      
36060 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
36070 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
36080 2a 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78 79 20  * turn on proxy 
36090 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  file locking */.
360a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
360b0 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
360c0 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 70 72 6f  xFile(pFile, pro
360d0 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  xyPath);.       
360e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
360f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
36100 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
36110 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
36120 20 29 3b 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c   );  /* The call
36130 20 61 73 73 75 72 65 73 20 74 68 61 74 20 6f 6e   assures that on
36140 6c 79 20 76 61 6c 69 64 20 6f 70 63 6f 64 65 73  ly valid opcodes
36150 20 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20 20 20   are sent */.   
36160 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
36170 41 43 48 45 44 2a 2f 0a 20 20 72 65 74 75 72 6e  ACHED*/.  return
36180 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
36190 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74  ../*.** Within t
361a0 68 69 73 20 64 69 76 69 73 69 6f 6e 20 28 74 68  his division (th
361b0 65 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69  e proxying locki
361c0 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
361d0 6e 29 20 74 68 65 20 70 72 6f 63 65 64 75 72 65  n) the procedure
361e0 73 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20  s.** above this 
361f0 70 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20 75 74  point are all ut
36200 69 6c 69 74 69 65 73 2e 20 20 54 68 65 20 6c 6f  ilities.  The lo
36210 63 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74 68 6f  ck-related metho
36220 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 72 6f  ds of the.** pro
36230 78 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74  xy-locking sqlit
36240 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a  e3_io_method obj
36250 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a  ect follow..*/..
36260 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
36270 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
36280 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
36290 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
362a0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
362b0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
362c0 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
362d0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
362e0 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
362f0 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
36300 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
36310 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
36320 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
36330 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
36340 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
36350 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
36360 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
36370 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
36380 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
36390 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
363a0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
363b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
363c0 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
363d0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
363e0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
363f0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
36400 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28   proxyTakeConch(
36410 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  pFile);.  if( rc
36420 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36430 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43     proxyLockingC
36440 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
36450 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
36460 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
36470 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
36480 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
36490 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20  Held>0 ){.      
364a0 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20  unixFile *proxy 
364b0 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
364c0 79 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  y;.      return 
364d0 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  proxy->pMethod->
364e0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
364f0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
36500 2a 29 70 72 6f 78 79 2c 20 70 52 65 73 4f 75 74  *)proxy, pResOut
36510 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 2f 2a  );.    }else{ /*
36520 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69   conchHeld < 0 i
36530 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20  s lockless */.  
36540 20 20 20 20 70 52 65 73 4f 75 74 3d 30 3b 0a 20      pResOut=0;. 
36550 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
36560 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
36570 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
36580 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
36590 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
365a0 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
365b0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
365c0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
365d0 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
365e0 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
365f0 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
36600 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
36610 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
36620 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
36630 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
36640 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
36650 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
36660 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
36670 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
36680 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
36690 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
366a0 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
366b0 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
366c0 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
366d0 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
366e0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
366f0 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
36700 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
36710 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
36720 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
36730 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
36740 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
36750 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
36760 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
36770 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
36780 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
36790 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
367a0 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
367b0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
367c0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
367d0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
367e0 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
367f0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
36800 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
36810 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
36820 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
36830 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
36840 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
36850 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
36860 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
36870 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
36880 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
36890 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
368a0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
368b0 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
368c0 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
368d0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
368e0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
368f0 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63   = proxyTakeConc
36900 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  h(pFile);.  if( 
36910 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36920 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
36930 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
36940 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
36950 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
36960 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
36970 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
36980 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20  chHeld>0 ){.    
36990 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78    unixFile *prox
369a0 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
369b0 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  oxy;.      rc = 
369c0 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  proxy->pMethod->
369d0 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
369e0 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46 69 6c  ile*)proxy, eFil
369f0 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 70 46  eLock);.      pF
36a00 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
36a10 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c 6f 63   proxy->eFileLoc
36a20 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
36a30 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64      /* conchHeld
36a40 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73   < 0 is lockless
36a50 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
36a60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
36a70 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
36a80 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
36a90 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
36aa0 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
36ab0 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
36ac0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
36ad0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
36ae0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
36af0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
36b00 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
36b10 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
36b20 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
36b30 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
36b40 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
36b50 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
36b60 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
36b70 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e  atic int proxyUn
36b80 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
36b90 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
36ba0 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
36bb0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
36bc0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
36bd0 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43   rc = proxyTakeC
36be0 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69  onch(pFile);.  i
36bf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36c00 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63   ){.    proxyLoc
36c10 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
36c20 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
36c30 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
36c40 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
36c50 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  ;.    if( pCtx->
36c60 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20  conchHeld>0 ){. 
36c70 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70       unixFile *p
36c80 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
36c90 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63  kProxy;.      rc
36ca0 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f   = proxy->pMetho
36cb0 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
36cc0 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c  te3_file*)proxy,
36cd0 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20   eFileLock);.   
36ce0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
36cf0 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69  ock = proxy->eFi
36d00 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73  leLock;.    }els
36d10 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63  e{.      /* conc
36d20 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63  hHeld < 0 is loc
36d30 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  kless */.    }. 
36d40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
36d50 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
36d60 20 66 69 6c 65 20 74 68 61 74 20 75 73 65 73 20   file that uses 
36d70 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a  proxy locks..*/.
36d80 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
36d90 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
36da0 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
36db0 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
36dc0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
36dd0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 70  xFile*)id;.    p
36de0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
36df0 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
36e00 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
36e10 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
36e20 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69  Context;.    uni
36e30 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
36e40 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
36e50 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  xy;.    unixFile
36e60 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
36e70 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
36e80 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
36e90 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 20 20  TE_OK;.    .    
36ea0 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20 29 7b  if( lockProxy ){
36eb0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  .      rc = lock
36ec0 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  Proxy->pMethod->
36ed0 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
36ee0 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79  _file*)lockProxy
36ef0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
36f00 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
36f10 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d  n rc;.      rc =
36f20 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74   lockProxy->pMet
36f30 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
36f40 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50  ite3_file*)lockP
36f50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28  roxy);.      if(
36f60 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
36f70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
36f80 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a  ree(lockProxy);.
36f90 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b        pCtx->lock
36fa0 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20 20 7d  Proxy = 0;.    }
36fb0 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69  .    if( conchFi
36fc0 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
36fd0 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
36fe0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
36ff0 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63  proxyReleaseConc
37000 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  h(pFile);.      
37010 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
37020 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
37030 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
37040 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  le->pMethod->xCl
37050 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
37060 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  e*)conchFile);. 
37070 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
37080 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
37090 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f 6e 63  qlite3_free(conc
370a0 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  hFile);.    }.  
370b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
370c0 30 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  0, pCtx->lockPro
370d0 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  xyPath);.    sql
370e0 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e  ite3_free(pCtx->
370f0 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a  conchFilePath);.
37100 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
37110 65 28 30 2c 20 70 43 74 78 2d 3e 64 62 50 61 74  e(0, pCtx->dbPat
37120 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73 74 6f  h);.    /* resto
37130 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  re the original 
37140 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
37150 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e  and pMethod then
37160 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20 20 20   close it */.   
37170 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
37180 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 2d 3e 6f  ontext = pCtx->o
37190 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
371a0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65  ;.    pFile->pMe
371b0 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70 4f 6c  thod = pCtx->pOl
371c0 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73 71 6c  dMethod;.    sql
371d0 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b  ite3_free(pCtx);
371e0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c  .    return pFil
371f0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  e->pMethod->xClo
37200 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  se(id);.  }.  re
37210 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
37220 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  }....#endif /* d
37230 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
37240 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
37250 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
37260 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72   */./*.** The pr
37270 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  oxy locking styl
37280 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f  e is intended fo
37290 72 20 75 73 65 20 77 69 74 68 20 41 46 50 20 66  r use with AFP f
372a0 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 20 41  ilesystems..** A
372b0 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69 73 20  nd since AFP is 
372c0 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f  only supported o
372d0 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20 70 72  n MacOSX, the pr
372e0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
372f0 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63 74 65  lso.** restricte
37300 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a 2a 20  d to MacOSX..** 
37310 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
37320 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
37330 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 69 6d  he proxy lock im
37340 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
37350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37360 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
37370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
373a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
373b0 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  **/../*.** Initi
373c0 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74  alize the operat
373d0 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
373e0 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  face..**.** This
373f0 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65   routine registe
37400 72 73 20 61 6c 6c 20 56 46 53 20 69 6d 70 6c 65  rs all VFS imple
37410 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 75  mentations for u
37420 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61 74 69  nix-like operati
37430 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 20 20  ng.** systems.  
37440 54 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 6e  This routine, an
37450 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 73  d the sqlite3_os
37460 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 20 74  _end() routine t
37470 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20  hat follows,.** 
37480 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e  should be the on
37490 6c 79 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ly routines in t
374a0 68 69 73 20 66 69 6c 65 20 74 68 61 74 20 61 72  his file that ar
374b0 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d 20 6f  e visible from o
374c0 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a  ther.** files..*
374d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
374e0 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
374f0 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 69   during SQLite i
37500 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 6e  nitialization an
37510 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67 6c 65  d by a.** single
37520 20 74 68 72 65 61 64 2e 20 20 54 68 65 20 6d 65   thread.  The me
37530 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
37540 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73  and mutex subsys
37550 74 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a 2a 2a  tems have not.**
37560 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62 65 65   necessarily bee
37570 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  n initialized wh
37580 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
37590 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73  is called, and s
375a0 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64  o they.** should
375b0 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a 2a 2f   not be used..*/
375c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
375d0 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20 20 2f  init(void){ .  /
375e0 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  * .  ** The foll
375f0 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64 65 66 69  owing macro defi
37600 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  nes an initializ
37610 65 72 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65  er for an sqlite
37620 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 20 20  3_vfs object..  
37630 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  ** The name of t
37640 68 65 20 56 46 53 20 69 73 20 4e 41 4d 45 2e 20  he VFS is NAME. 
37650 20 54 68 65 20 70 41 70 70 44 61 74 61 20 69 73   The pAppData is
37660 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
37670 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74 6f 20  pointer.  ** to 
37680 74 68 65 20 22 66 69 6e 64 65 72 22 20 66 75 6e  the "finder" fun
37690 63 74 69 6f 6e 2e 20 20 28 70 41 70 70 44 61 74  ction.  (pAppDat
376a0 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  a is a pointer t
376b0 6f 20 61 20 70 6f 69 6e 74 65 72 20 62 65 63 61  o a pointer beca
376c0 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c 79 20 43  use.  ** silly C
376d0 39 30 20 72 75 6c 65 73 20 70 72 6f 68 69 62 69  90 rules prohibi
376e0 74 20 61 20 76 6f 69 64 2a 20 66 72 6f 6d 20 62  t a void* from b
376f0 65 69 6e 67 20 63 61 73 74 20 74 6f 20 61 20 66  eing cast to a f
37700 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 0a  unction pointer.
37710 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77 65 20 68    ** and so we h
37720 61 76 65 20 74 6f 20 67 6f 20 74 68 72 6f 75 67  ave to go throug
37730 68 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  h the intermedia
37740 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 76  te pointer to av
37750 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20 20 2a  oid problems.  *
37760 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
37770 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d   with -pedantic-
37780 65 72 72 6f 72 73 20 6f 6e 20 47 43 43 2e 29 0a  errors on GCC.).
37790 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 46 49    **.  ** The FI
377a0 4e 44 45 52 20 70 61 72 61 6d 65 74 65 72 20 74  NDER parameter t
377b0 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  o this macro is 
377c0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
377d0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20  pointer to the. 
377e0 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e 63 74   ** finder-funct
377f0 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64 65 72  ion.  The finder
37800 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  -function return
37810 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
37820 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 69  he.  ** sqlite_i
37830 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
37840 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
37850 20 74 68 65 20 64 65 73 69 72 65 64 20 6c 6f 63   the desired loc
37860 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61 76 69  king.  ** behavi
37870 6f 72 73 2e 20 20 53 65 65 20 74 68 65 20 64 69  ors.  See the di
37880 76 69 73 69 6f 6e 20 61 62 6f 76 65 20 74 68 61  vision above tha
37890 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49  t contains the I
378a0 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20 6d 61  OMETHODS.  ** ma
378b0 63 72 6f 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  cro for addition
378c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
378d0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 73  finder-functions
378e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 73 74  ..  **.  ** Most
378f0 20 66 69 6e 64 65 72 73 20 73 69 6d 70 6c 79 20   finders simply 
37900 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
37910 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69   to a fixed sqli
37920 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 20  te3_io_methods. 
37930 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42 75 74   ** object.  But
37940 20 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b 49 6f   the "autolockIo
37950 46 69 6e 64 65 72 22 20 61 76 61 69 6c 61 62 6c  Finder" availabl
37960 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f 65 73  e on MacOSX does
37970 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a 20 6d   a little.  ** m
37980 6f 72 65 20 74 68 61 6e 20 74 68 61 74 3b 20 69  ore than that; i
37990 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66  t looks at the f
379a0 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 74  ilesystem type t
379b0 68 61 74 20 68 6f 73 74 73 20 74 68 65 20 0a 20  hat hosts the . 
379c0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
379d0 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 63  e and tries to c
379e0 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69 6e 67  hoose an locking
379f0 20 6d 65 74 68 6f 64 20 61 70 70 72 6f 70 72 69   method appropri
37a00 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68 61  ate for.  ** tha
37a10 74 20 66 69 6c 65 73 79 73 74 65 6d 20 74 69 6d  t filesystem tim
37a20 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e  e..  */.  #defin
37a30 65 20 55 4e 49 58 56 46 53 28 56 46 53 4e 41 4d  e UNIXVFS(VFSNAM
37a40 45 2c 20 46 49 4e 44 45 52 29 20 7b 20 20 20 20  E, FINDER) {    
37a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a60 20 20 20 20 5c 0a 20 20 20 20 33 2c 20 20 20 20      \.    3,    
37a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a80 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
37a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37aa0 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66 28 75    \.    sizeof(u
37ab0 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a  nixFile),     /*
37ac0 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20 20 20   szOsFile */    
37ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ae0 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 4e 41  \.    MAX_PATHNA
37af0 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6d  ME,         /* m
37b00 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20  xPathname */    
37b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
37b20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
37b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
37b40 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  xt */           
37b50 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37b60 20 20 56 46 53 4e 41 4d 45 2c 20 20 20 20 20 20    VFSNAME,      
37b70 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65          /* zName
37b80 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37b90 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
37ba0 28 76 6f 69 64 2a 29 26 46 49 4e 44 45 52 2c 20  (void*)&FINDER, 
37bb0 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
37bc0 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  a */            
37bd0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
37be0 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  ixOpen,         
37bf0 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 20      /* xOpen */ 
37c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c10 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
37c20 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
37c30 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 20    /* xDelete */ 
37c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c50 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 41 63      \.    unixAc
37c60 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
37c70 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20 20 20  /* xAccess */   
37c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c90 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75 6c 6c    \.    unixFull
37ca0 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
37cb0 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
37cc0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
37cd0 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70 65 6e  \.    unixDlOpen
37ce0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
37cf0 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20  DlOpen */       
37d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
37d10 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f 72 2c      unixDlError,
37d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
37d30 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20  Error */        
37d40 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37d50 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20    unixDlSym,    
37d60 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
37d70 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  m */            
37d80 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
37d90 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20 20 20  unixDlClose,    
37da0 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
37db0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
37dc0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
37dd0 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  ixRandomness,   
37de0 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
37df0 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ss */           
37e00 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
37e10 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
37e20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 20 20    /* xSleep */  
37e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e40 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75      \.    unixCu
37e50 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
37e60 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
37e70 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
37e80 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65 74 4c    \.    unixGetL
37e90 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a  astError,     /*
37ea0 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
37eb0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
37ec0 5c 0a 20 20 20 20 75 6e 69 78 43 75 72 72 65 6e  \.    unixCurren
37ed0 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78  tTimeInt64, /* x
37ee0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
37ef0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 5c 0a   */           \.
37f00 20 20 20 20 75 6e 69 78 53 65 74 53 79 73 74 65      unixSetSyste
37f10 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65  mCall,    /* xSe
37f20 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20  tSystemCall */  
37f30 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37f40 20 20 75 6e 69 78 47 65 74 53 79 73 74 65 6d 43    unixGetSystemC
37f50 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53  all,    /* xGetS
37f60 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20 20 20  ystemCall */    
37f70 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
37f80 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61  unixNextSystemCa
37f90 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79  ll,   /* xNextSy
37fa0 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20 20 20 20  stemCall */     
37fb0 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 0a 20          \.  }.. 
37fc0 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64 65 66   /*.  ** All def
37fd0 61 75 6c 74 20 56 46 53 65 73 20 66 6f 72 20 75  ault VFSes for u
37fe0 6e 69 78 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  nix are containe
37ff0 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d in the followi
38000 6e 67 20 61 72 72 61 79 2e 0a 20 20 2a 2a 0a 20  ng array..  **. 
38010 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
38020 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 70 4e  e sqlite3_vfs.pN
38030 65 78 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ext field of the
38040 20 56 46 53 20 6f 62 6a 65 63 74 20 69 73 20 6d   VFS object is m
38050 6f 64 69 66 69 65 64 0a 20 20 2a 2a 20 62 79 20  odified.  ** by 
38060 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
38070 77 68 65 6e 20 74 68 65 20 56 46 53 20 69 73 20  when the VFS is 
38080 72 65 67 69 73 74 65 72 65 64 2e 20 20 53 6f 20  registered.  So 
38090 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
380a0 2a 2a 20 61 72 72 61 79 20 63 61 6e 6e 6f 74 20  ** array cannot 
380b0 62 65 20 63 6f 6e 73 74 2e 0a 20 20 2a 2f 0a 20  be const..  */. 
380c0 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
380d0 76 66 73 20 61 56 66 73 5b 5d 20 3d 20 7b 0a 23  vfs aVfs[] = {.#
380e0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
380f0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
38100 26 20 28 4f 53 5f 56 58 57 4f 52 4b 53 20 7c 7c  & (OS_VXWORKS ||
38110 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
38120 5f 5f 29 29 0a 20 20 20 20 55 4e 49 58 56 46 53  __)).    UNIXVFS
38130 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20  ("unix",        
38140 20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64    autolockIoFind
38150 65 72 20 29 2c 0a 23 65 6c 73 65 0a 20 20 20 20  er ),.#else.    
38160 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22 2c 20  UNIXVFS("unix", 
38170 20 20 20 20 20 20 20 20 20 70 6f 73 69 78 49 6f           posixIo
38180 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66  Finder ),.#endif
38190 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
381a0 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 20 6e 6f  ix-none",     no
381b0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a  lockIoFinder ),.
381c0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
381d0 78 2d 64 6f 74 66 69 6c 65 22 2c 20 20 64 6f 74  x-dotfile",  dot
381e0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a  lockIoFinder ),.
381f0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
38200 78 2d 65 78 63 6c 22 2c 20 20 20 20 20 70 6f 73  x-excl",     pos
38210 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69  ixIoFinder ),.#i
38220 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
38230 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e   UNIXVFS("unix-n
38240 61 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49 6f 46  amedsem", semIoF
38250 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a  inder ),.#endif.
38260 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
38270 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
38280 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
38290 78 2d 70 6f 73 69 78 22 2c 20 20 20 20 70 6f 73  x-posix",    pos
382a0 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69  ixIoFinder ),.#i
382b0 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  f !OS_VXWORKS.  
382c0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
382d0 66 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f 63 6b  flock",    flock
382e0 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64  IoFinder ),.#end
382f0 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  if.#endif.#if SQ
38300 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
38310 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
38320 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
38330 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
38340 78 2d 61 66 70 22 2c 20 20 20 20 20 20 61 66 70  x-afp",      afp
38350 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20  IoFinder ),.    
38360 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 66  UNIXVFS("unix-nf
38370 73 22 2c 20 20 20 20 20 20 6e 66 73 49 6f 46 69  s",      nfsIoFi
38380 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58  nder ),.    UNIX
38390 56 46 53 28 22 75 6e 69 78 2d 70 72 6f 78 79 22  VFS("unix-proxy"
383a0 2c 20 20 20 20 70 72 6f 78 79 49 6f 46 69 6e 64  ,    proxyIoFind
383b0 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 7d  er ),.#endif.  }
383c0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
383d0 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   i;          /* 
383e0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
383f0 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65  .  /* Double-che
38400 63 6b 20 74 68 61 74 20 74 68 65 20 61 53 79 73  ck that the aSys
38410 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73  call[] array has
38420 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65   been constructe
38430 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79  d.  ** correctly
38440 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62  .  See ticket [b
38450 62 33 61 38 36 65 38 39 30 63 38 65 39 36 61 62  b3a86e890c8e96ab
38460 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41  ] */.  assert( A
38470 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
38480 6c 29 3d 3d 32 30 20 29 3b 0a 0a 20 20 2f 2a 20  l)==20 );..  /* 
38490 52 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53  Register all VFS
384a0 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68  es defined in th
384b0 65 20 61 56 66 73 5b 5d 20 61 72 72 61 79 20 2a  e aVfs[] array *
384c0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28  /.  for(i=0; i<(
384d0 73 69 7a 65 6f 66 28 61 56 66 73 29 2f 73 69 7a  sizeof(aVfs)/siz
384e0 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29  eof(sqlite3_vfs)
384f0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ); i++){.    sql
38500 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
38510 72 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d 3d 30  r(&aVfs[i], i==0
38520 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
38530 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d