/ Hex Artifact Content
Login

Artifact f0753566e1125d8b2eef6dd080b48ed91a83d424:


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 0a 23 69 66  .h>.#endif...#if
1170: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1180: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
1190: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
11a0: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
11b0: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
11c0: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
11d0: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
11e0: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
11f0: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
1200: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
1210: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
1220: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1230: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1240: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1250: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1260: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1270: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1280: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
1290: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
12a0: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
12b0: 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45  dif..#ifdef HAVE
12c0: 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65  _UTIME.# include
12d0: 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69   <utime.h>.#endi
12e0: 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  f../*.** Allowed
12f0: 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46   values of unixF
1300: 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23  ile.fsFlags.*/.#
1310: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53  define SQLITE_FS
1320: 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20  FLAGS_IS_MSDOS  
1330: 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66     0x1../*.** If
1340: 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68   we are to be th
1350: 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75  read-safe, inclu
1360: 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20  de the pthreads 
1370: 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e  header and defin
1380: 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  e.** the SQLITE_
1390: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63  UNIX_THREADS mac
13a0: 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ro..*/.#if SQLIT
13b0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69  E_THREADSAFE.# i
13c0: 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e  nclude <pthread.
13d0: 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  h>.# define SQLI
13e0: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
13f0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
1400: 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  Default permissi
1410: 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e  ons when creatin
1420: 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a  g a new file.*/.
1430: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
1440: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
1450: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
1460: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1470: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
1480: 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0644.#endif../*
1490: 0a 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 2a 2f 0a 23 69 66 6e 64 65 66 20   dir.*/.#ifndef 
14d0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
14e0: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
14f0: 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  ONS.# define SQL
1500: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
1510: 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
1520: 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0755.#endif../*
1530: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70  .** Maximum supp
1540: 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74  orted path-lengt
1550: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  h..*/.#define MA
1560: 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a  X_PATHNAME 512..
1570: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74  /*.** Only set t
1580: 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20  he lastErrno if 
1590: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
15a0: 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61  s a real error a
15b0: 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72  nd not .** a nor
15c0: 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74  mal expected ret
15d0: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
15e0: 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
15f0: 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  E_OK.*/.#define 
1600: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29  IS_LOCK_ERROR(x)
1610: 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f    ((x != SQLITE_
1620: 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c  OK) && (x != SQL
1630: 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46  ITE_BUSY))../* F
1640: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1650: 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  s */.typedef str
1660: 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78  uct unixShm unix
1670: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1680: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1690: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
16a0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
16b0: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69   unixShmNode uni
16c0: 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  xShmNode;       
16d0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
16e0: 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70   instance */.typ
16f0: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
1700: 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e  InodeInfo unixIn
1710: 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e  odeInfo;   /* An
1720: 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64   i-node */.typed
1730: 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e  ef struct UnixUn
1740: 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65  usedFd UnixUnuse
1750: 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75  dFd;     /* An u
1760: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1770: 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  iptor */../*.** 
1780: 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72  Sometimes, after
1790: 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69   a file handle i
17a0: 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69  s closed by SQLi
17b0: 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73  te, the file des
17c0: 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f  criptor.** canno
17d0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
17e0: 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73  diately. In thes
17f0: 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63  e cases, instanc
1800: 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  es of the follow
1810: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
1820: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f   are used to sto
1830: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  re the file desc
1840: 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69  riptor while wai
1850: 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f  ting for an.** o
1860: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69  pportunity to ei
1870: 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65  ther close or re
1880: 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63  use it..*/.struc
1890: 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b  t UnixUnusedFd {
18a0: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18c0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
18d0: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e  to close */.  in
18e0: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
18f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
1900: 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   this file descr
1910: 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  iptor was opened
1920: 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55   with */.  UnixU
1930: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20  nusedFd *pNext; 
1940: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75       /* Next unu
1950: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
1960: 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65  tor on same file
1970: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
1980: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
1990: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
19a0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
19b0: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
19c0: 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70   unix.** VFS imp
19d0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f  lementations..*/
19e0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
19f0: 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c  unixFile unixFil
1a00: 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  e;.struct unixFi
1a10: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  le {.  sqlite3_i
1a20: 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
1a30: 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c  *pMethod;  /* Al
1a40: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65  ways the first e
1a50: 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
1a60: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a80: 20 54 68 65 20 56 46 53 20 74 68 61 74 20 63 72   The VFS that cr
1a90: 65 61 74 65 64 20 74 68 69 73 20 75 6e 69 78 46  eated this unixF
1aa0: 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ile */.  unixIno
1ab0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ad0: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
1ae0: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
1af0: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1b20: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1b30: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1b40: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1b50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1b60: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1b70: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1b80: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
1b90: 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20  int ctrlFlags;  
1ba0: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1bb0: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
1bc0: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
1bd0: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
1c00: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
1c10: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1c20: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1c30: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1c40: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1c50: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1c60: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1c70: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1c90: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1ca0: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1cb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
1cc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cd0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1ce0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
1cf0: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1d20: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1d30: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1d40: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d60: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1d70: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1d80: 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  */.#ifdef __QNXN
1d90: 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f  TO__.  int secto
1da0: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1dc0: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1dd0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1de0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1e00: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1e10: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1e20: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  */.#endif.#if SQ
1e30: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1e40: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
1e50: 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20  openFlags;      
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70 65  /* The flags spe
1e80: 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29  cified at open()
1e90: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1ea0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1eb0: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1ec0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1ed0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
1ee0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1ef0: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
1f00: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
1f10: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
1f20: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1f30: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1f40: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1f50: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1f60: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1f70: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1f80: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1f90: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1fa0: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1fb0: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1fc0: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1fd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1fe0: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1ff0: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
2000: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
2010: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
2020: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
2030: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
2040: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
2050: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
2060: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
2070: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
2080: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
2090: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
20a0: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
20b0: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
20c0: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
20d0: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
20e0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
20f0: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
2100: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
2110: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2120: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
2130: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2140: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2150: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
2160: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2170: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2180: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2190: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
21a0: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
21b0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
21c0: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
21d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
21e0: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
21f0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e 64  peration */.#end
2200: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
2210: 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65  _TEST.  /* In te
2220: 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73  st mode, increas
2230: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
2240: 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20 62  is structure a b
2250: 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a  it so that .  **
2260: 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68   it is larger th
2270: 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43 72  an the struct Cr
2280: 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20  ashFile defined 
2290: 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f  in test6.c..  */
22a0: 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e 67  .  char aPadding
22b0: 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [32];.#endif.};.
22c0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76  ./*.** Allowed v
22d0: 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 75 6e  alues for the un
22e0: 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73  ixFile.ctrlFlags
22f0: 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64 65   bitmask:.*/.#de
2300: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 45 58  fine UNIXFILE_EX
2310: 43 4c 20 20 20 20 20 20 20 20 30 78 30 31 20 20  CL        0x01  
2320: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
2330: 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f 63 65  s from one proce
2340: 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69  ss only */.#defi
2350: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e  ne UNIXFILE_RDON
2360: 4c 59 20 20 20 20 20 20 30 78 30 32 20 20 20 20  LY      0x02    
2370: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
2380: 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23  s read only */.#
2390: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
23a0: 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78 30 34  PERSIST_WAL 0x04
23b0: 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65       /* Persiste
23c0: 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23  nt WAL mode */.#
23d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
23e0: 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 23 20  SABLE_DIRSYNC.# 
23f0: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2400: 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 38 20  DIRSYNC    0x08 
2410: 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
2420: 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a 2f 0a   sync needed */.
2430: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55  #else.# define U
2440: 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20  NIXFILE_DIRSYNC 
2450: 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66 0a 23     0x00.#endif.#
2460: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2470: 50 53 4f 57 20 20 20 20 20 20 20 20 30 78 31 30  PSOW        0x10
2480: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49       /* SQLITE_I
2490: 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
24a0: 56 45 52 57 52 49 54 45 20 2a 2f 0a 23 64 65 66  VERWRITE */.#def
24b0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  ine UNIXFILE_DEL
24c0: 45 54 45 20 20 20 20 20 20 30 78 32 30 20 20 20  ETE      0x20   
24d0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63    /* Delete on c
24e0: 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lose */.#define 
24f0: 55 4e 49 58 46 49 4c 45 5f 55 52 49 20 20 20 20  UNIXFILE_URI    
2500: 20 20 20 20 20 30 78 34 30 20 20 20 20 20 2f 2a       0x40     /*
2510: 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67 68 74 20   Filename might 
2520: 68 61 76 65 20 71 75 65 72 79 20 70 61 72 61 6d  have query param
2530: 65 74 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65  eters */.#define
2540: 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
2550: 20 20 20 20 20 20 30 78 38 30 20 20 20 20 20 2f        0x80     /
2560: 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20 6c 6f 63  * Do no file loc
2570: 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  king */../*.** I
2580: 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74  nclude code that
2590: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c   is common to al
25a0: 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a  l os_*.c files.*
25b0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63  /.#include "os_c
25c0: 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  ommon.h"../*.** 
25d0: 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d  Define various m
25e0: 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d  acros that are m
25f0: 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65  issing from some
2600: 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66   systems..*/.#if
2610: 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45  ndef O_LARGEFILE
2620: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47  .# define O_LARG
2630: 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23  EFILE 0.#endif.#
2640: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  ifdef SQLITE_DIS
2650: 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66  ABLE_LFS.# undef
2660: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64   O_LARGEFILE.# d
2670: 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c  efine O_LARGEFIL
2680: 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  E 0.#endif.#ifnd
2690: 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20  ef O_NOFOLLOW.# 
26a0: 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f  define O_NOFOLLO
26b0: 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  W 0.#endif.#ifnd
26c0: 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65  ef O_BINARY.# de
26d0: 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a  fine O_BINARY 0.
26e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
26f0: 65 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f  e threadid macro
2700: 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65   resolves to the
2710: 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f   thread-id or to
2720: 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a   0.  Used for.**
2730: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
2740: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
2750: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
2760: 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68  DSAFE.#define th
2770: 72 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73  readid pthread_s
2780: 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66  elf().#else.#def
2790: 69 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23  ine threadid 0.#
27a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66  endif../*.** Dif
27b0: 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74  ferent Unix syst
27c0: 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e  ems declare open
27d0: 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  () in different 
27e0: 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a  ways.  Same use.
27f0: 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  ** open(const ch
2800: 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e  ar*,int,mode_t).
2810: 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65    Others use ope
2820: 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  n(const char*,in
2830: 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64  t,...)..** The d
2840: 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70  ifference is imp
2850: 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e  ortant when usin
2860: 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  g a pointer to t
2870: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  he function..**.
2880: 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77 61  ** The safest wa
2890: 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  y to deal with t
28a0: 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f  he problem is to
28b0: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69 73   always use this
28c0: 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63   wrapper.** whic
28d0: 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68 65  h always has the
28e0: 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e   same well-defin
28f0: 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ed interface..*/
2900: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69  .static int posi
2910: 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  xOpen(const char
2920: 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61   *zFile, int fla
2930: 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20  gs, int mode){. 
2940: 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69   return open(zFi
2950: 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29  le, flags, mode)
2960: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f  ;.}../*.** On so
2970: 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c  me systems, call
2980: 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77 69  s to fchown() wi
2990: 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65 73  ll trigger a mes
29a0: 73 61 67 65 20 69 6e 20 61 20 73 65 63 75 72 69  sage in a securi
29b0: 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65  ty.** log if the
29c0: 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d  y come from non-
29d0: 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e 20  root processes. 
29e0: 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e   So avoid callin
29f0: 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a  g fchown() if.**
2a00: 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e   we are not runn
2a10: 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a  ing as root..*/.
2a20: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
2a30: 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75  Fchown(int fd, u
2a40: 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20  id_t uid, gid_t 
2a50: 67 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 67  gid){.  return g
2a60: 65 74 65 75 69 64 28 29 20 3f 20 30 20 3a 20 66  eteuid() ? 0 : f
2a70: 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69 64  chown(fd,uid,gid
2a80: 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  );.}../* Forward
2a90: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
2aa0: 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
2ab0: 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
2ac0: 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a  r*, int*);../*.*
2ad0: 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61  * Many system ca
2ae0: 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64  lls are accessed
2af0: 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72   through pointer
2b00: 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f  -to-functions so
2b10: 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61   that.** they ma
2b20: 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  y be overridden 
2b30: 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61  at runtime to fa
2b40: 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69  cilitate fault i
2b50: 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a  njection during.
2b60: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73  ** testing and s
2b70: 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20  andboxing.  The 
2b80: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20  following array 
2b90: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20  holds the names 
2ba0: 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  and pointers.** 
2bb0: 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61  to all overridea
2bc0: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
2bd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
2be0: 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20  ct unix_syscall 
2bf0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2c00: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
2c10: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2c20: 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20   sytem call */. 
2c30: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
2c40: 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f  _ptr pCurrent; /
2c50: 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * Current value 
2c60: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
2c70: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
2c80: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66  syscall_ptr pDef
2c90: 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74  ault; /* Default
2ca0: 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73   value */.} aSys
2cb0: 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22  call[] = {.  { "
2cc0: 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28  open",         (
2cd0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
2ce0: 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20  ptr)posixOpen,  
2cf0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2d00: 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28  Open      ((int(
2d10: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
2d20: 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  nt,int))aSyscall
2d30: 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [0].pCurrent).. 
2d40: 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20   { "close",     
2d50: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2d60: 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20  all_ptr)close,  
2d70: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2d80: 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28  e osClose     ((
2d90: 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73  int(*)(int))aSys
2da0: 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74  call[1].pCurrent
2db0: 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c  )..  { "access",
2dc0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2dd0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65  syscall_ptr)acce
2de0: 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ss,     0  },.#d
2df0: 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20  efine osAccess  
2e00: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
2e10: 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73   char*,int))aSys
2e20: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
2e30: 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c  )..  { "getcwd",
2e40: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2e50: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63  syscall_ptr)getc
2e60: 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  wd,     0  },.#d
2e70: 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20  efine osGetcwd  
2e80: 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61    ((char*(*)(cha
2e90: 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  r*,size_t))aSysc
2ea0: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
2eb0: 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20  ..  { "stat",   
2ec0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
2ed0: 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c  yscall_ptr)stat,
2ee0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65         0  },.#de
2ef0: 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20  fine osStat     
2f00: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
2f10: 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61  char*,struct sta
2f20: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e  t*))aSyscall[4].
2f30: 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a  pCurrent)../*.**
2f40: 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69   The DJGPP compi
2f50: 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ler environment 
2f60: 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b  looks mostly lik
2f70: 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a  e Unix, but it.*
2f80: 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74  * lacks the fcnt
2f90: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  l() system call.
2fa0: 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63    So redefine fc
2fb0: 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65  ntl() to be some
2fc0: 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c  thing.** that al
2fd0: 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20  ways succeeds.  
2fe0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
2ff0: 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74  locking does not
3000: 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20   occur under.** 
3010: 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69  DJGPP.  But it i
3020: 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64  s DOS - what did
3030: 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a   you expect?.*/.
3040: 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  #ifdef __DJGPP__
3050: 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20  .  { "fstat",   
3060: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
3070: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64          0  },.#d
3080: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c  efine osFstat(a,
3090: 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20  b,c)    0.#else 
30a0: 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22      .  { "fstat"
30b0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
30c0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73  3_syscall_ptr)fs
30d0: 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  tat,      0  },.
30e0: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20  #define osFstat 
30f0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
3100: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
3110: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
3120: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b  ent).#endif..  {
3130: 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20   "ftruncate",   
3140: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3150: 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c  l_ptr)ftruncate,
3160: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
3170: 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e  osFtruncate ((in
3180: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29  t(*)(int,off_t))
3190: 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72  aSyscall[6].pCur
31a0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74  rent)..  { "fcnt
31b0: 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  l",        (sqli
31c0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
31d0: 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d  fcntl,      0  }
31e0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  ,.#define osFcnt
31f0: 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  l     ((int(*)(i
3200: 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73  nt,int,...))aSys
3210: 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74  call[7].pCurrent
3220: 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20  )..  { "read",  
3230: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3240: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64  syscall_ptr)read
3250: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
3260: 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20  efine osRead    
3270: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3280: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  nt,void*,size_t)
3290: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
32a0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
32b0: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
32c0: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
32d0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
32e0: 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20  { "pread",      
32f0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3300: 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20  ll_ptr)pread,   
3310: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
3320: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
3330: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3340: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3350: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3360: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
3370: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
3380: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
3390: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
33a0: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
33b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
33c0: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
33d0: 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73  read64",      (s
33e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
33f0: 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20 30  tr)pread64,    0
3400: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
3410: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3420: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3430: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3440: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3450: 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20 20  fine osPread64  
3460: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3470: 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t,void*,size_t,o
3480: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
3490: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
34a0: 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20 20  { "write",      
34b0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
34c0: 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20  ll_ptr)write,   
34d0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
34e0: 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28 73   osWrite     ((s
34f0: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
3500: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
3510: 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70  ))aSyscall[11].p
3520: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3530: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
3540: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
3550: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
3560: 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20    { "pwrite",   
3570: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3580: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c  call_ptr)pwrite,
3590: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
35a0: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
35b0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
35c0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
35d0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
35e0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
35f0: 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ite    ((ssize_t
3600: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3610: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3620: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3630: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3640: 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [12].pCurrent)..
3650: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
3660: 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77  PREAD64).  { "pw
3670: 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71  rite64",     (sq
3680: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3690: 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30 20  r)pwrite64,   0 
36a0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
36b0: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
36c0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
36d0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
36e0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
36f0: 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20 20  ine osPwrite64  
3700: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3710: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a  ,const void*,siz
3720: 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20  e_t,off_t))\.   
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3740: 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43   aSyscall[13].pC
3750: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
3760: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
3770: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 66 63  NG_STYLE.  { "fc
3780: 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71  hmod",       (sq
3790: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
37a0: 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 30 20  r)fchmod,     0 
37b0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66   },.#else.  { "f
37c0: 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73  chmod",       (s
37d0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
37e0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
37f0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3800: 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20  ine osFchmod    
3810: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64  ((int(*)(int,mod
3820: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  e_t))aSyscall[14
3830: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3840: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
3850: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
3860: 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
3870: 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c  LOCATE.  { "fall
3880: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
3890: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
38a0: 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c  posix_fallocate,
38b0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
38c0: 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20   "fallocate",   
38d0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
38e0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
38f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3900: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61  dif.#define osFa
3910: 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29  llocate ((int(*)
3920: 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74  (int,off_t,off_t
3930: 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70  ))aSyscall[15].p
3940: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75  Current)..  { "u
3950: 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73  nlink",       (s
3960: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3970: 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20  tr)unlink,      
3980: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3990: 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28  e osUnlink    ((
39a0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
39b0: 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  r*))aSyscall[16]
39c0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
39d0: 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c  "openDirectory",
39e0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
39f0: 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72  call_ptr)openDir
3a00: 65 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d  ectory,      0 }
3a10: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e  ,.#define osOpen
3a20: 44 69 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28  Directory ((int(
3a30: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
3a40: 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37  nt*))aSyscall[17
3a50: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3a60: 20 22 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20   "mkdir",       
3a70: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3a80: 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20  l_ptr)mkdir,    
3a90: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66         0 },.#def
3aa0: 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20  ine osMkdir     
3ab0: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
3ac0: 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79  har*,mode_t))aSy
3ad0: 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65  scall[18].pCurre
3ae0: 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22  nt)..  { "rmdir"
3af0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3b00: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d  3_syscall_ptr)rm
3b10: 64 69 72 2c 20 20 20 20 20 20 20 20 20 20 20 30  dir,           0
3b20: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d   },.#define osRm
3b30: 64 69 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29  dir     ((int(*)
3b40: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53  (const char*))aS
3b50: 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72  yscall[19].pCurr
3b60: 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6f 77  ent)..  { "fchow
3b70: 6e 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  n",       (sqlit
3b80: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3b90: 6f 73 69 78 46 63 68 6f 77 6e 2c 20 20 20 20 20  osixFchown,     
3ba0: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46  0 },.#define osF
3bb0: 63 68 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a  chown    ((int(*
3bc0: 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f  )(int,uid_t,gid_
3bd0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e  t))aSyscall[20].
3be0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3bf0: 75 6d 61 73 6b 22 2c 20 20 20 20 20 20 20 20 28  umask",        (
3c00: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3c10: 70 74 72 29 75 6d 61 73 6b 2c 20 20 20 20 20 20  ptr)umask,      
3c20: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3c30: 65 20 6f 73 55 6d 61 73 6b 20 20 20 20 20 28 28  e osUmask     ((
3c40: 6d 6f 64 65 5f 74 28 2a 29 28 6d 6f 64 65 5f 74  mode_t(*)(mode_t
3c50: 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70  ))aSyscall[21].p
3c60: 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20  Current)..}; /* 
3c70: 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72  End of the overr
3c80: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
3c90: 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  alls */../*.** T
3ca0: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
3cb0: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
3cc0: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
3cd0: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
3ce0: 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73  .** "unix" VFSes
3cf0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
3d00: 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73  _OK opon success
3d10: 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74  fully updating t
3d20: 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  he.** system cal
3d30: 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51  l pointer, or SQ
3d40: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66  LITE_NOTFOUND if
3d50: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e   there is no con
3d60: 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73  figurable.** sys
3d70: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a  tem call named z
3d80: 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Name..*/.static 
3d90: 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65  int unixSetSyste
3da0: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
3db0: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
3dc0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
3dd0: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
3de0: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
3df0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
3e00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
3e10: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
3e20: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
3e30: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3e40: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
3e50: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
3e60: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
3e70: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
3e80: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
3e90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
3ea0: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
3eb0: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
3ec0: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
3ed0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
3ee0: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
3ef0: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
3f00: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
3f10: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
3f20: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
3f30: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
3f40: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
3f50: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
3f60: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
3f70: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
3f80: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
3f90: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
3fa0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
3fb0: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
3fc0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
3fd0: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
3fe0: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
3ff0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
4000: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
4010: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
4020: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
4030: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
4040: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
4050: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
4060: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
4070: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
4080: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
4090: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
40a0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
40b0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
40c0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
40d0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
40e0: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
40f0: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
4100: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
4110: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
4120: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
4130: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
4140: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
4150: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
4160: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
4170: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
4180: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
4190: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
41a0: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
41b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
41c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
41d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
41e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
41f0: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
4200: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
4210: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
4220: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
4230: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
4240: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
4250: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
4260: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
4270: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
4280: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
4290: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
42a0: 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74  call_ptr unixGet
42b0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
42c0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
42d0: 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sed,.  const cha
42e0: 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e  r *zName.){.  un
42f0: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20  signed int i;.. 
4300: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
4310: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66  R(pNotUsed);.  f
4320: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
4330: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
4340: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
4350: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
4360: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
4370: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
4380: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
4390: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
43a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
43b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
43c0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
43d0: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
43e0: 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20  ll after zName. 
43f0: 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a   If zName==NULL.
4400: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  ** then return t
4410: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
4420: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
4430: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
4440: 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68  f zName.** is th
4450: 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61  e last system ca
4460: 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69  ll or if zName i
4470: 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f  s not the name o
4480: 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73  f a valid.** sys
4490: 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  tem call..*/.sta
44a0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
44b0: 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61  unixNextSystemCa
44c0: 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ll(sqlite3_vfs *
44d0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
44e0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
44f0: 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50   -1;..  UNUSED_P
4500: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69  ARAMETER(p);.  i
4510: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
4520: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
4530: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31  Size(aSyscall)-1
4540: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
4550: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
4560: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
4570: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
4580: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
4590: 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  ++; i<ArraySize(
45a0: 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b  aSyscall); i++){
45b0: 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c  .    if( aSyscal
45c0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30  l[i].pCurrent!=0
45d0: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
45e0: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d  ll[i].zName;.  }
45f0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4600: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65  /*.** Invoke ope
4610: 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74  n().  Do so mult
4620: 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69  iple times, unti
4630: 6c 20 69 74 20 65 69 74 68 65 72 20 73 75 63 63  l it either succ
4640: 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73  eeds or.** fails
4650: 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e   for some reason
4660: 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54   other than EINT
4670: 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  R..**.** If the 
4680: 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f  file creation mo
4690: 64 65 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e  de "m" is 0 then
46a0: 20 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 64   set it to the d
46b0: 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51  efault for.** SQ
46c0: 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66 61 75  Lite.  The defau
46d0: 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46  lt is SQLITE_DEF
46e0: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
46f0: 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a  SIONS (normally.
4700: 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69  ** 0644) as modi
4710: 66 69 65 64 20 62 79 20 74 68 65 20 73 79 73 74  fied by the syst
4720: 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20  em umask.  If m 
4730: 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a  is not 0, then.*
4740: 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
4750: 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65  creation mode be
4760: 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72   exactly m ignor
4770: 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a  ing the umask..*
4780: 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d  *.** The m param
4790: 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e  eter will be non
47a0: 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20  -zero only when 
47b0: 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d  creating -wal, -
47c0: 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20  journal,.** and 
47d0: 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20  -shm files.  We 
47e0: 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73  want those files
47f0: 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c   to have *exactl
4800: 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70  y* the same.** p
4810: 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68  ermissions as th
4820: 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
4830: 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72  abase, unadulter
4840: 61 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73  ated by the umas
4850: 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61  k..** In that wa
4860: 79 2c 20 69 66 20 61 20 64 61 74 61 62 61 73 65  y, if a database
4870: 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d   file is -rw-rw-
4880: 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c  rw or -rw-rw-r-,
4890: 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61   and a.** transa
48a0: 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e  ction crashes an
48b0: 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20  d leaves behind 
48c0: 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  hot journals, th
48d0: 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73  en any.** proces
48e0: 73 20 74 68 61 74 20 69 73 20 61 62 6c 65 20 74  s that is able t
48f0: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  o write to the d
4900: 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73  atabase will als
4910: 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20  o be able to.** 
4920: 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20  recover the hot 
4930: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61  journals..*/.sta
4940: 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f  tic int robust_o
4950: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
4960: 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74  z, int f, mode_t
4970: 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20   m){.  int fd;. 
4980: 20 6d 6f 64 65 5f 74 20 6d 32 3b 0a 20 20 6d 6f   mode_t m2;.  mo
4990: 64 65 5f 74 20 6f 72 69 67 4d 20 3d 20 30 3b 0a  de_t origM = 0;.
49a0: 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20    if( m==0 ){.  
49b0: 20 20 6d 32 20 3d 20 53 51 4c 49 54 45 5f 44 45    m2 = SQLITE_DE
49c0: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
49d0: 53 53 49 4f 4e 53 3b 0a 20 20 7d 65 6c 73 65 7b  SSIONS;.  }else{
49e0: 0a 20 20 20 20 6d 32 20 3d 20 6d 3b 0a 20 20 20  .    m2 = m;.   
49f0: 20 6f 72 69 67 4d 20 3d 20 6f 73 55 6d 61 73 6b   origM = osUmask
4a00: 28 30 29 3b 0a 20 20 7d 0a 20 20 64 6f 7b 0a 23  (0);.  }.  do{.#
4a10: 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f  if defined(O_CLO
4a20: 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d 20 6f  EXEC).    fd = o
4a30: 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45  sOpen(z,f|O_CLOE
4a40: 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a 20  XEC,m2);.#else. 
4a50: 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a     fd = osOpen(z
4a60: 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66 0a 20  ,f,m2);.#endif. 
4a70: 20 7d 77 68 69 6c 65 28 20 66 64 3c 30 20 26 26   }while( fd<0 &&
4a80: 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
4a90: 0a 20 20 69 66 28 20 6d 20 29 7b 0a 20 20 20 20  .  if( m ){.    
4aa0: 6f 73 55 6d 61 73 6b 28 6f 72 69 67 4d 29 3b 0a  osUmask(origM);.
4ab0: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
4ac0: 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28  FD_CLOEXEC) && (
4ad0: 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58  !defined(O_CLOEX
4ae0: 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43  EC) || O_CLOEXEC
4af0: 3d 3d 30 29 0a 20 20 69 66 28 20 66 64 3e 3d 30  ==0).  if( fd>=0
4b00: 20 29 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46   ) osFcntl(fd, F
4b10: 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28  _SETFD, osFcntl(
4b20: 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
4b30: 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
4b40: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 66  endif.  return f
4b50: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  d;.}../*.** Help
4b60: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
4b70: 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e  obtain and relin
4b80: 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c  quish the global
4b90: 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67   mutex. The.** g
4ba0: 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75  lobal mutex is u
4bb0: 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74  sed to protect t
4bc0: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
4bd0: 20 61 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46   and.** vxworksF
4be0: 69 6c 65 49 64 20 6f 62 6a 65 63 74 73 20 75 73  ileId objects us
4bf0: 65 64 20 62 79 20 74 68 69 73 20 66 69 6c 65 2c  ed by this file,
4c00: 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61   all of which ma
4c10: 79 20 62 65 20 0a 2a 2a 20 73 68 61 72 65 64 20  y be .** shared 
4c20: 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  by multiple thre
4c30: 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74  ads..**.** Funct
4c40: 69 6f 6e 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  ion unixMutexHel
4c50: 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  d() is used to a
4c60: 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
4c70: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a   global mutex .*
4c80: 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72  * is held when r
4c90: 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75  equired. This fu
4ca0: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
4cb0: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
4cc0: 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74  ssert() .** stat
4cd0: 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a  ements. e.g..**.
4ce0: 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  **   unixEnterMu
4cf0: 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73  tex().**     ass
4d00: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
4d10: 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69  ld() );.**   uni
4d20: 78 45 6e 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f  xEnterLeave().*/
4d30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
4d40: 78 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64  xEnterMutex(void
4d50: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
4d60: 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
4d70: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
4d80: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
4d90: 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69  ASTER));.}.stati
4da0: 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61 76 65  c void unixLeave
4db0: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
4dc0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
4dd0: 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ve(sqlite3MutexA
4de0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
4df0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
4e00: 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
4e10: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
4e20: 69 6e 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  int unixMutexHel
4e30: 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75  d(void) {.  retu
4e40: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
4e50: 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74  _held(sqlite3Mut
4e60: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
4e70: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
4e80: 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ER));.}.#endif..
4e90: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4ea0: 49 54 45 5f 54 45 53 54 29 20 26 26 20 64 65 66  ITE_TEST) && def
4eb0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
4ec0: 47 29 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  G)./*.** Helper 
4ed0: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69  function for pri
4ee0: 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20  nting out trace 
4ef0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
4f00: 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69   debugging.** bi
4f10: 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65 74  naries. This ret
4f20: 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20  urns the string 
4f30: 72 65 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66  represetation of
4f40: 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a   the supplied.**
4f50: 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79   integer lock-ty
4f60: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  pe..*/.static co
4f70: 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69 6c 65  nst char *azFile
4f80: 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f  Lock(int eFileLo
4f90: 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65  ck){.  switch( e
4fa0: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
4fb0: 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65  case NO_LOCK: re
4fc0: 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20  turn "NONE";.   
4fd0: 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43   case SHARED_LOC
4fe0: 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45  K: return "SHARE
4ff0: 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53  D";.    case RES
5000: 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  ERVED_LOCK: retu
5010: 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20  rn "RESERVED";. 
5020: 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f     case PENDING_
5030: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45  LOCK: return "PE
5040: 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65  NDING";.    case
5050: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a   EXCLUSIVE_LOCK:
5060: 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49   return "EXCLUSI
5070: 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  VE";.  }.  retur
5080: 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e  n "ERROR";.}.#en
5090: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
50a0: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a  TE_LOCK_TRACE./*
50b0: 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e  .** Print out in
50c0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
50d0: 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  all locking oper
50e0: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
50f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
5100: 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  ed for troublesh
5110: 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20  ooting locks on 
5120: 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a  multithreaded.**
5130: 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61   platforms.  Ena
5140: 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67  ble by compiling
5150: 20 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49   with the -DSQLI
5160: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a  TE_LOCK_TRACE.**
5170: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
5180: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70  tion on the comp
5190: 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65  iler.  This code
51a0: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20   is normally.** 
51b0: 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73  turned off..*/.s
51c0: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72  tatic int lockTr
51d0: 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ace(int fd, int 
51e0: 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  op, struct flock
51f0: 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f   *p){.  char *zO
5200: 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20  pName, *zType;. 
5210: 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61   int s;.  int sa
5220: 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20  vedErrno;.  if( 
5230: 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20  op==F_GETLK ){. 
5240: 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45     zOpName = "GE
5250: 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TLK";.  }else if
5260: 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b  ( op==F_SETLK ){
5270: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
5280: 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  SETLK";.  }else{
5290: 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c  .    s = osFcntl
52a0: 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20  (fd, op, p);.   
52b0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
52c0: 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f  ntf("fcntl unkno
52d0: 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20  wn %d %d %d\n", 
52e0: 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20  fd, op, s);.    
52f0: 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20  return s;.  }.  
5300: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
5310: 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _RDLCK ){.    zT
5320: 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20  ype = "RDLCK";. 
5330: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
5340: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b  type==F_WRLCK ){
5350: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52  .    zType = "WR
5360: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
5370: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55  ( p->l_type==F_U
5380: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  NLCK ){.    zTyp
5390: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d  e = "UNLCK";.  }
53a0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
53b0: 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ( 0 );.  }.  ass
53c0: 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65  ert( p->l_whence
53d0: 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20  ==SEEK_SET );.  
53e0: 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  s = osFcntl(fd, 
53f0: 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45  op, p);.  savedE
5400: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
5410: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
5420: 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20  tf("fcntl %d %d 
5430: 25 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25  %s %s %d %d %d %
5440: 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61  d\n",.     threa
5450: 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65  did, fd, zOpName
5460: 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d  , zType, (int)p-
5470: 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70  >l_start, (int)p
5480: 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69  ->l_len,.     (i
5490: 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b  nt)p->l_pid, s);
54a0: 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26  .  if( s==(-1) &
54b0: 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26  & op==F_SETLK &&
54c0: 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52   (p->l_type==F_R
54d0: 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70  DLCK || p->l_typ
54e0: 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20  e==F_WRLCK) ){. 
54f0: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
5500: 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b  l2;.    l2 = *p;
5510: 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c  .    osFcntl(fd,
5520: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a   F_GETLK, &l2);.
5530: 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70      if( l2.l_typ
5540: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
5550: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
5560: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  CK";.    }else i
5570: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
5580: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  WRLCK ){.      z
5590: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
55a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
55b0: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  .l_type==F_UNLCK
55c0: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
55d0: 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "UNLCK";.    }
55e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
55f0: 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20  rt( 0 );.    }. 
5600: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
5610: 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69  rintf("fcntl-fai
5620: 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20  lure-reason: %s 
5630: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
5640: 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29      zType, (int)
5650: 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  l2.l_start, (int
5660: 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29  )l2.l_len, (int)
5670: 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20  l2.l_pid);.  }. 
5680: 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72   errno = savedEr
5690: 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b  rno;.  return s;
56a0: 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e 74  .}.#undef osFcnt
56b0: 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  l.#define osFcnt
56c0: 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64  l lockTrace.#end
56d0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  if /* SQLITE_LOC
56e0: 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  K_TRACE */../*.*
56f0: 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63 61 74  * Retry ftruncat
5700: 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66  e() calls that f
5710: 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52  ail due to EINTR
5720: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5730: 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
5740: 69 6e 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69  int h, sqlite3_i
5750: 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20  nt64 sz){.  int 
5760: 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f  rc;.  do{ rc = o
5770: 73 46 74 72 75 6e 63 61 74 65 28 68 2c 73 7a 29  sFtruncate(h,sz)
5780: 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
5790: 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
57a0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
57b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
57c0: 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73 20  tine translates 
57d0: 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49 58  a standard POSIX
57e0: 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f   errno code into
57f0: 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73   something.** us
5800: 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69 65  eful to the clie
5810: 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  nts of the sqlit
5820: 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53  e3 functions.  S
5830: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20  pecifically, it 
5840: 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74  is.** intended t
5850: 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76 61  o translate a va
5860: 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61 67  riety of "try ag
5870: 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74 6f  ain" errors into
5880: 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20   SQLITE_BUSY.** 
5890: 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f 66  and a variety of
58a0: 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20 74   "please close t
58b0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
58c0: 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20 69  or NOW" errors i
58d0: 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49  nto .** SQLITE_I
58e0: 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f  OERR.** .** Erro
58f0: 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61  rs during initia
5900: 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b  lization of lock
5910: 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74 65  s, or file syste
5920: 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f  m support for lo
5930: 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68  cks,.** should h
5940: 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e  andle ENOLCK, EN
5950: 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50  OTSUP, EOPNOTSUP
5960: 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f  P separately..*/
5970: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
5980: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
5990: 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78 45  Error(int posixE
59a0: 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74 65  rror, int sqlite
59b0: 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74 63  IOErr) {.  switc
59c0: 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b  h (posixError) {
59d0: 0a 23 69 66 20 30 0a 20 20 2f 2a 20 41 74 20 6f  .#if 0.  /* At o
59e0: 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 63 6f  ne point this co
59f0: 64 65 20 77 61 73 20 6e 6f 74 20 63 6f 6d 6d 65  de was not comme
5a00: 6e 74 65 64 20 6f 75 74 2e 20 49 6e 20 74 68 65  nted out. In the
5a10: 6f 72 79 2c 20 74 68 69 73 20 62 72 61 6e 63 68  ory, this branch
5a20: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 65 76  .  ** should nev
5a30: 65 72 20 62 65 20 68 69 74 2c 20 61 73 20 74 68  er be hit, as th
5a40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
5a50: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
5a60: 64 20 61 66 74 65 72 0a 20 20 2a 2a 20 61 20 6c  d after.  ** a l
5a70: 6f 63 6b 69 6e 67 2d 72 65 6c 61 74 65 64 20 66  ocking-related f
5a80: 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66 63  unction (i.e. fc
5a90: 6e 74 6c 28 29 29 20 68 61 73 20 72 65 74 75 72  ntl()) has retur
5aa0: 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74  ned non-zero wit
5ab0: 68 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65  h.  ** the value
5ac0: 20 6f 66 20 65 72 72 6e 6f 20 61 73 20 74 68 65   of errno as the
5ad0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
5ae0: 20 53 69 6e 63 65 20 61 20 73 79 73 74 65 6d 20   Since a system 
5af0: 63 61 6c 6c 20 68 61 73 20 66 61 69 6c 65 64 2c  call has failed,
5b00: 0a 20 20 2a 2a 20 65 72 72 6e 6f 20 73 68 6f 75  .  ** errno shou
5b10: 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  ld be non-zero..
5b20: 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 73 70 69 74    **.  ** Despit
5b30: 65 20 74 68 69 73 2c 20 69 66 20 65 72 72 6e 6f  e this, if errno
5b40: 20 72 65 61 6c 6c 79 20 69 73 20 7a 65 72 6f 2c   really is zero,
5b50: 20 77 65 20 73 74 69 6c 6c 20 64 6f 6e 27 74 20   we still don't 
5b60: 77 61 6e 74 20 74 6f 20 72 65 74 75 72 6e 0a 20  want to return. 
5b70: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54   ** SQLITE_OK. T
5b80: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 66  he system call f
5b90: 61 69 6c 65 64 2c 20 61 6e 64 20 2a 73 6f 6d 65  ailed, and *some
5ba0: 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 73  * SQLite error s
5bb0: 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a 20 70 72  hould be.  ** pr
5bc0: 6f 70 61 67 61 74 65 64 20 62 61 63 6b 20 74 6f  opagated back to
5bd0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 43 6f 6d   the caller. Com
5be0: 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 62 72 61  menting this bra
5bf0: 6e 63 68 20 6f 75 74 20 6d 65 61 6e 73 20 65 72  nch out means er
5c00: 72 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c  rno==0.  ** will
5c10: 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74   be handled by t
5c20: 68 65 20 22 64 65 66 61 75 6c 74 3a 22 20 63 61  he "default:" ca
5c30: 73 65 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20  se below..  */. 
5c40: 20 63 61 73 65 20 30 3a 20 0a 20 20 20 20 72 65   case 0: .    re
5c50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5c60: 23 65 6e 64 69 66 0a 0a 20 20 63 61 73 65 20 45  #endif..  case E
5c70: 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54  AGAIN:.  case ET
5c80: 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20  IMEDOUT:.  case 
5c90: 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49  EBUSY:.  case EI
5ca0: 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c  NTR:.  case ENOL
5cb0: 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e  CK:  .    /* ran
5cc0: 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72  dom NFS retry er
5cd0: 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69  ror, unless duri
5ce0: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
5cf0: 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69  upport .     * i
5d00: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
5d10: 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c   which it actual
5d20: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
5d30: 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74   says */.    ret
5d40: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
5d50: 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 43  .    .  case EAC
5d60: 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43  CES: .    /* EAC
5d70: 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47 41  CES is like EAGA
5d80: 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e  IN during lockin
5d90: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62 75  g operations, bu
5da0: 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72 20  t not any other 
5db0: 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20 28  time*/.    if( (
5dc0: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
5dd0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
5de0: 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 73  ) || .        (s
5df0: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
5e00: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
5e10: 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28  K) || .        (
5e20: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
5e30: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
5e40: 43 4b 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 28  CK) ||.        (
5e50: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
5e60: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
5e70: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29  KRESERVEDLOCK) )
5e80: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
5e90: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
5ea0: 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61  }.    /* else fa
5eb0: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
5ec0: 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20  case EPERM: .   
5ed0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
5ee0: 45 52 4d 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 45  ERM;.    .  /* E
5ef0: 44 45 41 44 4c 4b 20 69 73 20 6f 6e 6c 79 20 70  DEADLK is only p
5f00: 6f 73 73 69 62 6c 65 20 69 66 20 61 20 63 61 6c  ossible if a cal
5f10: 6c 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54  l to fcntl(F_SET
5f20: 4c 4b 57 29 20 69 73 20 6d 61 64 65 2e 20 41 6e  LKW) is made. An
5f30: 64 0a 20 20 2a 2a 20 74 68 69 73 20 6d 6f 64 75  d.  ** this modu
5f40: 6c 65 20 6e 65 76 65 72 20 6d 61 6b 65 73 20 73  le never makes s
5f50: 75 63 68 20 61 20 63 61 6c 6c 2e 20 41 6e 64 20  uch a call. And 
5f60: 74 68 65 20 63 6f 64 65 20 69 6e 20 53 51 4c 69  the code in SQLi
5f70: 74 65 20 69 74 73 65 6c 66 20 0a 20 20 2a 2a 20  te itself .  ** 
5f80: 61 73 73 65 72 74 73 20 74 68 61 74 20 53 51 4c  asserts that SQL
5f90: 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
5fa0: 44 20 69 73 20 6e 65 76 65 72 20 72 65 74 75 72  D is never retur
5fb0: 6e 65 64 2e 20 46 6f 72 20 74 68 65 73 65 20 72  ned. For these r
5fc0: 65 61 73 6f 6e 73 0a 20 20 2a 2a 20 74 68 69 73  easons.  ** this
5fd0: 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 63 6f   case is also co
5fe0: 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49 66 20  mmented out. If 
5ff0: 74 68 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20  the system does 
6000: 73 65 74 20 65 72 72 6e 6f 20 74 6f 20 45 44 45  set errno to EDE
6010: 41 44 4c 4b 2c 0a 20 20 2a 2a 20 74 68 65 20 64  ADLK,.  ** the d
6020: 65 66 61 75 6c 74 20 53 51 4c 49 54 45 5f 49 4f  efault SQLITE_IO
6030: 45 52 52 5f 58 58 58 20 63 6f 64 65 20 77 69 6c  ERR_XXX code wil
6040: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 2a  l be returned. *
6050: 2f 0a 23 69 66 20 30 0a 20 20 63 61 73 65 20 45  /.#if 0.  case E
6060: 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75  DEADLK:.    retu
6070: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
6080: 42 4c 4f 43 4b 45 44 3b 0a 23 65 6e 64 69 66 0a  BLOCKED;.#endif.
6090: 20 20 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53      .#if EOPNOTS
60a0: 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63  UPP!=ENOTSUP.  c
60b0: 61 73 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20  ase EOPNOTSUPP: 
60c0: 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e  .    /* somethin
60d0: 67 20 77 65 6e 74 20 74 65 72 72 69 62 6c 79 20  g went terribly 
60e0: 61 77 72 79 2c 20 75 6e 6c 65 73 73 20 64 75 72  awry, unless dur
60f0: 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ing file system 
6100: 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20  support .     * 
6110: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69  introspection, i
6120: 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61  n which it actua
6130: 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69  lly means what i
6140: 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66  t says */.#endif
6150: 0a 23 69 66 64 65 66 20 45 4e 4f 54 53 55 50 0a  .#ifdef ENOTSUP.
6160: 20 20 63 61 73 65 20 45 4e 4f 54 53 55 50 3a 20    case ENOTSUP: 
6170: 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20  .    /* invalid 
6180: 66 64 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  fd, unless durin
6190: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
61a0: 70 70 6f 72 74 20 69 6e 74 72 6f 73 70 65 63 74  pport introspect
61b0: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a 20  ion, in which . 
61c0: 20 20 20 20 2a 20 69 74 20 61 63 74 75 61 6c 6c      * it actuall
61d0: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
61e0: 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  says */.#endif. 
61f0: 20 63 61 73 65 20 45 49 4f 3a 0a 20 20 63 61 73   case EIO:.  cas
6200: 65 20 45 42 41 44 46 3a 0a 20 20 63 61 73 65 20  e EBADF:.  case 
6210: 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20 45  EINVAL:.  case E
6220: 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20  NOTCONN:.  case 
6230: 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73 65 20 45  ENODEV:.  case E
6240: 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f  NXIO:.  case ENO
6250: 45 4e 54 3a 0a 23 69 66 64 65 66 20 45 53 54 41  ENT:.#ifdef ESTA
6260: 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
6270: 20 20 20 20 20 20 20 2f 2a 20 45 53 54 41 4c 45         /* ESTALE
6280: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20   is not defined 
6290: 6f 6e 20 49 6e 74 65 72 69 78 20 73 79 73 74 65  on Interix syste
62a0: 6d 73 20 2a 2f 0a 20 20 63 61 73 65 20 45 53 54  ms */.  case EST
62b0: 41 4c 45 3a 0a 23 65 6e 64 69 66 0a 20 20 63 61  ALE:.#endif.  ca
62c0: 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f  se ENOSYS:.    /
62d0: 2a 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66  * these should f
62e0: 6f 72 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20  orce the client 
62f0: 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  to close the fil
6300: 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20  e and reconnect 
6310: 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c  */.    .  defaul
6320: 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73  t: .    return s
6330: 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a  qliteIOErr;.  }.
6340: 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }..../**********
6350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6390: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
63a0: 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e  ******* Begin Un
63b0: 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69  ique File ID Uti
63c0: 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57  lity Used By VxW
63d0: 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  orks ***********
63e0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f  ****.**.** On mo
63f0: 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75  st versions of u
6400: 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20  nix, we can get 
6410: 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20  a unique ID for 
6420: 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74  a file by concat
6430: 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64  enating.** the d
6440: 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64  evice number and
6450: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
6460: 72 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f 65  r.  But this doe
6470: 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78  s not work on Vx
6480: 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57  Works..** On VxW
6490: 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66  orks, a unique f
64a0: 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20 62  ile id must be b
64b0: 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f  ased on the cano
64c0: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  nical filename..
64d0: 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20  **.** A pointer 
64e0: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
64f0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
6500: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
6510: 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e   used as a.** un
6520: 69 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20  ique file ID in 
6530: 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69  VxWorks.  Each i
6540: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
6550: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
6560: 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20  ns.** a copy of 
6570: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  the canonical fi
6580: 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69  lename.  There i
6590: 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e  s also a referen
65a0: 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54  ce count.  .** T
65b0: 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  he structure is 
65c0: 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74  reclaimed when t
65d0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69  he number of poi
65e0: 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70  nters to it drop
65f0: 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a  s to.** zero..**
6600: 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65  .** There are ne
6610: 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69  ver very many fi
6620: 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20  les open at one 
6630: 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73  time and lookups
6640: 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65   are not.** a pe
6650: 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63  rformance-critic
6660: 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69  al path, so it i
6670: 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20  s sufficient to 
6680: 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72  put these.** str
6690: 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e  uctures on a lin
66a0: 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72  ked list..*/.str
66b0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
66c0: 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77  d {.  struct vxw
66d0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78  orksFileId *pNex
66e0: 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61  t;  /* Next in a
66f0: 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c   list of them al
6700: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  l */.  int nRef;
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6720: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6730: 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
6740: 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e  this one */.  in
6750: 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
6760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
6770: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61  ength of the zCa
6780: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74  nonicalName[] st
6790: 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ring */.  char *
67a0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20  zCanonicalName; 
67b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e          /* Canon
67c0: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f  ical filename */
67d0: 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  .};..#if OS_VXWO
67e0: 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75  RKS./* .** All u
67f0: 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20  nique filenames 
6800: 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69  are held on a li
6810: 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65 64  nked list headed
6820: 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69   by this.** vari
6830: 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20  able:.*/.static 
6840: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
6850: 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c  leId *vxworksFil
6860: 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  eList = 0;../*.*
6870: 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c  * Simplify a fil
6880: 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63  ename into its c
6890: 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a  anonical form.**
68a0: 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66   by making the f
68b0: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73  ollowing changes
68c0: 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76  :.**.**  * remov
68d0: 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67  ing any trailing
68e0: 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f   and duplicate /
68f0: 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f  .**  * convert /
6900: 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a  ./ into just /.*
6910: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f  *  * convert /A/
6920: 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20 61  ../ where A is a
6930: 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69  ny simple name i
6940: 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a  nto just /.**.**
6950: 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   Changes are mad
6960: 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74  e in-place.  Ret
6970: 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65  urn the new name
6980: 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54   length..**.** T
6990: 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
69a0: 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e  name is in z[0..
69b0: 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68  n-1].  Return th
69c0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  e number of.** c
69d0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
69e0: 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65   simplified name
69f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6a00: 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e  vxworksSimplifyN
6a10: 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  ame(char *z, int
6a20: 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b   n){.  int i, j;
6a30: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26  .  while( n>1 &&
6a40: 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20   z[n-1]=='/' ){ 
6a50: 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a  n--; }.  for(i=j
6a60: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
6a70: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27     if( z[i]=='/'
6a80: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b   ){.      if( z[
6a90: 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74  i+1]=='/' ) cont
6aa0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
6ab0: 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69  z[i+1]=='.' && i
6ac0: 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d  +2<n && z[i+2]==
6ad0: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '/' ){.        i
6ae0: 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63   += 1;.        c
6af0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
6b00: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
6b10: 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20  ]=='.' && i+3<n 
6b20: 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26  && z[i+2]=='.' &
6b30: 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b  & z[i+3]=='/' ){
6b40: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
6b50: 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27  j>0 && z[j-1]!='
6b60: 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  /' ){ j--; }.   
6b70: 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20       if( j>0 ){ 
6b80: 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  j--; }.        i
6b90: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63   += 2;.        c
6ba0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
6bb0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b  .    }.    z[j++
6bc0: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20  ] = z[i];.  }.  
6bd0: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  z[j] = 0;.  retu
6be0: 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn j;.}../*.** F
6bf0: 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ind a unique fil
6c00: 65 20 49 44 20 66 6f 72 20 74 68 65 20 67 69 76  e ID for the giv
6c10: 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68  en absolute path
6c20: 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  name.  Return.**
6c30: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
6c40: 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  e vxworksFileId 
6c50: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f  object.  This po
6c60: 69 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e 69  inter is the uni
6c70: 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a  que.** file ID..
6c80: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66  **.** The nRef f
6c90: 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f  ield of the vxwo
6ca0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
6cb0: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
6cc0: 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62  before.** the ob
6cd0: 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e 65 64  ject is returned
6ce0: 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73  .  A new vxworks
6cf0: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73  FileId object is
6d00: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
6d10: 61 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f  added to the glo
6d20: 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65  bal list if nece
6d30: 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssary..**.** If 
6d40: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
6d50: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
6d60: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
6d70: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
6d80: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76  vxworksFileId *v
6d90: 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64  xworksFindFileId
6da0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62  (const char *zAb
6db0: 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73  soluteName){.  s
6dc0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
6dd0: 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  eId *pNew;      
6de0: 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79     /* search key
6df0: 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44   and new file ID
6e00: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77   */.  struct vxw
6e10: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e  orksFileId *pCan
6e20: 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72  didate;   /* For
6e30: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78   looping over ex
6e40: 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20  isting file IDs 
6e50: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
6e80: 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e  th of zAbsoluteN
6e90: 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20  ame string */.. 
6ea0: 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75   assert( zAbsolu
6eb0: 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29  teName[0]=='/' )
6ec0: 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72  ;.  n = (int)str
6ed0: 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  len(zAbsoluteNam
6ee0: 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  e);.  pNew = sql
6ef0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
6f00: 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b  eof(*pNew) + (n+
6f10: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  1) );.  if( pNew
6f20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
6f30: 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63    pNew->zCanonic
6f40: 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  alName = (char*)
6f50: 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63  &pNew[1];.  memc
6f60: 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  py(pNew->zCanoni
6f70: 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75  calName, zAbsolu
6f80: 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20  teName, n+1);.  
6f90: 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c  n = vxworksSimpl
6fa0: 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43  ifyName(pNew->zC
6fb0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29  anonicalName, n)
6fc0: 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  ;..  /* Search f
6fd0: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  or an existing e
6fe0: 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68 69  ntry that matchi
6ff0: 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  ng the canonical
7000: 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66   name..  ** If f
7010: 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20  ound, increment 
7020: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
7030: 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61  unt and return a
7040: 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a   pointer to.  **
7050: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 66 69   the existing fi
7060: 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e  le ID..  */.  un
7070: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
7080: 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65    for(pCandidate
7090: 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  =vxworksFileList
70a0: 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43  ; pCandidate; pC
70b0: 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64  andidate=pCandid
70c0: 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ate->pNext){.   
70d0: 20 69 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d   if( pCandidate-
70e0: 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20  >nName==n .     
70f0: 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69  && memcmp(pCandi
7100: 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  date->zCanonical
7110: 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e  Name, pNew->zCan
7120: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d  onicalName, n)==
7130: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20  0.    ){.       
7140: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
7150: 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64  w);.       pCand
7160: 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  idate->nRef++;. 
7170: 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d        unixLeaveM
7180: 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72  utex();.       r
7190: 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65  eturn pCandidate
71a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
71b0: 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66  * No match was f
71c0: 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d  ound.  We will m
71d0: 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49  ake a new file I
71e0: 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65  D */.  pNew->nRe
71f0: 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e  f = 1;.  pNew->n
7200: 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77  Name = n;.  pNew
7210: 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b  ->pNext = vxwork
7220: 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77  sFileList;.  vxw
7230: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70  orksFileList = p
7240: 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  New;.  unixLeave
7250: 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
7260: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7270: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
7280: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
7290: 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  n a vxworksFileI
72a0: 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a  d object.  Free.
72b0: 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68  ** the object wh
72c0: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
72d0: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
72e0: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ero..*/.static v
72f0: 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61  oid vxworksRelea
7300: 73 65 46 69 6c 65 49 64 28 73 74 72 75 63 74 20  seFileId(struct 
7310: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
7320: 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72  Id){.  unixEnter
7330: 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
7340: 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29  t( pId->nRef>0 )
7350: 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pId->nRef--;
7360: 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66  .  if( pId->nRef
7370: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
7380: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
7390: 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70  **pp;.    for(pp
73a0: 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  =&vxworksFileLis
73b0: 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70  t; *pp && *pp!=p
73c0: 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29  Id; pp = &((*pp)
73d0: 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20  ->pNext)){}.    
73e0: 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64  assert( *pp==pId
73f0: 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49   );.    *pp = pI
7400: 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  d->pNext;.    sq
7410: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b  lite3_free(pId);
7420: 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
7430: 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69  Mutex();.}.#endi
7440: 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
7450: 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
7460: 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75  *** End of Uniqu
7470: 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74  e File ID Utilit
7480: 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b  y Used By VxWork
7490: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
74a0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
74b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74f0: 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20   Posix Advisory 
7570: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
7580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7590: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58  ****.**.** POSIX
75a0: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
75b0: 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65  are broken by de
75c0: 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20  sign.  ANSI STD 
75d0: 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a  1003.1 (1996).**
75e0: 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32   section 6.5.2.2
75f0: 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75   lines 483 throu
7600: 67 68 20 34 39 30 20 73 70 65 63 69 66 79 20 74  gh 490 specify t
7610: 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65  hat when a proce
7620: 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c  ss.** sets or cl
7630: 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61  ears a lock, tha
7640: 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72  t operation over
7650: 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20  rides any prior 
7660: 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20  locks set.** by 
7670: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
7680: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65  .  It does not e
7690: 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f  xplicitly say so
76a0: 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69  , but this impli
76b0: 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76  es.** that it ov
76c0: 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65  errides locks se
76d0: 74 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  t by the same pr
76e0: 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20 64 69  ocess using a di
76f0: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
7700: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e  descriptor.  Con
7710: 73 69 64 65 72 20 74 68 69 73 20 74 65 73 74 20  sider this test 
7720: 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  case:.**.**     
7730: 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e    int fd1 = open
7740: 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44  ("./file1", O_RD
7750: 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34  WR|O_CREAT, 0644
7760: 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  );.**       int 
7770: 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd2 = open("./fi
7780: 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le2", O_RDWR|O_C
7790: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a  REAT, 0644);.**.
77a0: 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c  ** Suppose ./fil
77b0: 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61  e1 and ./file2 a
77c0: 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61  re really the sa
77d0: 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65  me file (because
77e0: 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72  .** one is a har
77f0: 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69  d or symbolic li
7800: 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29  nk to the other)
7810: 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74   then if you set
7820: 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65  .** an exclusive
7830: 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68   lock on fd1, th
7840: 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e  en try to get an
7850: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a   exclusive lock.
7860: 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f  ** on fd2, it wo
7870: 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61  rks.  I would ha
7880: 76 65 20 65 78 70 65 63 74 65 64 20 74 68 65 20  ve expected the 
7890: 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a  second lock to.*
78a0: 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65  * fail since the
78b0: 72 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 61  re was already a
78c0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
78d0: 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a  e due to fd1..**
78e0: 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69   But not so.  Si
78f0: 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63  nce both locks c
7900: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d  ame from the sam
7910: 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a  e process, the.*
7920: 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64  * second overrid
7930: 65 73 20 74 68 65 20 66 69 72 73 74 2c 20 65 76  es the first, ev
7940: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77  en though they w
7950: 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ere on different
7960: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
7970: 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64  tors opened on d
7980: 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61  ifferent file na
7990: 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  mes..**.** This 
79a0: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 63 61  means that we ca
79b0: 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c  nnot use POSIX l
79c0: 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e  ocks to synchron
79d0: 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a  ize file access.
79e0: 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69  ** among competi
79f0: 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74 68  ng threads of th
7a00: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
7a10: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c   POSIX locks wil
7a20: 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74  l work fine.** t
7a30: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63  o synchronize ac
7a40: 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64 73  cess for threads
7a50: 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f   in separate pro
7a60: 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a  cesses, but not.
7a70: 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68 69  ** threads withi
7a80: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
7a90: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72  ss..**.** To wor
7aa0: 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f  k around the pro
7ab0: 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73  blem, SQLite has
7ac0: 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20   to manage file 
7ad0: 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79  locks internally
7ae0: 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20  .** on its own. 
7af0: 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20   Whenever a new 
7b00: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
7b10: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66  ed, we have to f
7b20: 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  ind the.** speci
7b30: 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65  fic inode of the
7b40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
7b50: 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74  the inode is det
7b60: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a  ermined by the.*
7b70: 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f  * st_dev and st_
7b80: 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ino fields of th
7b90: 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72 65  e stat structure
7ba0: 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66 69   that fstat() fi
7bb0: 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63  lls in).** and c
7bc0: 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61  heck for locks a
7bd0: 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67 20  lready existing 
7be0: 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20  on that inode.  
7bf0: 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a  When locks are.*
7c00: 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d  * created or rem
7c10: 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  oved, we have to
7c20: 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e   look at our own
7c30: 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
7c40: 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73   of the.** locks
7c50: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
7c60: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70 72  er thread has pr
7c70: 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c  eviously set a l
7c80: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65  ock on that same
7c90: 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  .** inode..**.**
7ca0: 20 28 41 73 69 64 65 3a 20 54 68 65 20 75 73 65   (Aside: The use
7cb0: 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72   of inode number
7cc0: 73 20 61 73 20 75 6e 69 71 75 65 20 49 44 73 20  s as unique IDs 
7cd0: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
7ce0: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72   VxWorks..** For
7cf0: 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76   VxWorks, we hav
7d00: 65 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74  e to use the alt
7d10: 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20  ernative unique 
7d20: 49 44 20 73 79 73 74 65 6d 20 62 61 73 65 64 20  ID system based 
7d30: 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20  on.** canonical 
7d40: 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70  filename and imp
7d50: 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20  lemented in the 
7d60: 70 72 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f  previous divisio
7d70: 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  n.).**.** The sq
7d80: 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
7d90: 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69  ture for POSIX i
7da0: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74  s no longer just
7db0: 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65   an integer file
7dc0: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20  .** descriptor. 
7dd0: 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72   It is now a str
7de0: 75 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64  ucture that hold
7df0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 66 69  s the integer fi
7e00: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
7e10: 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
7e20: 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  o a structure th
7e30: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
7e40: 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63   internal.** loc
7e50: 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73  ks on the corres
7e60: 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20  ponding inode.  
7e70: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63  There is one loc
7e80: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a  king structure.*
7e90: 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20  * per inode, so 
7ea0: 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  if the same inod
7eb0: 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63  e is opened twic
7ec0: 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65  e, both unixFile
7ed0: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70   structures.** p
7ee0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65  oint to the same
7ef0: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
7f00: 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  re.  The locking
7f10: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
7f20: 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
7f30: 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c  count (so we wil
7f40: 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64  l know when to d
7f50: 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61 20  elete it) and a 
7f60: 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74  "cnt".** field t
7f70: 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73  hat tells us its
7f80: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
7f90: 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d  tatus.  cnt==0 m
7fa0: 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65  eans the.** file
7fb0: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63   is unlocked.  c
7fc0: 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65  nt==-1 means the
7fd0: 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63   file has an exc
7fe0: 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20  lusive lock..** 
7ff0: 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72  cnt>0 means ther
8000: 65 20 61 72 65 20 63 6e 74 20 73 68 61 72 65 64  e are cnt shared
8010: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69   locks on the fi
8020: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74  le..**.** Any at
8030: 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72  tempt to lock or
8040: 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66   unlock a file f
8050: 69 72 73 74 20 63 68 65 63 6b 73 20 74 68 65 20  irst checks the 
8060: 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63  locking.** struc
8070: 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c  ture.  The fcntl
8080: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69  () system call i
8090: 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74  s only invoked t
80a0: 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49  o set a .** POSI
80b0: 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e  X lock if the in
80c0: 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75  ternal lock stru
80d0: 63 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e  cture transition
80e0: 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c  s between.** a l
80f0: 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c  ocked and an unl
8100: 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a  ocked state..**.
8110: 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74 68  ** But wait:  th
8120: 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65  ere are yet more
8130: 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50   problems with P
8140: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
8150: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f  cks..**.** If yo
8160: 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64  u close a file d
8170: 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 70  escriptor that p
8180: 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20  oints to a file 
8190: 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a  that has locks,.
81a0: 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20  ** all locks on 
81b0: 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 61  that file that a
81c0: 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20  re owned by the 
81d0: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20  current process 
81e0: 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e  are.** released.
81f0: 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64    To work around
8200: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65   this problem, e
8210: 61 63 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ach unixInodeInf
8220: 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e  o object.** main
8230: 74 61 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66  tains a count of
8240: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
8250: 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20  ending locks on 
8260: 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68  tha inode..** Wh
8270: 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
8280: 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61   made to close a
8290: 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74  n unixFile, if t
82a0: 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65  here are.** othe
82b0: 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20  r unixFile open 
82c0: 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  on the same inod
82d0: 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69  e that are holdi
82e0: 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61  ng locks, the ca
82f0: 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29  ll.** to close()
8300: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
8310: 70 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64  ptor is deferred
8320: 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68   until all of th
8330: 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a  e locks clear..*
8340: 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * The unixInodeI
8350: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65  nfo structure ke
8360: 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69  eps a list of fi
8370: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
8380: 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62  hat need to.** b
8390: 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61  e closed and tha
83a0: 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64  t list is walked
83b0: 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77   (and cleared) w
83c0: 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
83d0: 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a  k.** clears..**.
83e0: 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70  ** Yet another p
83f0: 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68  roblem:  LinuxTh
8400: 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61  reads do not pla
8410: 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69  y well with posi
8420: 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d  x locks..**.** M
8430: 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  any older versio
8440: 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20  ns of linux use 
8450: 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73  the LinuxThreads
8460: 20 6c 69 62 72 61 72 79 20 77 68 69 63 68 20 69   library which i
8470: 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63  s.** not posix c
8480: 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72  ompliant.  Under
8490: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61   LinuxThreads, a
84a0: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
84b0: 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e   thread.** A can
84c0: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20  not be modified 
84d0: 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  or overridden by
84e0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72   a different thr
84f0: 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74  ead B..** Only t
8500: 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69  hread A can modi
8510: 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f  fy the lock.  Lo
8520: 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69  cking behavior i
8530: 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20  s correct.** if 
8540: 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75  the appliation u
8550: 73 65 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61  ses the newer Na
8560: 74 69 76 65 20 50 6f 73 69 78 20 54 68 72 65 61  tive Posix Threa
8570: 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29  d Library (NPTL)
8580: 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77  .** on linux - w
8590: 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20  ith NPTL a lock 
85a0: 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61  created by threa
85b0: 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65  d A can override
85c0: 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72   locks.** in thr
85d0: 65 61 64 20 42 2e 20 20 42 75 74 20 74 68 65 72  ead B.  But ther
85e0: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b  e is no way to k
85f0: 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  now at compile-t
8600: 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72  ime which.** thr
8610: 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69  eading library i
8620: 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53  s being used.  S
8630: 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  o there is no wa
8640: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20  y to know at.** 
8650: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
8660: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65  ther or not thre
8670: 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64  ad A can overrid
8680: 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61  e locks on threa
8690: 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20  d B..** One has 
86a0: 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65  to do a run-time
86b0: 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76   check to discov
86c0: 65 72 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  er the behavior 
86d0: 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  of the.** curren
86e0: 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
86f0: 20 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20   SQLite used to 
8700: 73 75 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72  support LinuxThr
8710: 65 61 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f  eads.  But suppo
8720: 72 74 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65  rt for LinuxThre
8730: 61 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70  ads.** was dropp
8740: 65 64 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ed beginning wit
8750: 68 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e  h version 3.7.0.
8760: 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74    SQLite will st
8770: 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a  ill work with.**
8780: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 70 72   LinuxThreads pr
8790: 6f 76 69 64 65 64 20 74 68 61 74 20 28 31 29 20  ovided that (1) 
87a0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65  there is no more
87b0: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63   than one connec
87c0: 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74  tion .** per dat
87d0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
87e0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61  e same process a
87f0: 6e 64 20 28 32 29 20 64 61 74 61 62 61 73 65 20  nd (2) database 
8800: 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64  connections.** d
8810: 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73  o not move acros
8820: 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f  s threads..*/../
8830: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
8840: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
8850: 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76  g structure serv
8860: 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73  es as the key us
8870: 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20  ed.** to locate 
8880: 61 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69  a particular uni
8890: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
88a0: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  t..*/.struct uni
88b0: 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f  xFileId {.  dev_
88c0: 74 20 64 65 76 3b 20 20 20 20 20 20 20 20 20 20  t dev;          
88d0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
88e0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20  e number */.#if 
88f0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
8900: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
8910: 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71  d *pId;  /* Uniq
8920: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76  ue file ID for v
8930: 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65  xworks. */.#else
8940: 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20  .  ino_t ino;   
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8960: 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a  * Inode number *
8970: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
8980: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
8990: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
89a0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
89b0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
89c0: 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20  open.** inode.  
89d0: 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65  Or, on LinuxThre
89e0: 61 64 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e  ads, there is on
89f0: 65 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63  e of these struc
8a00: 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63  tures for.** eac
8a10: 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62  h inode opened b
8a20: 79 20 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a  y each thread..*
8a30: 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e  *.** A single in
8a40: 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  ode can have mul
8a50: 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72  tiple file descr
8a60: 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20  iptors, so each 
8a70: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
8a80: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
8a90: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
8aa0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
8ab0: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a  object and this.
8ac0: 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20  ** object keeps 
8ad0: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
8ae0: 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c  umber of unixFil
8af0: 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74  e pointing to it
8b00: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
8b10: 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74  InodeInfo {.  st
8b20: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
8b30: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a  fileId;       /*
8b40: 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20   The lookup key 
8b50: 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64  */.  int nShared
8b60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8b70: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8b80: 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68  f SHARED locks h
8b90: 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  eld */.  unsigne
8ba0: 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b  d char eFileLock
8bb0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
8bc0: 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  of SHARED_LOCK, 
8bd0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74  RESERVED_LOCK et
8be0: 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  c. */.  unsigned
8bf0: 20 63 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f   char bProcessLo
8c00: 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  ck;     /* An ex
8c10: 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73 20  clusive process 
8c20: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a  lock is held */.
8c30: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
8c60: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20  ointers to this 
8c70: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75  structure */.  u
8c80: 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
8c90: 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Node;          /
8ca0: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
8cb0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8cc0: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
8cd0: 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20  int nLock;      
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cf0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
8d00: 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f  standing file lo
8d10: 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75  cks */.  UnixUnu
8d20: 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20  sedFd *pUnused; 
8d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73           /* Unus
8d40: 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
8d50: 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a  ors to close */.
8d60: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
8d70: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
8d80: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
8d90: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
8da0: 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78  bjects */.  unix
8db0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76  InodeInfo *pPrev
8dc0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  ;           /*  
8dd0: 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69    .... doubly li
8de0: 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49  nked */.#if SQLI
8df0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
8e00: 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e  G_STYLE.  unsign
8e10: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61  ed long long sha
8e20: 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72  redByte;  /* for
8e30: 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73   AFP simulated s
8e40: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65  hared lock */.#e
8e50: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ndif.#if OS_VXWO
8e60: 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  RKS.  sem_t *pSe
8e70: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
8e80: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50        /* Named P
8e90: 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a  OSIX semaphore *
8ea0: 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d  /.  char aSemNam
8eb0: 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32  e[MAX_PATHNAME+2
8ec0: 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ];  /* Name of t
8ed0: 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f  hat semaphore */
8ee0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
8ef0: 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c  * A lists of all
8f00: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
8f10: 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  bjects..*/.stati
8f20: 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  c unixInodeInfo 
8f30: 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a  *inodeList = 0;.
8f40: 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ./*.**.** This f
8f50: 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f  unction - unixLo
8f60: 67 45 72 72 6f 72 5f 78 28 29 2c 20 69 73 20 6f  gError_x(), is o
8f70: 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20  nly ever called 
8f80: 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a  via the macro.**
8f90: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e   unixLogError().
8fa0: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76  .**.** It is inv
8fb0: 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65 72  oked after an er
8fc0: 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e  ror occurs in an
8fd0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64   OS function and
8fe0: 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a   errno has been.
8ff0: 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67 73 20  ** set. It logs 
9000: 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20  a message using 
9010: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f  sqlite3_log() co
9020: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72  ntaining the cur
9030: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  rent value of.**
9040: 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70   errno and, if p
9050: 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d  ossible, the hum
9060: 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69  an-readable equi
9070: 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72 65  valent from stre
9080: 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72  rror() or.** str
9090: 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a  error_r()..**.**
90a0: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
90b0: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
90c0: 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62  e macro should b
90d0: 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  e the error code
90e0: 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65   that.** will be
90f0: 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c   returned to SQL
9100: 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45  ite (e.g. SQLITE
9110: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53  _IOERR_DELETE, S
9120: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e  QLITE_CANTOPEN).
9130: 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62   .** The two sub
9140: 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74  sequent argument
9150: 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  s should be the 
9160: 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66  name of the OS f
9170: 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  unction that.** 
9180: 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e  failed (e.g. "un
9190: 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61  link", "open") a
91a0: 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  nd the associate
91b0: 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61  d file-system pa
91c0: 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a  th,.** if any..*
91d0: 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f  /.#define unixLo
91e0: 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20 20  gError(a,b,c)   
91f0: 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74    unixLogErrorAt
9200: 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e  Line(a,b,c,__LIN
9210: 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20  E__).static int 
9220: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
9230: 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64  ne(.  int errcod
9240: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
9250: 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20        /* SQLite 
9260: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
9270: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
9280: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
9290: 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75  /* Name of OS fu
92a0: 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c  nction that fail
92b0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
92c0: 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
92d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
92e0: 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20  path associated 
92f0: 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20  with error */.  
9300: 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20  int iLine       
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9320: 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e  /* Source line n
9330: 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f  umber where erro
9340: 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b  r occurred */.){
9350: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20  .  char *zErr;  
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72     /* Message fr
9380: 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72  om strerror() or
9390: 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20   equivalent */. 
93a0: 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72   int iErrno = er
93b0: 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
93c0: 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c   /* Saved syscal
93d0: 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a  l error number *
93e0: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
93f0: 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73  is not a threads
9400: 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54  afe build (SQLIT
9410: 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29  E_THREADSAFE==0)
9420: 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20  , then use.  ** 
9430: 74 68 65 20 73 74 72 65 72 72 6f 72 28 29 20 66  the strerror() f
9440: 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  unction to obtai
9450: 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64  n the human-read
9460: 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61  able error messa
9470: 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65  ge.  ** equivale
9480: 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68  nt to errno. Oth
9490: 65 72 77 69 73 65 2c 20 75 73 65 20 73 74 72 65  erwise, use stre
94a0: 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a  rror_r()..  */ .
94b0: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
94c0: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
94d0: 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52  (HAVE_STRERROR_R
94e0: 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38 30  ).  char aErr[80
94f0: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72  ];.  memset(aErr
9500: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72  , 0, sizeof(aErr
9510: 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72  ));.  zErr = aEr
9520: 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45  r;..  /* If STRE
9530: 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73  RROR_R_CHAR_P (s
9540: 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73  et by autoconf s
9550: 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45  cripts) or __USE
9560: 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c  _GNU is defined,
9570: 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61  .  ** assume tha
9580: 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f  t the system pro
9590: 76 69 64 65 73 20 74 68 65 20 47 4e 55 20 76 65  vides the GNU ve
95a0: 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f  rsion of strerro
95b0: 72 5f 72 28 29 20 74 68 61 74 0a 20 20 2a 2a 20  r_r() that.  ** 
95c0: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
95d0: 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  r to a buffer co
95e0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72 72  ntaining the err
95f0: 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61 74  or message. That
9600: 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d   pointer .  ** m
9610: 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72 72  ay point to aErr
9620: 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f  [], or it may po
9630: 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61 74  int to some stat
9640: 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65 77  ic storage somew
9650: 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  here. .  ** Othe
9660: 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74 68  rwise, assume th
9670: 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72  at the system pr
9680: 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53 49 58  ovides the POSIX
9690: 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a   version of .  *
96a0: 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c 20  * strerror_r(), 
96b0: 77 68 69 63 68 20 61 6c 77 61 79 73 20 77 72 69  which always wri
96c0: 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  tes an error mes
96d0: 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d  sage into aErr[]
96e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
96f0: 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65 63  he code incorrec
9700: 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61 74  tly assumes that
9710: 20 69 74 20 69 73 20 74 68 65 20 50 4f 53 49 58   it is the POSIX
9720: 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69 73   version that is
9730: 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c  .  ** available,
9740: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
9750: 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65  ge will often be
9760: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
9770: 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67  . Not a.  ** hug
9780: 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72  e problem. Incor
9790: 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e  rectly concludin
97a0: 67 20 74 68 61 74 20 74 68 65 20 47 4e 55 20 76  g that the GNU v
97b0: 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  ersion is availa
97c0: 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20  ble .  ** could 
97d0: 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66 61 75  lead to a segfau
97e0: 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a  lt though..  */.
97f0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 54 52 45  #if defined(STRE
9800: 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c  RROR_R_CHAR_P) |
9810: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f  | defined(__USE_
9820: 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23  GNU).  zErr = .#
9830: 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72 6f   endif.  strerro
9840: 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72 72  r_r(iErrno, aErr
9850: 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d 31  , sizeof(aErr)-1
9860: 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54 45  );..#elif SQLITE
9870: 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f 2a  _THREADSAFE.  /*
9880: 20 54 68 69 73 20 69 73 20 61 20 74 68 72 65 61   This is a threa
9890: 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75 74  dsafe build, but
98a0: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69 73   strerror_r() is
98b0: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
98c0: 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a  */.  zErr = "";.
98d0: 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74  #else.  /* Non-t
98e0: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c  hreadsafe build,
98f0: 20 75 73 65 20 73 74 72 65 72 72 6f 72 28 29 2e   use strerror().
9900: 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74 72   */.  zErr = str
9910: 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23  error(iErrno);.#
9920: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
9930: 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45   errcode!=SQLITE
9940: 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61  _OK );.  if( zPa
9950: 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20  th==0 ) zPath = 
9960: 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f  "";.  sqlite3_lo
9970: 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20  g(errcode,.     
9980: 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20   "os_unix.c:%d: 
9990: 28 25 64 29 20 25 73 28 25 73 29 20 2d 20 25 73  (%d) %s(%s) - %s
99a0: 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20  ",.      iLine, 
99b0: 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a  iErrno, zFunc, z
99c0: 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a  Path, zErr.  );.
99d0: 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64  .  return errcod
99e0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  e;.}../*.** Clos
99f0: 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  e a file descrip
9a00: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73  tor..**.** We as
9a10: 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65 28  sume that close(
9a20: 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  ) almost always 
9a30: 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74 20  works, since it 
9a40: 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20  is only in a.** 
9a50: 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69 63  very sick applic
9a60: 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65  ation or on a ve
9a70: 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d  ry sick platform
9a80: 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20 66   that it might f
9a90: 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f  ail..** If it do
9aa0: 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20  es fail, simply 
9ab0: 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65  leak the file de
9ac0: 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64 6f  scriptor, but do
9ad0: 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f   log the.** erro
9ae0: 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  r..**.** Note th
9af0: 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66  at it is not saf
9b00: 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73 65  e to retry close
9b10: 28 29 20 61 66 74 65 72 20 45 49 4e 54 52 20 73  () after EINTR s
9b20: 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65  ince the.** file
9b30: 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67 68   descriptor migh
9b40: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
9b50: 65 65 6e 20 72 65 75 73 65 64 20 62 79 20 61 6e  een reused by an
9b60: 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a  other thread..**
9b70: 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76 65   So we don't eve
9b80: 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65 72  n try to recover
9b90: 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20   from an EINTR. 
9ba0: 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65 72   Just log the er
9bb0: 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20  ror.** and move 
9bc0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
9bd0: 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28  id robust_close(
9be0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
9bf0: 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65   int h, int line
9c00: 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f  no){.  if( osClo
9c10: 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e 69  se(h) ){.    uni
9c20: 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  xLogErrorAtLine(
9c30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
9c40: 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20  SE, "close",.   
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c60: 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69 6c      pFile ? pFil
9c70: 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69  e->zPath : 0, li
9c80: 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  neno);.  }.}../*
9c90: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69  .** Close all fi
9ca0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61  le descriptors a
9cb0: 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65  ccumuated in the
9cc0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e   unixInodeInfo->
9cd0: 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f  pUnused list..*/
9ce0: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c   .static void cl
9cf0: 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e  osePendingFds(un
9d00: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
9d10: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
9d20: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
9d30: 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55  >pInode;.  UnixU
9d40: 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e  nusedFd *p;.  Un
9d50: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
9d60: 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64  t;.  for(p=pInod
9d70: 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70  e->pUnused; p; p
9d80: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
9d90: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
9da0: 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
9db0: 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f  pFile, p->fd, __
9dc0: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c  LINE__);.    sql
9dd0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
9de0: 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  }.  pInode->pUnu
9df0: 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  sed = 0;.}../*.*
9e00: 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69 78  * Release a unix
9e10: 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74  InodeInfo struct
9e20: 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ure previously a
9e30: 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64  llocated by find
9e40: 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a  InodeInfo()..**.
9e50: 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74  ** The mutex ent
9e60: 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75  ered using the u
9e70: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
9e80: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
9e90: 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68   held.** when th
9ea0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
9eb0: 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
9ec0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e 6f   void releaseIno
9ed0: 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20  deInfo(unixFile 
9ee0: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
9ef0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
9f00: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
9f10: 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
9f20: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
9f30: 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 6f   if( ALWAYS(pIno
9f40: 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  de) ){.    pInod
9f50: 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  e->nRef--;.    i
9f60: 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d  f( pInode->nRef=
9f70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
9f80: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  rt( pInode->pShm
9f90: 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Node==0 );.     
9fa0: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
9fb0: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  (pFile);.      i
9fc0: 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76  f( pInode->pPrev
9fd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
9fe0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  rt( pInode->pPre
9ff0: 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65  v->pNext==pInode
a000: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   );.        pIno
a010: 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  de->pPrev->pNext
a020: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
a030: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a040: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
a050: 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65  nodeList==pInode
a060: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f 64   );.        inod
a070: 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  eList = pInode->
a080: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
a090: 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
a0a0: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
a0b0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
a0c0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d  ->pNext->pPrev==
a0d0: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
a0e0: 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d    pInode->pNext-
a0f0: 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d  >pPrev = pInode-
a100: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a  >pPrev;.      }.
a110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
a120: 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  ee(pInode);.    
a130: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
a140: 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  iven a file desc
a150: 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74  riptor, locate t
a160: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
a170: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
a180: 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66  describes that f
a190: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
a1a0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
a1b0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  e if necessary. 
a1c0: 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
a1d0: 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75 6e  alue might be un
a1e0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61  initialized if a
a1f0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
a200: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
a210: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
a220: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
a230: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
a240: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
a250: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
a260: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
a270: 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70  Return an approp
a280: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
a290: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a2a0: 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20  findInodeInfo(. 
a2b0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
a2c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a2d0: 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74  /* Unix file wit
a2e0: 68 20 66 69 6c 65 20 64 65 73 63 20 75 73 65 64  h file desc used
a2f0: 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20   in the key */. 
a300: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
a310: 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20 20  *ppInode        
a320: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e  /* Return the un
a330: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
a340: 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ct here */.){.  
a350: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a370: 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 65  * System call re
a380: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
a390: 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a3b0: 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
a3c0: 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20 2a  ptor for pFile *
a3d0: 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46  /.  struct unixF
a3e0: 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20  ileId fileId;   
a3f0: 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79     /* Lookup key
a400: 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e 6f   for the unixIno
a410: 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75  deInfo */.  stru
a420: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
a430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
a440: 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66  w-level file inf
a450: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e  ormation */.  un
a460: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
a470: 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ode = 0;     /* 
a480: 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49 6e  Candidate unixIn
a490: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a  odeInfo object *
a4a0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  /..  assert( uni
a4b0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
a4c0: 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65  .  /* Get low-le
a4d0: 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  vel information 
a4e0: 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74  about the file t
a4f0: 68 61 74 20 77 65 20 63 61 6e 20 75 73 65 64 20  hat we can used 
a500: 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61  to.  ** create a
a510: 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72   unique name for
a520: 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
a530: 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b    fd = pFile->h;
a540: 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28  .  rc = osFstat(
a550: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
a560: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
a570: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
a580: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64  no = errno;.#ifd
a590: 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20  ef EOVERFLOW.   
a5a0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74   if( pFile->last
a5b0: 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57  Errno==EOVERFLOW
a5c0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
a5d0: 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20  _NOLFS;.#endif. 
a5e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a5f0: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66  _IOERR;.  }..#if
a600: 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20  def __APPLE__.  
a610: 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e  /* On OS X on an
a620: 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65   msdos filesyste
a630: 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  m, the inode num
a640: 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a  ber is reported.
a650: 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79    ** incorrectly
a660: 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66   for zero-size f
a670: 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65  iles.  See ticke
a680: 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72  t #3260.  To wor
a690: 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68  k.  ** around th
a6a0: 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63  is problem (we c
a6b0: 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75 67  onsider it a bug
a6c0: 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51   in OS X, not SQ
a6d0: 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c  Lite).  ** we al
a6e0: 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74 68  ways increase th
a6f0: 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31  e file size to 1
a700: 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73 69   by writing a si
a710: 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70  ngle byte.  ** p
a720: 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e  rior to accessin
a730: 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  g the inode numb
a740: 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74  er.  The one byt
a750: 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a  e written is.  *
a760: 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20 63  * an ASCII 'S' c
a770: 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20 61  haracter which a
a780: 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62  lso happens to b
a790: 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  e the first byte
a7a0: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61  .  ** in the hea
a7b0: 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c  der of every SQL
a7c0: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ite database.  I
a7d0: 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 74  n this way, if t
a7e0: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72  here.  ** is a r
a7f0: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75  ace condition su
a800: 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20  ch that another 
a810: 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65 61  thread has alrea
a820: 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a  dy populated.  *
a830: 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  * the first page
a840: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
a850: 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64  , no damage is d
a860: 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
a870: 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d  statbuf.st_size=
a880: 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66 73  =0 && (pFile->fs
a890: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
a8a0: 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29  SFLAGS_IS_MSDOS)
a8b0: 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20 72  !=0 ){.    do{ r
a8c0: 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20  c = osWrite(fd, 
a8d0: 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65 28  "S", 1); }while(
a8e0: 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
a8f0: 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66 28  EINTR );.    if(
a900: 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20   rc!=1 ){.      
a910: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
a920: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
a930: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
a940: 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ERR;.    }.    r
a950: 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20  c = osFstat(fd, 
a960: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69  &statbuf);.    i
a970: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
a980: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
a990: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
a9a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a9b0: 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  IOERR;.    }.  }
a9c0: 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65  .#endif..  memse
a9d0: 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69  t(&fileId, 0, si
a9e0: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20  zeof(fileId));. 
a9f0: 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74   fileId.dev = st
aa00: 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69  atbuf.st_dev;.#i
aa10: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66  f OS_VXWORKS.  f
aa20: 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c  ileId.pId = pFil
aa30: 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20  e->pId;.#else.  
aa40: 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61  fileId.ino = sta
aa50: 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e  tbuf.st_ino;.#en
aa60: 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69  dif.  pInode = i
aa70: 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c  nodeList;.  whil
aa80: 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d  e( pInode && mem
aa90: 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49  cmp(&fileId, &pI
aaa0: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69  node->fileId, si
aab0: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b  zeof(fileId)) ){
aac0: 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49  .    pInode = pI
aad0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  node->pNext;.  }
aae0: 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30  .  if( pInode==0
aaf0: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d   ){.    pInode =
ab00: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
ab10: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
ab20: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
ab30: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  de==0 ){.      r
ab40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
ab50: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
ab60: 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20  mset(pInode, 0, 
ab70: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29  sizeof(*pInode))
ab80: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49  ;.    memcpy(&pI
ab90: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66  node->fileId, &f
aba0: 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69  ileId, sizeof(fi
abb0: 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f  leId));.    pIno
abc0: 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  de->nRef = 1;.  
abd0: 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20    pInode->pNext 
abe0: 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
abf0: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d   pInode->pPrev =
ac00: 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64   0;.    if( inod
ac10: 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73  eList ) inodeLis
ac20: 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64  t->pPrev = pInod
ac30: 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74  e;.    inodeList
ac40: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c   = pInode;.  }el
ac50: 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  se{.    pInode->
ac60: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  nRef++;.  }.  *p
ac70: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b  pInode = pInode;
ac80: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ac90: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
aca0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
acb0: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
acc0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
acd0: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
ace0: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
acf0: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
ad00: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
ad10: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
ad20: 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
ad30: 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
ad40: 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
ad50: 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
ad60: 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
ad70: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
ad80: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
ad90: 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
ada0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
adb0: 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
adc0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
add0: 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72  t unixCheckReser
ade0: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
adf0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
ae00: 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
ae10: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ae20: 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
ae30: 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
ae40: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
ae50: 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
ae60: 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
ae70: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
ae80: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
ae90: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
aea0: 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e  File );.  unixEn
aeb0: 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
aec0: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
aed0: 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
aee0: 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
aef0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
af00: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
af10: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
af20: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
af30: 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
af40: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
af50: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
af60: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
af70: 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73  }..  /* Otherwis
af80: 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
af90: 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
afa0: 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  s it..  */.#ifnd
afb0: 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69  ef __DJGPP__.  i
afc0: 66 28 20 21 72 65 73 65 72 76 65 64 20 26 26 20  f( !reserved && 
afd0: 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  !pFile->pInode->
afe0: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a  bProcessLock ){.
aff0: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
b000: 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e   lock;.    lock.
b010: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
b020: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
b030: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
b040: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
b050: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c  l_len = 1;.    l
b060: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
b070: 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73  RLCK;.    if( os
b080: 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Fcntl(pFile->h, 
b090: 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20  F_GETLK, &lock) 
b0a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
b0b0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
b0c0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20  RESERVEDLOCK;.  
b0d0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
b0e0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
b0f0: 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63    } else if( loc
b100: 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43  k.l_type!=F_UNLC
b110: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72  K ){.      reser
b120: 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ved = 1;.    }. 
b130: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 75   }.#endif.  .  u
b140: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
b150: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
b160: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
b170: 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %d (unix)\n", pF
b180: 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
b190: 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73  rved));..  *pRes
b1a0: 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
b1b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b1c0: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
b1d0: 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f   set a system-lo
b1e0: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 70  ck on the file p
b1f0: 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  File.  The lock 
b200: 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65 64  is .** described
b210: 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   by pLock..**.**
b220: 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77 61   If the pFile wa
b230: 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72  s opened read/wr
b240: 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78  ite from unix-ex
b250: 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c  cl, then the onl
b260: 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f  y lock.** ever o
b270: 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65 78  btained is an ex
b280: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e  clusive lock, an
b290: 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64  d it is obtained
b2a0: 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a   exactly once.**
b2b0: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
b2c0: 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74 65  any lock is atte
b2d0: 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62 73  mpted.  All subs
b2e0: 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f  equent system lo
b2f0: 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  cking.** operati
b300: 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70  ons become no-op
b310: 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72  s.  Locking oper
b320: 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70  ations still hap
b330: 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a  pen internally,.
b340: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
b350: 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73 73  oordinate access
b360: 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61 74   between separat
b370: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
b380: 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e  ctions.** within
b390: 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20 62   this process, b
b3a0: 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20 69  ut all of that i
b3b0: 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d  s handled in mem
b3c0: 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f  ory and the.** o
b3d0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
b3e0: 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63 69  does not partici
b3f0: 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  pate..**.** This
b400: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 70   function is a p
b410: 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20 66  ass-through to f
b420: 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66  cntl(F_SETLK) if
b430: 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67 0a   pFile is using.
b440: 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65 72  ** any VFS other
b450: 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c   than "unix-excl
b460: 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69 73  " or if pFile is
b470: 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78   opened on "unix
b480: 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73  -excl".** and is
b490: 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a   read-only..**.*
b4a0: 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * Zero is return
b4b0: 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20 63  ed if the call c
b4c0: 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73  ompletes success
b4d0: 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20  fully, or -1 if 
b4e0: 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e  a call.** to fcn
b4f0: 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20 74  tl() fails. In t
b500: 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f 20  his case, errno 
b510: 69 73 20 73 65 74 20 61 70 70 72 6f 70 72 69 61  is set appropria
b520: 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28 29  tely (by fcntl()
b530: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
b540: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e   unixFileLock(un
b550: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73  ixFile *pFile, s
b560: 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f  truct flock *pLo
b570: 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ck){.  int rc;. 
b580: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
b590: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
b5a0: 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
b5b0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
b5c0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b5d0: 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69 66  Inode!=0 );.  if
b5e0: 28 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46  ( ((pFile->ctrlF
b5f0: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
b600: 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e 6f  EXCL)!=0 || pIno
b610: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
b620: 29 0a 20 20 20 26 26 20 28 28 70 46 69 6c 65 2d  ).   && ((pFile-
b630: 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
b640: 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30  XFILE_RDONLY)==0
b650: 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ).  ){.    if( p
b660: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
b670: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
b680: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
b690: 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
b6a0: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d   pInode->nLock==
b6b0: 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  0 );.      lock.
b6c0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
b6d0: 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  SET;.      lock.
b6e0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
b6f0: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f  _FIRST;.      lo
b700: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
b710: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f  D_SIZE;.      lo
b720: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
b730: 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  LCK;.      rc = 
b740: 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  osFcntl(pFile->h
b750: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
b760: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3c  );.      if( rc<
b770: 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
b780: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72       pInode->bPr
b790: 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20  ocessLock = 1;. 
b7a0: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
b7b0: 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ck++;.    }else{
b7c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  .      rc = 0;. 
b7d0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
b7e0: 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70    rc = osFcntl(p
b7f0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
b800: 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20  , pLock);.  }.  
b810: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b820: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
b830: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
b840: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
b850: 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
b860: 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
b870: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
b880: 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
b890: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
b8a0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
b8b0: 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
b8c0: 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
b8d0: 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
b8e0: 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
b8f0: 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
b900: 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
b910: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
b920: 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
b930: 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
b940: 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
b950: 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
b960: 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
b970: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
b980: 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
b990: 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
b9a0: 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
b9b0: 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
b9c0: 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
b9d0: 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
b9e0: 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
b9f0: 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
ba00: 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
ba10: 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
ba20: 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
ba30: 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
ba40: 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
ba50: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
ba60: 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
ba70: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
ba80: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
ba90: 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
baa0: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
bab0: 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
bac0: 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
bad0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
bae0: 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
baf0: 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
bb00: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
bb10: 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
bb20: 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
bb30: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
bb40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
bb50: 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  xLock(sqlite3_fi
bb60: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
bb70: 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65  eLock){.  /* The
bb80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72   following descr
bb90: 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ibes the impleme
bba0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76  ntation of the v
bbb0: 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64  arious locks and
bbc0: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73  .  ** lock trans
bbd0: 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20  itions in terms 
bbe0: 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76  of the POSIX adv
bbf0: 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64  isory shared and
bc00: 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20   exclusive.  ** 
bc10: 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20  lock primitives 
bc20: 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63  (called read-loc
bc30: 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63  ks and write-loc
bc40: 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f  ks below, to avo
bc50: 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f  id.  ** confusio
bc60: 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f  n with SQLite lo
bc70: 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61  ck names). The a
bc80: 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f  lgorithms are co
bc90: 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73  mplicated.  ** s
bca0: 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72  lightly in order
bcb0: 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c   to be compatibl
bcc0: 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73  e with windows s
bcd0: 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65  ystems simultane
bce0: 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73  ously.  ** acces
bcf0: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
bd00: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20  tabase file, in 
bd10: 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65  case that is eve
bd20: 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a  r required..  **
bd30: 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65  .  ** Symbols de
bd40: 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e  fined in os.h in
bd50: 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e  dentify the 'pen
bd60: 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74  ding byte' and t
bd70: 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a  he 'reserved.  *
bd80: 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69  * byte', each si
bd90: 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65  ngle bytes at we
bda0: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73  ll known offsets
bdb0: 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65  , and the 'share
bdc0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
bdd0: 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35  e', a range of 5
bde0: 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65  10 bytes at a we
bdf0: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e  ll known offset.
be00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62  .  **.  ** To ob
be10: 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f  tain a SHARED lo
be20: 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ck, a read-lock 
be30: 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  is obtained on t
be40: 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a  he 'pending.  **
be50: 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73   byte'.  If this
be60: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
be70: 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72  a random byte fr
be80: 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62  om the 'shared b
be90: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
bea0: 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61  is read-locked a
beb0: 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
bec0: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
bed0: 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a  ' released..  **
bee0: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
bef0: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
bf00: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
bf10: 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53  after it has a S
bf20: 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  HARED lock..  **
bf30: 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   A RESERVED lock
bf40: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
bf50: 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72  by grabbing a wr
bf60: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  ite-lock on the.
bf70: 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62    ** 'reserved b
bf80: 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  yte'. .  **.  **
bf90: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
bfa0: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e  nly obtain a PEN
bfb0: 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20  DING lock after 
bfc0: 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  it has obtained 
bfd0: 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f  a.  ** SHARED lo
bfe0: 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  ck. A PENDING lo
bff0: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
c000: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
c010: 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a   write-lock.  **
c020: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
c030: 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73   byte'. This ens
c040: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77  ures that no new
c050: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61   SHARED locks ca
c060: 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  n be.  ** obtain
c070: 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67  ed, but existing
c080: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72   SHARED locks ar
c090: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72  e allowed to per
c0a0: 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a  sist. A process.
c0b0: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61    ** does not ha
c0c0: 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52  ve to obtain a R
c0d0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
c0e0: 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e  the way to a PEN
c0f0: 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  DING lock..  ** 
c100: 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73  This property is
c110: 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67   used by the alg
c120: 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69  orithm for rolli
c130: 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
c140: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65  l file.  ** afte
c150: 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a  r a crash..  **.
c160: 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56    ** An EXCLUSIV
c170: 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64  E lock, obtained
c180: 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47   after a PENDING
c190: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69   lock is held, i
c1a0: 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  s.  ** implement
c1b0: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
c1c0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
c1d0: 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72  the entire 'shar
c1e0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
c1f0: 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f  ge'. Since all o
c200: 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69  ther locks requi
c210: 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  re a read-lock o
c220: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74  n one of the byt
c230: 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74  es.  ** within t
c240: 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20  his range, this 
c250: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
c260: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20  other locks are 
c270: 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  held on the.  **
c280: 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a   database. .  **
c290: 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e  .  ** The reason
c2a0: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63   a single byte c
c2b0: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e  annot be used in
c2c0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68  stead of the 'sh
c2d0: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
c2e0: 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f  ange' is that so
c2f0: 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77  me versions of w
c300: 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75  indows do not su
c310: 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73  pport read-locks
c320: 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e  . By.  ** lockin
c330: 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20  g a random byte 
c340: 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f  from a range, co
c350: 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20  ncurrent SHARED 
c360: 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a  locks may exist.
c370: 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65    ** even if the
c380: 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
c390: 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79  ve used is alway
c3a0: 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a  s a write-lock..
c3b0: 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20    */.  int rc = 
c3c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
c3d0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
c3e0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
c3f0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
c400: 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20  Inode;.  struct 
c410: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
c420: 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20  t tErrno = 0;.. 
c430: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
c440: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
c450: 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
c460: 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
c470: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
c480: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69  e->h,.      azFi
c490: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
c4a0: 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
c4b0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
c4c0: 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63  .      azFileLoc
c4d0: 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  k(pFile->pInode-
c4e0: 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69  >eFileLock), pFi
c4f0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
c500: 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29 29  red , getpid()))
c510: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
c520: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
c530: 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
c540: 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
c550: 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
c560: 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  unixFile, do not
c570: 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
c580: 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  the end_lock: ex
c590: 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
c5a0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
c5b0: 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
c5c0: 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
c5d0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
c5e0: 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b  eLock>=eFileLock
c5f0: 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
c600: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
c610: 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64  ok (already held
c620: 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  ) (unix)\n", pFi
c630: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
c640: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
c650: 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20  ileLock)));.    
c660: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c670: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
c680: 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
c690: 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
c6a0: 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29  rrect..  **  (1)
c6b0: 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66   We never move f
c6c0: 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20  rom unlocked to 
c6d0: 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20  anything higher 
c6e0: 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b  than shared lock
c6f0: 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69  ..  **  (2) SQLi
c700: 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69  te never explici
c710: 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70  tly requests a p
c720: 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  endig lock..  **
c730: 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c    (3) A shared l
c740: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65  ock is always he
c750: 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76  ld when a reserv
c760: 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  e lock is reques
c770: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ted..  */.  asse
c780: 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
c790: 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
c7a0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
c7b0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
c7c0: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
c7d0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
c7e0: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
c7f0: 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock!=RESERVED_LO
c800: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69  CK || pFile->eFi
c810: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
c820: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  OCK );..  /* Thi
c830: 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
c840: 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
c850: 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
c860: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
c870: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
c880: 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
c890: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
c8a0: 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  de;..  /* If som
c8b0: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
c8c0: 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
c8d0: 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
c8e0: 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a  nt unixFile*.  *
c8f0: 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72  * handle that pr
c900: 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75  ecludes the requ
c910: 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75  ested lock, retu
c920: 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  rn BUSY..  */.  
c930: 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c  if( (pFile->eFil
c940: 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65  eLock!=pInode->e
c950: 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20  FileLock && .   
c960: 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e         (pInode->
c970: 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
c980: 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NG_LOCK || eFile
c990: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
c9a0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  )).  ){.    rc =
c9b0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
c9c0: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
c9d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
c9e0: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
c9f0: 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
ca00: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
ca10: 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
ca20: 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
ca30: 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
ca40: 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
ca50: 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
ca60: 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
ca70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
ca80: 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
ca90: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
caa0: 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 49 6e  K && .      (pIn
cab0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
cac0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
cad0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
cae0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
caf0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
cb00: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
cb10: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  D_LOCK );.    as
cb20: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
cb30: 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
cb40: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
cb50: 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20  >nShared>0 );.  
cb60: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
cb70: 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
cb80: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
cb90: 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e  hared++;.    pIn
cba0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
cbb0: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
cbc0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45  .  }...  /* A PE
cbd0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
cbe0: 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
cbf0: 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
cc00: 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
cc10: 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
cc20: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
cc30: 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
cc40: 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
cc50: 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
cc60: 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
cc70: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
cc80: 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63  ;.  lock.l_whenc
cc90: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
cca0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
ccb0: 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
ccc0: 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    || (eFileLock=
ccd0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
cce0: 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
ccf0: 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ock<PENDING_LOCK
cd00: 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e  ).  ){.    lock.
cd10: 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65 4c  l_type = (eFileL
cd20: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
cd30: 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b  ?F_RDLCK:F_WRLCK
cd40: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  );.    lock.l_st
cd50: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
cd60: 54 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78  TE;.    if( unix
cd70: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
cd80: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
cd90: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
cda0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
cdb0: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
cdc0: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
cdd0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
cde0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
cdf0: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
ce00: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
ce10: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
ce20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
ce30: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
ce40: 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49    }.  }...  /* I
ce50: 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
ce60: 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
ce70: 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
ce80: 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
ce90: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
cea0: 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
ceb0: 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
cec0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
ced0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
cee0: 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
cef0: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
cf00: 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
cf10: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
cf20: 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
cf30: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
cf40: 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f  ITE_OK );..    /
cf50: 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65  * Now get the re
cf60: 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  ad-lock */.    l
cf70: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
cf80: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
cf90: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
cfa0: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66  RED_SIZE;.    if
cfb0: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
cfc0: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
cfd0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
cfe0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
cff0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
d000: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
d010: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
d020: 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  LOCK);.    }..  
d030: 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65    /* Drop the te
d040: 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20  mporary PENDING 
d050: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
d060: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
d070: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
d080: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
d090: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
d0a0: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28  F_UNLCK;.    if(
d0b0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
d0c0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72  ile, &lock) && r
d0d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d0e0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
d0f0: 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68 20  uld happen with 
d100: 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20  a network mount 
d110: 2a 2f 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  */.      tErrno 
d120: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
d130: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
d140: 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a  _UNLOCK; .    }.
d150: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
d160: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
d170: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
d180: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
d190: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
d1a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
d1b0: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
d1c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
d1d0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
d1e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
d1f0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
d200: 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  ++;.      pInode
d210: 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  ->nShared = 1;. 
d220: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
d230: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
d240: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49  USIVE_LOCK && pI
d250: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
d260: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
d270: 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
d280: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
d290: 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
d2a0: 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   in this.    ** 
d2b0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
d2c0: 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
d2d0: 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
d2e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d2f0: 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
d300: 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
d310: 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
d320: 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
d330: 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
d340: 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
d350: 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
d360: 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
d370: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
d380: 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
d390: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
d3a0: 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46  rt( 0!=pFile->eF
d3b0: 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c  ileLock );.    l
d3c0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
d3d0: 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72  RLCK;..    asser
d3e0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  t( eFileLock==RE
d3f0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SERVED_LOCK || e
d400: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
d410: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
d420: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  if( eFileLock==R
d430: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
d440: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
d450: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
d460: 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  TE;.      lock.l
d470: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d  _len = 1L;.    }
d480: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  else{.      lock
d490: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
d4a0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
d4b0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
d4c0: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a  ED_SIZE;.    }..
d4d0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
d4e0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
d4f0: 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  k) ){.      tErr
d500: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
d510: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
d520: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
d530: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
d540: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
d550: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d560: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
d570: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
d580: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
d590: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
d5a0: 20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   ..#ifdef SQLITE
d5b0: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20  _DEBUG.  /* Set 
d5c0: 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  up the transacti
d5d0: 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67  on-counter chang
d5e0: 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73  e checking flags
d5f0: 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73   when.  ** trans
d600: 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20  itioning from a 
d610: 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53 45  SHARED to a RESE
d620: 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20  RVED lock.  The 
d630: 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d  change.  ** from
d640: 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
d650: 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65  VED marks the be
d660: 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72  ginning of a nor
d670: 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f  mal.  ** write o
d680: 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20  peration (not a 
d690: 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot journal roll
d6a0: 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  back)..  */.  if
d6b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
d6c0: 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69     && pFile->eFi
d6d0: 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
d6e0: 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c  OCK.   && eFileL
d6f0: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
d700: 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c  CK.  ){.    pFil
d710: 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
d720: 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
d730: 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  >dbUpdate = 0;. 
d740: 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
d750: 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d  alWrite = 1;.  }
d760: 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20  .#endif...  if( 
d770: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d780: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
d790: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
d7a0: 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  k;.    pInode->e
d7b0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
d7c0: 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Lock;.  }else if
d7d0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
d7e0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
d7f0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
d800: 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
d810: 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
d820: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
d830: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65  ING_LOCK;.  }..e
d840: 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  nd_lock:.  unixL
d850: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
d860: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
d870: 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78 29   %d %s %s (unix)
d880: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
d890: 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
d8a0: 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d  ock), .      rc=
d8b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
d8c0: 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
d8d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d8e0: 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69  /*.** Add the fi
d8f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75 73  le descriptor us
d900: 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c  ed by file handl
d910: 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63  e pFile to the c
d920: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
d930: 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f  pUnused list..*/
d940: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
d950: 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69  PendingFd(unixFi
d960: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
d970: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
d980: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
d990: 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  ode;.  UnixUnuse
d9a0: 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e  dFd *p = pFile->
d9b0: 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e  pUnused;.  p->pN
d9c0: 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55  ext = pInode->pU
d9d0: 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d  nused;.  pInode-
d9e0: 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20  >pUnused = p;.  
d9f0: 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
da00: 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20   pFile->pUnused 
da10: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  = 0;.}../*.** Lo
da20: 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
da30: 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
da40: 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
da50: 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
da60: 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
da70: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
da80: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
da90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
daa0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
dab0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
dac0: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
dad0: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
dae0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
daf0: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
db00: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
db10: 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61  op..** .** If ha
db20: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73  ndleNFSUnlock is
db30: 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64   true, then on d
db40: 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58  owngrading an EX
db50: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20  CLUSIVE_LOCK to 
db60: 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79  SHARED.** the by
db70: 74 65 20 72 61 6e 67 65 20 69 73 20 64 69 76 69  te range is divi
db80: 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73  ded into 2 parts
db90: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 70   and the first p
dba0: 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  art is unlocked 
dbb0: 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61  then.** set to a
dbc0: 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e   read lock, then
dbd0: 20 74 68 65 20 6f 74 68 65 72 20 70 61 72 74 20   the other part 
dbe0: 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b  is simply unlock
dbf0: 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20  ed.  This works 
dc00: 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67  .** around a bug
dc10: 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b   in BSD NFS lock
dc20: 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20  d (also seen on 
dc30: 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68  MacOSX 10.3+) th
dc40: 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20  at fails to .** 
dc50: 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65  remove the write
dc60: 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f   lock on a regio
dc70: 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f  n when a read lo
dc80: 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74  ck is set..*/.st
dc90: 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55 6e  atic int posixUn
dca0: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
dcb0: 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
dcc0: 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65  Lock, int handle
dcd0: 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e  NFSUnlock){.  un
dce0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
dcf0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
dd00: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
dd10: 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
dd20: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
dd30: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
dd40: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  K;..  assert( pF
dd50: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
dd60: 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
dd70: 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70   was %d(%d,%d) p
dd80: 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  id=%d (unix)\n",
dd90: 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
dda0: 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c  Lock,.      pFil
ddb0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
ddc0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
ddd0: 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
dde0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
ddf0: 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29        getpid()))
de00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  ;..  assert( eFi
de10: 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
de20: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69  OCK );.  if( pFi
de30: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65  le->eFileLock<=e
de40: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
de50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
de60: 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
de70: 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
de80: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
de90: 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  de;.  assert( pI
dea0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30  node->nShared!=0
deb0: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
dec0: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
ded0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
dee0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
def0: 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e  ileLock==pFile->
df00: 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69  eFileLock );..#i
df10: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
df20: 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
df30: 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
df40: 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
df50: 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
df60: 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
df70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
df80: 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
df90: 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
dfa0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
dfb0: 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
dfc0: 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
dfd0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
dfe0: 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
dff0: 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
e000: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
e010: 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
e020: 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
e030: 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
e040: 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
e050: 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
e060: 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
e070: 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
e080: 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
e090: 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
e0a0: 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
e0b0: 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
e0c0: 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
e0d0: 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
e0e0: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
e0f0: 20 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d     */.    pFile-
e100: 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
e110: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   0;.#endif..    
e120: 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74  /* downgrading t
e130: 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  o a shared lock 
e140: 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20  on NFS involves 
e150: 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72 69  clearing the wri
e160: 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62  te lock.    ** b
e170: 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69  efore establishi
e180: 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20  ng the readlock 
e190: 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63  - to avoid a rac
e1a0: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64  e condition we d
e1b0: 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20  owngrade.    ** 
e1c0: 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c  the lock in 2 bl
e1d0: 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61  ocks, so that pa
e1e0: 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20  rt of the range 
e1f0: 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20  will be covered 
e200: 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69  by a .    ** wri
e210: 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68  te lock until th
e220: 65 20 72 65 73 74 20 69 73 20 63 6f 76 65 72 65  e rest is covere
e230: 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b  d by a read lock
e240: 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b  :.    **  1:   [
e250: 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32  WWWWW].    **  2
e260: 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20  :   [....W].    
e270: 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d  **  3:   [RRRRW]
e280: 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52  .    **  4:   [R
e290: 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20  RRR.].    */.   
e2a0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
e2b0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a  SHARED_LOCK ){..
e2c0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41  #if !defined(__A
e2d0: 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49  PPLE__) || !SQLI
e2e0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
e2f0: 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76  G_STYLE.      (v
e300: 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  oid)handleNFSUnl
e310: 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ock;.      asser
e320: 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  t( handleNFSUnlo
e330: 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ck==0 );.#endif.
e340: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
e350: 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
e360: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
e370: 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20  STYLE.      if( 
e380: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20  handleNFSUnlock 
e390: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  ){.        int t
e3a0: 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
e3b0: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
e3c0: 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63  de from system c
e3d0: 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  all errors */.  
e3e0: 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53        off_t divS
e3f0: 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  ize = SHARED_SIZ
e400: 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a  E - 1;.        .
e410: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
e420: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
e430: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
e440: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
e450: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
e460: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
e470: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
e480: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69  ck.l_len = divSi
e490: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
e4a0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
e4b0: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
e4c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
e4d0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
e4e0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
e4f0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
e500: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
e510: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
e520: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
e530: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e540: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
e550: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e560: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
e570: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
e580: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
e590: 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20   = F_RDLCK;.    
e5a0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
e5b0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
e5c0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
e5d0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
e5e0: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
e5f0: 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b  l_len = divSize;
e600: 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
e610: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
e620: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
e630: 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
e640: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
e650: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e660: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
e670: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
e680: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29  TE_IOERR_RDLOCK)
e690: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
e6a0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
e6b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
e6c0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e6d0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
e6e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e6f0: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
e700: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
e710: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
e720: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
e730: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
e740: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
e750: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
e760: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
e770: 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  T+divSize;.     
e780: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
e790: 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53  SHARED_SIZE-divS
e7a0: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
e7b0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
e7c0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  ile, &lock)==(-1
e7d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
e7e0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
e7f0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
e800: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
e810: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  K;.          if(
e820: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
e830: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
e840: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
e850: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
e860: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e870: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
e880: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
e890: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
e8a0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
e8b0: 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
e8c0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
e8d0: 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b  STYLE */.      {
e8e0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
e8f0: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
e900: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
e910: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
e920: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
e930: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
e940: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
e950: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
e960: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  ED_SIZE;.       
e970: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
e980: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
e990: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
e9a0: 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63  In theory, the c
e9b0: 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c  all to unixFileL
e9c0: 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  ock() cannot fai
e9d0: 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65  l because anothe
e9e0: 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  r.          ** p
e9f0: 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
ea00: 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  g an incompatibl
ea10: 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f  e lock. If it do
ea20: 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20  es, this .      
ea30: 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73      ** indicates
ea40: 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20   that the other 
ea50: 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
ea60: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63  ollowing the loc
ea70: 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  king.          *
ea80: 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74  * protocol. If t
ea90: 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74  his happens, ret
eaa0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
eab0: 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69  _RDLOCK. Returni
eac0: 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
ead0: 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c  SQLITE_BUSY woul
eae0: 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70  d confuse the up
eaf0: 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72  per layer (in pr
eb00: 61 63 74 69 63 65 20 69 74 20 63 61 75 73 65 73  actice it causes
eb10: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
eb20: 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c  n assert to fail
eb30: 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20  ). */ .         
eb40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
eb50: 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_RDLOCK;.     
eb60: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
eb70: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
eb80: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
eb90: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
eba0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ebb0: 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  }.    lock.l_typ
ebc0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
ebd0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
ebe0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
ebf0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
ec00: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
ec10: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b  lock.l_len = 2L;
ec20: 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e    assert( PENDIN
ec30: 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56  G_BYTE+1==RESERV
ec40: 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69  ED_BYTE );.    i
ec50: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
ec60: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30  pFile, &lock)==0
ec70: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   ){.      pInode
ec80: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
ec90: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
eca0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
ecb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
ecc0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c  LOCK;.      pFil
ecd0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
ece0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 67 6f 74 6f  rrno;.      goto
ecf0: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
ed00: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46 69   }.  }.  if( eFi
ed10: 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
ed20: 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  ){.    /* Decrem
ed30: 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c  ent the shared l
ed40: 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65  ock counter.  Re
ed50: 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75  lease the lock u
ed60: 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f  sing an.    ** O
ed70: 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e  S call only when
ed80: 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20   all threads in 
ed90: 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73  this same proces
eda0: 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a  s have released.
edb0: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e      ** the lock.
edc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f  .    */.    pIno
edd0: 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20  de->nShared--;. 
ede0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
edf0: 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Shared==0 ){.   
ee00: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
ee10: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
ee20: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
ee30: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
ee40: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c  lock.l_start = l
ee50: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a  ock.l_len = 0L;.
ee60: 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
ee70: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
ee80: 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
ee90: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
eea0: 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
eeb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
eec0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
eed0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
eee0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
eef0: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
ef00: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
ef10: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
ef20: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
ef30: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
ef40: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
ef50: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
ef60: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f  Decrement the co
ef70: 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61  unt of locks aga
ef80: 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66  inst this same f
ef90: 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20  ile.  When the. 
efa0: 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63     ** count reac
efb0: 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20  hes zero, close 
efc0: 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64  any other file d
efd0: 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65  escriptors whose
efe0: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61   close.    ** wa
eff0: 73 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75  s deferred becau
f000: 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  se of outstandin
f010: 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a  g locks..    */.
f020: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
f030: 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  k--;.    assert(
f040: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d   pInode->nLock>=
f050: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
f060: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  ode->nLock==0 ){
f070: 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64  .      closePend
f080: 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
f090: 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e     }.  }..end_un
f0a0: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
f0b0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
f0c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
f0d0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
f0e0: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
f0f0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f100: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
f110: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
f120: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
f130: 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
f140: 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
f150: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
f160: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
f170: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
f180: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
f190: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
f1a0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
f1b0: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
f1c0: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
f1d0: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
f1e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
f1f0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
f200: 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f  tic int unixUnlo
f210: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
f220: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
f230: 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f  ck){.  return po
f240: 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46  sixUnlock(id, eF
f250: 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a  ileLock, 0);.}..
f260: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
f270: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
f280: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
f290: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
f2a0: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
f2b0: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
f2c0: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
f2d0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
f2e0: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
f2f0: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
f300: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
f310: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
f320: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
f330: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
f340: 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
f350: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
f360: 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
f370: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
f380: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
f390: 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
f3a0: 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
f3b0: 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
f3c0: 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
f3d0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
f3e0: 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
f3f0: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
f400: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
f410: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
f420: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
f430: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
f440: 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
f450: 20 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63   ){.    robust_c
f460: 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c  lose(pFile, pFil
f470: 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  e->h, __LINE__);
f480: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  .    pFile->h = 
f490: 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56  -1;.  }.#if OS_V
f4a0: 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69  XWORKS.  if( pFi
f4b0: 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69  le->pId ){.    i
f4c0: 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  f( pFile->ctrlFl
f4d0: 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44  ags & UNIXFILE_D
f4e0: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f  ELETE ){.      o
f4f0: 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70  sUnlink(pFile->p
f500: 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
f510: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76  me);.    }.    v
f520: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
f530: 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b  eId(pFile->pId);
f540: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20  .    pFile->pId 
f550: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
f560: 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
f570: 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69  E   %-3d\n", pFi
f580: 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43  le->h));.  OpenC
f590: 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71  ounter(-1);.  sq
f5a0: 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
f5b0: 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65  ->pUnused);.  me
f5c0: 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73  mset(pFile, 0, s
f5d0: 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
f5e0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f5f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
f600: 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
f610: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
f620: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
f630: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63  e *id){.  int rc
f640: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
f650: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
f660: 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
f670: 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69  ;.  unixUnlock(i
f680: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75  d, NO_LOCK);.  u
f690: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
f6a0: 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e  ..  /* unixFile.
f6b0: 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73  pInode is always
f6c0: 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68   valid here. Oth
f6d0: 65 72 77 69 73 65 2c 20 61 20 64 69 66 66 65 72  erwise, a differ
f6e0: 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72  ent close.  ** r
f6f0: 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c  outine (e.g. nol
f700: 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c  ockClose()) woul
f710: 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74  d be called inst
f720: 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ead..  */.  asse
f730: 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  rt( pFile->pInod
f740: 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46  e->nLock>0 || pF
f750: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  ile->pInode->bPr
f760: 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
f770: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 46 69    if( ALWAYS(pFi
f780: 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70  le->pInode) && p
f790: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
f7a0: 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ock ){.    /* If
f7b0: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
f7c0: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f  anding locks, do
f7d0: 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c   not actually cl
f7e0: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73  ose the file jus
f7f0: 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63  t.    ** yet bec
f800: 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
f810: 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b  clear those lock
f820: 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64  s.  Instead, add
f830: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
f840: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
f850: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c  Inode->pUnused l
f860: 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ist.  It will be
f870: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
f880: 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68  losed .    ** wh
f890: 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  en the last lock
f8a0: 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20   is cleared..   
f8b0: 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69   */.    setPendi
f8c0: 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d  ngFd(pFile);.  }
f8d0: 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  .  releaseInodeI
f8e0: 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63  nfo(pFile);.  rc
f8f0: 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
f900: 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  (id);.  unixLeav
f910: 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
f920: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  rn rc;.}../*****
f930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
f940: 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69 73   the posix advis
f950: 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ory lock impleme
f960: 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
f970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
f980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f9a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f9b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f9c0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
f9d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f9e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f9f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
fa20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20  ********* No-op 
fa40: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
fa50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
fa70: 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   Of the various 
fa80: 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
fa90: 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c  tations availabl
faa0: 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66 61  e, this is by fa
fab0: 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73  r the.** simples
fac0: 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69  t:  locking is i
fad0: 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65  gnored.  No atte
fae0: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c  mpt is made to l
faf0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
fb00: 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61  .** file for rea
fb10: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e  ding or writing.
fb20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b  .**.** This lock
fb30: 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72  ing mode is appr
fb40: 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65 20  opriate for use 
fb50: 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74  on read-only dat
fb60: 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64  abases.** (ex: d
fb70: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61 72  atabases that ar
fb80: 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44  e burned into CD
fb90: 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c  -ROM, for exampl
fba0: 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61  e.)  It can.** a
fbb0: 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20 74  lso be used if t
fbc0: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65  he application e
fbd0: 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65  mploys some exte
fbe0: 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74  rnal mechanism t
fbf0: 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d  o.** prevent sim
fc00: 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73  ultaneous access
fc10: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61 74   of the same dat
fc20: 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20  abase by two or 
fc30: 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  more.** database
fc40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42   connections.  B
fc50: 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73 65  ut there is a se
fc60: 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61  rious risk of da
fc70: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70  tabase.** corrup
fc80: 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63  tion if this loc
fc90: 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  king mode is use
fca0: 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20  d in situations 
fcb0: 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a  where multiple.*
fcc0: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
fcd0: 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73  ctions are acces
fce0: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
fcf0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
fd00: 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20  he same.** time 
fd10: 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  and one or more 
fd20: 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74  of those connect
fd30: 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67  ions are writing
fd40: 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
fd50: 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
fd60: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
fd70: 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
fd80: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
fd90: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
fda0: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70  R(NotUsed);.  *p
fdb0: 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65  ResOut = 0;.  re
fdc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fdd0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  }.static int nol
fde0: 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
fdf0: 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
fe00: 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
fe10: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
fe20: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
fe30: 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
fe40: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
fe50: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c  ic int nolockUnl
fe60: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
fe70: 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e   *NotUsed, int N
fe80: 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
fe90: 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
fea0: 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
feb0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
fec0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
fed0: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a  lose the file..*
fee0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  /.static int nol
fef0: 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
ff00: 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72  _file *id) {.  r
ff10: 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46  eturn closeUnixF
ff20: 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a  ile(id);.}../***
ff30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff40: 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f   End of the no-o
ff50: 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  p lock implement
ff60: 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
ff70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
ff80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
ffd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
10020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10030 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74  ****** Begin dot
10040 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a  -file Locking **
10050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
10070 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c  ** The dotfile l
10080 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
10090 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65  ation uses the e
100a0 78 69 73 74 61 6e 63 65 20 6f 66 20 73 65 70 61  xistance of sepa
100b0 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c  rate lock.** fil
100c0 65 73 20 28 72 65 61 6c 6c 79 20 61 20 64 69 72  es (really a dir
100d0 65 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74 72  ectory) to contr
100e0 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  ol access to the
100f0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
10100 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75 73   works.** on jus
10110 74 20 61 62 6f 75 74 20 65 76 65 72 79 20 66 69  t about every fi
10120 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61  lesystem imagina
10130 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65 20  ble.  But there 
10140 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e  are serious down
10150 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  sides:.**.**    
10160 28 31 29 20 20 54 68 65 72 65 20 69 73 20 7a 65  (1)  There is ze
10170 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20  ro concurrency. 
10180 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72   A single reader
10190 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65   blocks all othe
101a0 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e  r.**         con
101b0 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65  nections from re
101c0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
101d0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
101e0 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20  *.**    (2)  An 
101f0 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73  application cras
10200 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20  h or power loss 
10210 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20  can leave stale 
10220 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20  lock files.**   
10230 20 20 20 20 20 20 73 69 74 74 69 6e 67 20 61 72        sitting ar
10240 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74  ound that need t
10250 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e  o be cleared man
10260 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76  ually..**.** Nev
10270 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74  ertheless, a dot
10280 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f  lock is an appro
10290 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d  priate locking m
102a0 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e  ode for use if n
102b0 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69  o.** other locki
102c0 6e 67 20 73 74 72 61 74 65 67 79 20 69 73 20 61  ng strategy is a
102d0 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
102e0 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  Dotfile locking 
102f0 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e  works by creatin
10300 67 20 61 20 73 75 62 64 69 72 65 63 74 6f 72 79  g a subdirectory
10310 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
10320 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65  ectory as.** the
10330 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 77 69   database and wi
10340 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
10350 20 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f   but with a ".lo
10360 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64  ck" extension ad
10370 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73  ded..** The exis
10380 74 61 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20  tance of a lock 
10390 64 69 72 65 63 74 6f 72 79 20 69 6d 70 6c 69 65  directory implie
103a0 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
103b0 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 0a  ock.  All other.
103c0 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20 28 53  ** lock types (S
103d0 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
103e0 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61   PENDING) are ma
103f0 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53  pped into EXCLUS
10400 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  IVE..*/../*.** T
10410 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 61  he file suffix a
10420 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  dded to the data
10430 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69   base filename i
10440 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74  n order to creat
10450 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64 69  e the.** lock di
10460 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65 66  rectory..*/.#def
10470 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  ine DOTLOCK_SUFF
10480 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a  IX ".lock"../*.*
10490 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
104a0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
104b0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
104c0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
104d0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
104e0 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
104f0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
10500 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
10510 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
10520 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
10530 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
10540 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
10550 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
10560 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
10570 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
10580 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
10590 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
105a0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
105b0 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  cking..**.** In 
105c0 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
105d0 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65   either a lock e
105e0 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73  xists or it does
105f0 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69   not.  So in thi
10600 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f  s.** variation o
10610 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  f CheckReservedL
10620 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20  ock(), *pResOut 
10630 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69  is set to true i
10640 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f any lock.** is
10650 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
10660 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74  e and false if t
10670 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  he file is unloc
10680 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ked..*/.static i
10690 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  nt dotlockCheckR
106a0 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
106b0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
106c0 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
106d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
106e0 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
106f0 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
10700 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10710 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
10720 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
10730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
10740 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
10750 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
10760 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
10770 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
10780 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
10790 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
107a0 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
107b0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
107c0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
107d0 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
107e0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
107f0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f  or some other co
10800 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nnection in the 
10810 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20  same process.   
10820 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b   ** holds a lock
10830 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e   on the file.  N
10840 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
10850 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  further. */.    
10860 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
10870 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
10880 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69  e lock is held i
10890 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68  f and only if th
108a0 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74  e lockfile exist
108b0 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  s */.    const c
108c0 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
108d0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46   (const char*)pF
108e0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
108f0 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65  ext;.    reserve
10900 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c 6f  d = osAccess(zLo
10910 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20  ckFile, 0)==0;. 
10920 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
10930 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
10940 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d %d (dotlock)\n
10950 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
10960 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a   reserved));.  *
10970 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
10980 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
10990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
109a0 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
109b0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
109c0 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
109d0 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
109e0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
109f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
10a00 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
10a10 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
10a20 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
10a30 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
10a40 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
10a50 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
10a60 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
10a70 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
10a80 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
10a90 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
10aa0 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
10ab0 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
10ac0 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
10ad0 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
10ae0 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
10af0 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
10b00 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
10b10 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
10b20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
10b30 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
10b40 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
10b50 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
10b60 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
10b70 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
10b80 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
10b90 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
10ba0 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
10bb0 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
10bc0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
10bd0 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
10be0 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
10bf0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
10c00 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
10c10 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
10c20 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
10c30 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
10c40 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
10c50 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
10c60 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
10c70 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
10c80 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
10c90 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
10ca0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
10cb0 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  vel..**.** With 
10cc0 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
10cd0 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20   we really only 
10ce0 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34  support state (4
10cf0 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a  ): EXCLUSIVE..**
10d00 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68   But we track th
10d10 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  e other locking 
10d20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c  levels internall
10d30 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
10d40 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c   dotlockLock(sql
10d50 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
10d60 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
10d70 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
10d80 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
10d90 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  d;.  char *zLock
10da0 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70  File = (char *)p
10db0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
10dc0 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  text;.  int rc =
10dd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20   SQLITE_OK;...  
10de0 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 61 6e  /* If we have an
10df0 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65  y lock, then the
10e00 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61   lock file alrea
10e10 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20  dy exists.  All 
10e20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20  we have.  ** to 
10e30 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72  do is adjust our
10e40 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
10e50 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76   of the lock lev
10e60 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  el..  */.  if( p
10e70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
10e80 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  > NO_LOCK ){.   
10e90 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
10ea0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
10eb0 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64     /* Always upd
10ec0 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d  ate the timestam
10ed0 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c  p on the old fil
10ee0 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45  e */.#ifdef HAVE
10ef0 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d 65  _UTIME.    utime
10f00 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c  (zLockFile, NULL
10f10 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74 69  );.#else.    uti
10f20 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e  mes(zLockFile, N
10f30 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ULL);.#endif.   
10f40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10f50 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  K;.  }.  .  /* g
10f60 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65  rab an exclusive
10f70 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d 20   lock */.  rc = 
10f80 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69 6c  osMkdir(zLockFil
10f90 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28 20  e, 0777);.  if( 
10fa0 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66  rc<0 ){.    /* f
10fb0 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72  ailed to open/cr
10fc0 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64 69  eate the lock di
10fd0 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 69  rectory */.    i
10fe0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
10ff0 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53  o;.    if( EEXIS
11000 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  T == tErrno ){. 
11010 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11020 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73  _BUSY;.    } els
11030 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  e {.      rc = s
11040 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
11050 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
11060 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
11070 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
11080 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
11090 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
110a0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
110b0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
110c0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
110d0 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a  rc;.  } .  .  /*
110e0 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
110f0 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
11100 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e   ok */.  pFile->
11110 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
11120 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
11130 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
11140 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
11150 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
11160 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
11170 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
11180 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
11190 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
111a0 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
111b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
111c0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
111d0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
111e0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
111f0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
11200 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
11210 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
11220 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
11230 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  p..**.** When th
11240 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
11250 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c  reaches NO_LOCK,
11260 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
11270 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
11280 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f   int dotlockUnlo
11290 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
112a0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
112b0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
112c0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
112d0 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
112e0 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
112f0 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
11300 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
11310 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
11320 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
11330 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
11340 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25   %d was %d pid=%
11350 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20  d (dotlock)\n", 
11360 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
11370 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
11380 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11390 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
113a0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
113b0 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
113c0 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
113d0 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
113e0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
113f0 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
11400 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11410 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
11420 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65   /* To downgrade
11430 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70   to shared, simp
11440 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  ly update our in
11450 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66  ternal notion of
11460 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73   the.  ** lock s
11470 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74  tate.  No need t
11480 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68 65 20  o mess with the 
11490 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
114a0 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
114b0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
114c0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
114d0 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
114e0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72  _LOCK;.    retur
114f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
11500 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c  .  .  /* To full
11510 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  y unlock the dat
11520 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68  abase, delete th
11530 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  e lock file */. 
11540 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
11550 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20  ck==NO_LOCK );. 
11560 20 72 63 20 3d 20 6f 73 52 6d 64 69 72 28 7a 4c   rc = osRmdir(zL
11570 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  ockFile);.  if( 
11580 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
11590 4e 4f 54 44 49 52 20 29 20 72 63 20 3d 20 6f 73  NOTDIR ) rc = os
115a0 55 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65  Unlink(zLockFile
115b0 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b  );.  if( rc<0 ){
115c0 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
115d0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  = errno;.    rc 
115e0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f  = 0;.    if( ENO
115f0 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  ENT != tErrno ){
11600 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
11610 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
11620 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
11630 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
11640 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
11650 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
11660 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rno;.    }.    r
11670 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20  eturn rc; .  }. 
11680 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11690 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  k = NO_LOCK;.  r
116a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
116b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
116c0 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75  a file.  Make su
116d0 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  re the lock has 
116e0 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65  been released be
116f0 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f  fore closing..*/
11700 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
11710 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
11720 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
11730 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11740 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  K;.  if( id ){. 
11750 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
11760 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
11770 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55  id;.    dotlockU
11780 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
11790 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  K);.    sqlite3_
117a0 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  free(pFile->lock
117b0 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ingContext);.   
117c0 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
117d0 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72  ile(id);.  }.  r
117e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a  eturn rc;.}./***
117f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
11800 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66  End of the dot-f
11810 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ile lock impleme
11820 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
11830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
11840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
11890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
118e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118f0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c  ******* Begin fl
11900 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ock Locking ****
11910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
11930 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b  ** Use the flock
11940 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  () system call t
11950 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  o do file lockin
11960 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29  g..**.** flock()
11970 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65   locking is like
11980 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e   dot-file lockin
11990 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76 61  g in that the va
119a0 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72  rious.** fine-gr
119b0 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ain locking leve
119c0 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ls supported by 
119d0 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61  SQLite are colla
119e0 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  psed into.** a s
119f0 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20  ingle exclusive 
11a00 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20  lock.  In other 
11a10 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52  words, SHARED, R
11a20 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20  ESERVED, and.** 
11a30 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72  PENDING locks ar
11a40 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  e the same thing
11a50 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45   as an EXCLUSIVE
11a60 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a   lock.  SQLite.*
11a70 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68  * still works wh
11a80 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20  en you do this, 
11a90 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20  but concurrency 
11aa0 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63 65  is reduced since
11ab0 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  .** only a singl
11ac0 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65  e process can be
11ad0 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
11ae0 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e  abase at a time.
11af0 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73  .**.** Omit this
11b00 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49   section if SQLI
11b10 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
11b20 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65  G_STYLE is turne
11b30 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63  d off or if.** c
11b40 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56 58 57  ompiling for VXW
11b50 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ORKS..*/.#if SQL
11b60 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
11b70 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
11b80 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52  VXWORKS../*.** R
11b90 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c  etry flock() cal
11ba0 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77 69 74  ls that fail wit
11bb0 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65  h EINTR.*/.#ifde
11bc0 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69  f EINTR.static i
11bd0 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  nt robust_flock(
11be0 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b  int fd, int op){
11bf0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b  .  int rc;.  do{
11c00 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f   rc = flock(fd,o
11c10 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  p); }while( rc<0
11c20 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
11c30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
11c40 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
11c50 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61  e robust_flock(a
11c60 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23  ,b) flock(a,b).#
11c70 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a  endif.     ../*.
11c80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11c90 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
11ca0 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
11cb0 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
11cc0 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
11cd0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
11ce0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
11cf0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
11d00 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
11d10 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
11d20 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
11d30 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
11d40 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
11d50 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
11d60 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
11d70 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
11d80 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
11d90 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
11da0 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
11db0 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b  c int flockCheck
11dc0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
11dd0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
11de0 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
11df0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11e00 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
11e10 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
11e20 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
11e30 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
11e40 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
11e50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
11e60 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
11e70 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
11e80 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
11e90 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
11ea0 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
11eb0 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
11ec0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
11ed0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
11ee0 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
11ef0 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
11f00 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20  ed = 1;.  }.  . 
11f10 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
11f20 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
11f30 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
11f40 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65  . */.  if( !rese
11f50 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61  rved ){.    /* a
11f60 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68  ttempt to get th
11f70 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e  e lock */.    in
11f80 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  t lrc = robust_f
11f90 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
11fa0 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
11fb0 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20  );.    if( !lrc 
11fc0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20  ){.      /* got 
11fd0 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  the lock, unlock
11fe0 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63   it */.      lrc
11ff0 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28   = robust_flock(
12000 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55  pFile->h, LOCK_U
12010 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c  N);.      if ( l
12020 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69  rc ) {.        i
12030 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
12040 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e  o;.        /* un
12050 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68  lock failed with
12060 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
12070 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49 54       lrc = SQLIT
12080 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20  E_IOERR_UNLOCK; 
12090 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f  .        if( IS_
120a0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
120b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
120c0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
120d0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
120e0 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
120f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12100 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
12110 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
12120 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72  rno;.      reser
12130 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f  ved = 1;.      /
12140 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  * someone else m
12150 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65 73  ight have it res
12160 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c  erved */.      l
12170 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
12180 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
12190 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
121a0 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20  ERR_LOCK); .    
121b0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
121c0 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
121d0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
121e0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
121f0 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b         rc = lrc;
12200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12210 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
12220 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
12230 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  d %d (flock)\n",
12240 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
12250 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64  eserved));..#ifd
12260 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
12270 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
12280 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53  RS.  if( (rc & S
12290 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
122a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
122b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
122c0 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64  OK;.    reserved
122d0 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  =1;.  }.#endif /
122e0 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
122f0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
12300 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20  S */.  *pResOut 
12310 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
12320 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12330 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
12340 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
12350 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
12360 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
12370 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
12380 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
12390 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
123a0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
123b0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
123c0 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
123d0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
123e0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
123f0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
12400 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
12410 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
12420 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
12430 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
12440 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
12450 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
12460 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
12470 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
12480 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
12490 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
124a0 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
124b0 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
124c0 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
124d0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
124e0 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
124f0 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
12500 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
12510 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
12520 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
12530 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
12540 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
12550 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
12560 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
12570 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
12580 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
12590 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
125a0 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
125b0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
125c0 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
125d0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
125e0 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c  *.** flock() onl
125f0 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74  y really support
12600 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
12610 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65  .  We track inte
12620 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b  rmediate.** lock
12630 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73   states in the s
12640 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
12650 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c  cture, but all l
12660 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a  ocks SHARED or.*
12670 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c  * above are real
12680 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ly EXCLUSIVE loc
12690 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61  ks and exclude a
126a0 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ll other process
126b0 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73  es from.** acces
126c0 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  s the file..**.*
126d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
126e0 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
126f0 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
12700 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
12710 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
12720 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
12730 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
12740 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63  tic int flockLoc
12750 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
12760 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
12770 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  k) {.  int rc = 
12780 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
12790 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
127a0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
127b0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
127c0 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c  ;..  /* if we al
127d0 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
127e0 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69  k, it is exclusi
127f0 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20  ve.  .  ** Just 
12800 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64  adjust level and
12810 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68   punt on outta h
12820 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46  ere. */.  if (pF
12830 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
12840 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20   NO_LOCK) {.    
12850 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12860 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
12870 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12880 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
12890 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
128a0 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69  e lock */.  .  i
128b0 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  f (robust_flock(
128c0 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
128d0 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a  X | LOCK_NB)) {.
128e0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
128f0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64   errno;.    /* d
12900 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20  idn't get, must 
12910 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72  be busy */.    r
12920 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
12930 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
12940 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
12950 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  RR_LOCK);.    if
12960 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
12970 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
12980 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
12990 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
129a0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20  } else {.    /* 
129b0 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
129c0 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
129d0 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  ok */.    pFile-
129e0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
129f0 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53  leLock;.  }.  OS
12a00 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
12a10 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29  %d %s %s (flock)
12a20 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
12a30 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
12a40 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ock), .         
12a50 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
12a60 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
12a70 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  "));.#ifdef SQLI
12a80 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
12a90 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66  LOCK_ERRORS.  if
12aa0 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49  ( (rc & SQLITE_I
12ab0 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
12ac0 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20  IOERR ){.    rc 
12ad0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
12ae0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
12af0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
12b00 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
12b10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12b20 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
12b30 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
12b40 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
12b50 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
12b60 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
12b70 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
12b80 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
12b90 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
12ba0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
12bb0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
12bc0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
12bd0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
12be0 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
12bf0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
12c00 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
12c10 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
12c20 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
12c30 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
12c40 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
12c50 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
12c60 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
12c70 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
12c80 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
12c90 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
12ca0 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
12cb0 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63   %d pid=%d (floc
12cc0 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
12cd0 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
12ce0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
12cf0 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28  ileLock, getpid(
12d00 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
12d10 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
12d20 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
12d30 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
12d40 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
12d50 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
12d60 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
12d70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12d80 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
12d90 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
12da0 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
12db0 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
12dc0 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
12dd0 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
12de0 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  ED_LOCK) {.    p
12df0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
12e00 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
12e10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12e20 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e  K;.  }.  .  /* n
12e30 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63  o, really, unloc
12e40 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75  k. */.  if( robu
12e50 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  st_flock(pFile->
12e60 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23  h, LOCK_UN) ){.#
12e70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
12e80 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
12e90 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72 6e  RRORS.    return
12ea0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
12eb0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
12ec0 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
12ed0 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65 74  RRORS */.    ret
12ee0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
12ef0 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65  _UNLOCK;.  }else
12f00 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
12f10 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
12f20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12f30 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
12f40 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
12f50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
12f60 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69   flockClose(sqli
12f70 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
12f80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12f90 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29  E_OK;.  if( id )
12fa0 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63  {.    flockUnloc
12fb0 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
12fc0 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e      rc = closeUn
12fd0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a  ixFile(id);.  }.
12fe0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12ff0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13000 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
13010 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
13020 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORK */../*******
13030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
13040 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f   of the flock lo
13050 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
13060 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
13070 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
13080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130c0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
130d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13110 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
13120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13130 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65  * Begin Named Se
13140 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20  maphore Locking 
13150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13160 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e  ********.**.** N
13170 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
13180 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73  ocking is only s
13190 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f  upported on VxWo
131a0 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70  rks..**.** Semap
131b0 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
131c0 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e  like dot-lock an
131d0 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20  d flock in that 
131e0 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a  it really only.*
131f0 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55  * supports EXCLU
13200 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f  SIVE locking.  O
13210 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
13220 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72  cess can read or
13230 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61   write.** the da
13240 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61  tabase file at a
13250 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64   time.  This red
13260 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63  uces potential c
13270 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a  oncurrency, but.
13280 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63  ** makes the loc
13290 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
132a0 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f   much easier..*/
132b0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
132c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
132d0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
132e0 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
132f0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
13300 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
13310 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
13320 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
13330 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
13340 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
13350 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
13360 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
13370 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
13380 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
13390 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
133a0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
133b0 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
133c0 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
133d0 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
133e0 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
133f0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65  tatic int semChe
13400 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
13410 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
13420 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
13430 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13440 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
13450 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
13460 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
13470 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
13480 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
13490 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
134a0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
134b0 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
134c0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
134d0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
134e0 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
134f0 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
13500 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
13510 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
13520 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
13530 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
13540 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
13550 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
13560 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
13570 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
13580 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
13590 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74  ved ){.    sem_t
135a0 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
135b0 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20  pInode->pSem;.  
135c0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
135d0 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20  atBuf;..    if( 
135e0 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d  sem_trywait(pSem
135f0 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69  )==-1 ){.      i
13600 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
13610 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47  o;.      if( EAG
13620 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  AIN != tErrno ){
13630 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13640 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
13650 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
13660 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
13670 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b  CKRESERVEDLOCK);
13680 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
13690 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
136a0 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  no;.      } else
136b0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f   {.        /* so
136c0 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74  meone else has t
136d0 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20  he lock when we 
136e0 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a  are in NO_LOCK *
136f0 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72 76  /.        reserv
13700 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69  ed = (pFile->eFi
13710 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f  leLock < SHARED_
13720 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
13730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13740 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65  /* we could have
13750 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69   it if we want i
13760 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70  t */.      sem_p
13770 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d  ost(pSem);.    }
13780 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
13790 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
137a0 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c   %d %d (sem)\n",
137b0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
137c0 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70  eserved));..  *p
137d0 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
137e0 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
137f0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
13800 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
13810 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
13820 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
13830 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
13840 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
13850 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
13860 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
13870 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
13880 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
13890 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
138a0 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
138b0 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
138c0 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
138d0 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
138e0 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
138f0 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
13900 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
13910 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
13920 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
13930 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
13940 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
13950 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
13960 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
13970 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
13980 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
13990 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
139a0 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
139b0 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
139c0 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
139d0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
139e0 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
139f0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
13a00 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
13a10 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
13a20 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
13a30 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
13a40 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
13a50 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
13a60 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
13a70 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
13a80 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
13a90 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
13aa0 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  USIVE.**.** Sema
13ab0 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79  phore locks only
13ac0 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20   really support 
13ad0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e  EXCLUSIVE locks.
13ae0 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72    We track inter
13af0 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20  mediate.** lock 
13b00 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71  states in the sq
13b10 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
13b20 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f  ture, but all lo
13b30 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a  cks SHARED or.**
13b40 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c   above are reall
13b50 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  y EXCLUSIVE lock
13b60 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c  s and exclude al
13b70 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  l other processe
13b80 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73  s from.** access
13b90 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
13ba0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
13bb0 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
13bc0 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
13bd0 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
13be0 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
13bf0 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
13c00 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
13c10 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73  ic int semLock(s
13c20 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
13c30 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
13c40 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
13c50 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
13c60 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  )id;.  int fd;. 
13c70 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
13c80 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
13c90 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  em;.  int rc = S
13ca0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
13cb0 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
13cc0 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
13cd0 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
13ce0 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
13cf0 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
13d00 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
13d10 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69    if (pFile->eFi
13d20 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
13d30 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
13d40 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
13d50 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53  Lock;.    rc = S
13d60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
13d70 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
13d80 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63  .  }.  .  /* loc
13d90 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20  k semaphore now 
13da0 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65  but bail out whe
13db0 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64  n already locked
13dc0 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74  . */.  if( sem_t
13dd0 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
13de0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
13df0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
13e00 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
13e10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69  .  }..  /* got i
13e20 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
13e30 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
13e40 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
13e50 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
13e60 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a  .. sem_end_lock:
13e70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13e80 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
13e90 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
13ea0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
13eb0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
13ec0 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
13ed0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
13ee0 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
13ef0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
13f00 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
13f10 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
13f20 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
13f30 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
13f40 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
13f50 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
13f60 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
13f70 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
13f80 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e  static int semUn
13f90 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
13fa0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
13fb0 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
13fc0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
13fd0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d  xFile*)id;.  sem
13fe0 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
13ff0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
14000 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
14010 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
14020 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  em );.  OSTRACE(
14030 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
14040 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73  was %d pid=%d (s
14050 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
14060 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
14070 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
14080 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64  FileLock, getpid
14090 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
140a0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
140b0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
140c0 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
140d0 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
140e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
140f0 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
14100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14110 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
14120 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
14130 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
14140 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
14150 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
14160 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
14170 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
14180 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14190 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
141a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
141b0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
141c0 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63  no, really unloc
141d0 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d  k. */.  if ( sem
141e0 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20  _post(pSem)==-1 
141f0 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20  ) {.    int rc, 
14200 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
14210 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
14220 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
14230 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
14240 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
14250 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
14260 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
14270 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
14280 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
14290 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
142a0 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
142b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
142c0 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
142d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
142e0 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  . ** Close a fil
142f0 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e.. */.static in
14300 74 20 73 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74  t semClose(sqlit
14310 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
14320 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
14330 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14340 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14350 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28 69 64      semUnlock(id
14360 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
14370 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
14380 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
14390 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61  tex();.    relea
143a0 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
143b0 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  e);.    unixLeav
143c0 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c  eMutex();.    cl
143d0 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
143e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
143f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
14400 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
14410 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20   */./*.** Named 
14420 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
14430 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  g is only availa
14440 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ble on VxWorks..
14450 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
14460 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61  ** End of the na
14470 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
14480 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
14490 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
144a0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
144b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144f0 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
14500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14540 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
14550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14560 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69   Begin AFP Locki
14570 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
14580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14590 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69  ****.**.** AFP i
145a0 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69  s the Apple Fili
145b0 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46  ng Protocol.  AF
145c0 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66  P is a network f
145d0 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a  ilesystem found.
145e0 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69  ** on Apple Maci
145f0 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20  ntosh computers 
14600 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f  - both OS9 and O
14610 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d  SX..**.** Third-
14620 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61  party implementa
14630 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65  tions of AFP are
14640 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74   available.  But
14650 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a   this code here.
14660 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e  ** only works on
14670 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65   OSX..*/..#if de
14680 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
14690 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
146a0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
146b0 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63  /*.** The afpLoc
146c0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75  kingContext stru
146d0 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
146e0 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63  ll afp lock spec
146f0 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79  ific state.*/.ty
14700 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66 70  pedef struct afp
14710 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61  LockingContext a
14720 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
14730 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  ;.struct afpLock
14740 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69  ingContext {.  i
14750 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63  nt reserved;.  c
14760 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74  onst char *dbPat
14770 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
14780 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
14790 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73  en file */.};..s
147a0 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
147b0 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67  ockPB2.{.  unsig
147c0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
147d0 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
147e0 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  offset to first 
147f0 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  byte to lock */.
14800 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
14810 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20  long length;    
14820 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79      /* nbr of by
14830 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  tes to lock */. 
14840 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
14850 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61 72  ong retRangeStar
14860 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74  t; /* nbr of 1st
14870 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20   byte locked if 
14880 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20  successful */.  
14890 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e  unsigned char un
148a0 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20  LockFlag;       
148b0 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c    /* 1 = unlock,
148c0 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75   0 = lock */.  u
148d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61  nsigned char sta
148e0 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20  rtEndFlag;      
148f0 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64   /* 1=rel to end
14900 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20   of fork, 0=rel 
14910 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e  to start */.  in
14920 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14940 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20  /* file desc to 
14950 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20  assoc this lock 
14960 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  with */.};..#def
14970 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 6e  ine afpfsByteRan
14980 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20  geLock2FSCTL    
14990 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32      _IOWR('z', 2
149a0 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61  3, struct ByteRa
149b0 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a  ngeLockPB2)../*.
149c0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69  ** This is a uti
149d0 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67  lity for setting
149e0 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62   or clearing a b
149f0 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e  it-range lock on
14a00 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73   an.** AFP files
14a10 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65  ystem..** .** Re
14a20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
14a30 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54  n success, SQLIT
14a40 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72  E_BUSY on failur
14a50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
14a60 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63   afpSetLock(.  c
14a70 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a90 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
14aa0 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f  e to be locked o
14ab0 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  r unlocked */.  
14ac0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
14ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14ae0 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
14af0 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a  riptor on path *
14b00 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
14b10 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20  g long offset,  
14b20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
14b30 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
14b40 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
14b50 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20   long length,   
14b60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
14b70 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
14b80 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61    int setLockFla
14b90 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
14ba0 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20   /* True to set 
14bb0 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20  lock.  False to 
14bc0 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  clear lock */.){
14bd0 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61  .  struct ByteRa
14be0 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20  ngeLockPB2 pb;. 
14bf0 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70   int err;.  .  p
14c00 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73  b.unLockFlag = s
14c10 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a  etLockFlag ? 0 :
14c20 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e   1;.  pb.startEn
14c30 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e  dFlag = 0;.  pb.
14c40 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b  offset = offset;
14c50 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c  .  pb.length = l
14c60 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20  ength; .  pb.fd 
14c70 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20  = pFile->h;.  . 
14c80 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45   OSTRACE(("AFPSE
14c90 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25  TLOCK [%s] for %
14ca0 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c  d%s in range %ll
14cb0 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20  x:%llx\n", .    
14cc0 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e  (setLockFlag?"ON
14cd0 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d  ":"OFF"), pFile-
14ce0 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22  >h, (pb.fd==-1?"
14cf0 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29  [testval-1]":"")
14d00 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65  ,.    offset, le
14d10 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20 3d 20  ngth));.  err = 
14d20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66  fsctl(path, afpf
14d30 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46  sByteRangeLock2F
14d40 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20  SCTL, &pb, 0);. 
14d50 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20   if ( err==-1 ) 
14d60 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
14d70 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
14d80 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43  rrno;.    OSTRAC
14d90 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66  E(("AFPSETLOCK f
14da0 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29  ailed to fsctl()
14db0 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a   '%s' %d %s\n",.
14dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74               pat
14dd0 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72  h, tErrno, strer
14de0 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a 23  ror(tErrno)));.#
14df0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
14e00 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52  ORE_AFP_LOCK_ERR
14e10 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ORS.    rc = SQL
14e20 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a  ITE_BUSY;.#else.
14e30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
14e40 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
14e50 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  or(tErrno,.     
14e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
14e70 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c  etLockFlag ? SQL
14e80 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a  ITE_IOERR_LOCK :
14e90 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
14ea0 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  LOCK);.#endif /*
14eb0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
14ec0 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  FP_LOCK_ERRORS *
14ed0 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  /.    if( IS_LOC
14ee0 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
14ef0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
14f00 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
14f10 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
14f20 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   rc;.  } else {.
14f30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14f40 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
14f50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14f60 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
14f70 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
14f80 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
14f90 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
14fa0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
14fb0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
14fc0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
14fd0 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
14fe0 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
14ff0 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
15000 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
15010 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
15020 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
15030 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
15040 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
15050 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
15060 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
15070 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
15080 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65  c int afpCheckRe
15090 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
150a0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
150b0 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
150c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
150d0 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
150e0 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
150f0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
15100 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f  ile*)id;.  afpLo
15110 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
15120 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75  ntext;.  .  Simu
15130 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
15140 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
15150 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
15160 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
15170 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 63  rt( pFile );.  c
15180 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
15190 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
151a0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
151b0 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74  text;.  if( cont
151c0 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
151d0 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  .    *pResOut = 
151e0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
151f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
15200 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
15210 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
15220 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
15230 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
15240 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68  ds */.  .  /* Ch
15250 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
15260 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
15270 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
15280 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
15290 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
152a0 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
152b0 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
152c0 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
152d0 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
152e0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
152f0 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
15300 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65    */.  if( !rese
15310 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  rved ){.    /* l
15320 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44  ock the RESERVED
15330 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74   byte */.    int
15340 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63   lrc = afpSetLoc
15350 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
15360 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
15370 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20  ED_BYTE, 1,1);  
15380 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
15390 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20  OK==lrc ){.     
153a0 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65   /* if we succee
153b0 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68  ded in taking th
153c0 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c  e reserved lock,
153d0 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65   unlock it to re
153e0 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74  store.      ** t
153f0 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  he original stat
15400 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  e */.      lrc =
15410 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
15420 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
15430 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
15440 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
15450 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20  else {.      /* 
15460 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  if we failed to 
15470 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65  get the lock the
15480 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  n someone else m
15490 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20  ust have it */. 
154a0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
154b0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
154c0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
154d0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d  rc) ){.      rc=
154e0 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  lrc;.    }.  }. 
154f0 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
15500 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
15510 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
15520 64 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22  d %d %d (afp)\n"
15530 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
15540 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20  reserved));.  . 
15550 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
15560 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
15570 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
15580 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
15590 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
155a0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
155b0 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
155c0 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
155d0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
155e0 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
155f0 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
15600 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
15610 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
15620 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
15630 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
15640 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
15650 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
15660 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
15670 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
15680 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
15690 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
156a0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
156b0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
156c0 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
156d0 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
156e0 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
156f0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
15700 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
15710 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
15720 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
15730 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
15740 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
15750 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
15760 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
15770 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
15780 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
15790 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
157a0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
157b0 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
157c0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
157d0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
157e0 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
157f0 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
15800 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
15810 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
15820 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
15830 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
15840 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
15850 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
15860 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
15870 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
15880 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
15890 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
158a0 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c   int afpLock(sql
158b0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
158c0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
158d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
158e0 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
158f0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
15900 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
15910 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
15920 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
15930 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
15940 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
15950 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
15960 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
15970 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a  kingContext;.  .
15980 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
15990 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
159a0 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
159b0 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
159c0 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
159d0 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
159e0 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
159f0 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f  eLock), azFileLo
15a00 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ck(pFile->eFileL
15a10 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ock),.          
15a20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f   azFileLock(pIno
15a30 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  de->eFileLock), 
15a40 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
15a50 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20  , getpid()));.. 
15a60 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
15a70 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
15a80 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
15a90 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
15aa0 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78  on the.  ** unix
15ab0 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
15ac0 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
15ad0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  afp_end_lock: ex
15ae0 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
15af0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
15b00 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
15b10 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
15b20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
15b30 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b  eLock>=eFileLock
15b40 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
15b50 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
15b60 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64  ok (already held
15b70 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  ) (afp)\n", pFil
15b80 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
15b90 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
15ba0 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65  eLock)));.    re
15bb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15bc0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
15bd0 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
15be0 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
15bf0 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65  ect.  **  (1) We
15c00 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d   never move from
15c10 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79   unlocked to any
15c20 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61  thing higher tha
15c30 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20  n shared lock.. 
15c40 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20   **  (2) SQLite 
15c50 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79  never explicitly
15c60 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64   requests a pend
15c70 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ig lock..  **  (
15c80 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  3) A shared lock
15c90 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20   is always held 
15ca0 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c  when a reserve l
15cb0 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
15cc0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
15cd0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
15ce0 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46  k!=NO_LOCK || eF
15cf0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
15d00 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
15d10 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e  ( eFileLock!=PEN
15d20 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
15d30 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
15d40 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
15d50 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  || pFile->eFileL
15d60 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
15d70 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73   );.  .  /* This
15d80 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
15d90 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
15da0 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
15db0 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
15dc0 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
15dd0 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
15de0 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
15df0 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65  e;..  /* If some
15e00 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
15e10 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63  is PID has a loc
15e20 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e  k via a differen
15e30 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a  t unixFile*.  **
15e40 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65   handle that pre
15e50 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65  cludes the reque
15e60 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72  sted lock, retur
15e70 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  n BUSY..  */.  i
15e80 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  f( (pFile->eFile
15e90 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46  Lock!=pInode->eF
15ea0 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20  ileLock && .    
15eb0 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
15ec0 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c  eLock>=PENDING_L
15ed0 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
15ee0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20  >SHARED_LOCK)). 
15ef0 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20      ){.    rc = 
15f00 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
15f10 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
15f20 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
15f30 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  If a SHARED lock
15f40 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61   is requested, a
15f50 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  nd some thread u
15f60 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c  sing this PID al
15f70 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61  ready.  ** has a
15f80 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52   SHARED or RESER
15f90 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69  VED lock, then i
15fa0 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e  ncrement referen
15fb0 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20  ce counts and.  
15fc0 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
15fd0 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  _OK..  */.  if( 
15fe0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
15ff0 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20  D_LOCK && .     
16000 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
16010 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
16020 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  || pInode->eFile
16030 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
16040 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65  OCK) ){.    asse
16050 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  rt( eFileLock==S
16060 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
16070 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
16080 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
16090 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
160a0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29  ode->nShared>0 )
160b0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  ;.    pFile->eFi
160c0 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
160d0 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
160e0 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20  ->nShared++;.   
160f0 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
16100 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65  ;.    goto afp_e
16110 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20  nd_lock;.  }.   
16120 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47   .  /* A PENDING
16130 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20   lock is needed 
16140 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
16150 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61   a SHARED lock a
16160 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  nd before.  ** a
16170 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c  cquiring an EXCL
16180 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72  USIVE lock.  For
16190 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
161a0 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69  , the PENDING wi
161b0 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61  ll.  ** be relea
161c0 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sed..  */.  if( 
161d0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
161e0 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c  D_LOCK .      ||
161f0 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43   (eFileLock==EXC
16200 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
16210 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
16220 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20  PENDING_LOCK).  
16230 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65  ){.    int faile
16240 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20  d;.    failed = 
16250 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
16260 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
16270 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
16280 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28   1, 1);.    if (
16290 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20  failed) {.      
162a0 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
162b0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
162c0 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
162d0 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72    .  /* If contr
162e0 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
162f0 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
16300 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
16310 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72  d make.  ** oper
16320 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c  ating system cal
16330 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ls for the speci
16340 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  fied lock..  */.
16350 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
16360 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
16370 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72      int lrc1, lr
16380 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20  c2, lrc1Errno = 
16390 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20  0;.    long lk, 
163a0 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61  mask;.    .    a
163b0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
163c0 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20  Shared==0 );.   
163d0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
163e0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
163f0 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 6d 61  .        .    ma
16400 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e  sk = (sizeof(lon
16410 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53 54  g)==8) ? LARGEST
16420 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66 66 66  _INT64 : 0x7ffff
16430 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  fff;.    /* Now 
16440 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  get the read-loc
16450 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  k SHARED_LOCK */
16460 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61  .    /* note tha
16470 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66  t the quality of
16480 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
16490 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74  doesn't matter t
164a0 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20  hat much */.    
164b0 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a  lk = random(); .
164c0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72      pInode->shar
164d0 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d  edByte = (lk & m
164e0 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53 49 5a  ask)%(SHARED_SIZ
164f0 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31  E - 1);.    lrc1
16500 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
16510 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
16520 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20  File, .         
16530 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
16540 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
16550 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  , 1, 1);.    if(
16560 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
16570 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72  rc1) ){.      lr
16580 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d  c1Errno = pFile-
16590 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
165a0 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  }.    /* Drop th
165b0 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
165c0 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
165d0 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc2 = afpSetLoc
165e0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
165f0 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
16600 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  G_BYTE, 1, 0);. 
16610 20 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c     .    if( IS_L
16620 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
16630 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
16640 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72 63  >lastErrno = lrc
16650 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63  1Errno;.      rc
16660 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67   = lrc1;.      g
16670 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
16680 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
16690 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
166a0 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63  rc2) ){.      rc
166b0 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67   = lrc2;.      g
166c0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
166d0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
166e0 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f   lrc1 != SQLITE_
166f0 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20  OK ) {.      rc 
16700 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c  = lrc1;.    } el
16710 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  se {.      pFile
16720 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
16730 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
16740 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
16750 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
16760 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  nShared = 1;.   
16770 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
16780 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
16790 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f  IVE_LOCK && pIno
167a0 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b  de->nShared>1 ){
167b0 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
167c0 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
167d0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
167e0 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
167f0 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73  n this.     ** s
16800 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
16810 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
16820 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
16830 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
16840 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  USY;.  }else{.  
16850 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
16860 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
16870 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
16880 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
16890 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
168a0 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
168b0 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
168c0 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
168d0 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
168e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66      */.    int f
168f0 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61  ailed = 0;.    a
16900 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
16910 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
16920 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20    if (eFileLock 
16930 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  >= RESERVED_LOCK
16940 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
16950 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f  Lock < RESERVED_
16960 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20  LOCK) {.        
16970 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53  /* Acquire a RES
16980 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20  ERVED lock */.  
16990 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
169a0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
169b0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
169c0 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
169d0 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28   1,1);.      if(
169e0 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20   !failed ){.    
169f0 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
16a00 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
16a10 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20   }.    }.    if 
16a20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c  (!failed && eFil
16a30 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49  eLock == EXCLUSI
16a40 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20  VE_LOCK) {.     
16a50 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45   /* Acquire an E
16a60 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f  XCLUSIVE lock */
16a70 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
16a80 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68  /* Remove the sh
16a90 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65  ared lock before
16aa0 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67   trying the rang
16ab0 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74  e.  we'll need t
16ac0 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73  o .      ** rees
16ad0 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
16ae0 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61  ed lock if we ca
16af0 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70  n't get the  afp
16b00 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a  Unlock.      */.
16b10 20 20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c        if( !(fail
16b20 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
16b30 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16b40 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
16b50 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20  IRST +.         
16b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b70 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
16b80 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20  te, 1, 0)) ){.  
16b90 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64        int failed
16ba0 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
16bb0 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74         /* now at
16bc0 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68  temmpt to get th
16bd0 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
16be0 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20   range */.      
16bf0 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
16c00 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
16c10 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
16c20 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20  ARED_FIRST, .   
16c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c40 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
16c50 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20  ED_SIZE, 1);.   
16c60 20 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20       if( failed 
16c70 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66  && (failed2 = af
16c80 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16c90 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16ca0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
16cb0 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
16cc0 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e  FIRST + pInode->
16cd0 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31  sharedByte, 1, 1
16ce0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
16cf0 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61 62  /* Can't reestab
16d00 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
16d10 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61  lock.  Sqlite ca
16d20 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69  n't deal, this i
16d30 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
16d40 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72   critical I/O er
16d50 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ror.          */
16d60 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
16d70 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54  ((failed & SQLIT
16d80 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
16d90 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c  TE_IOERR) ? fail
16da0 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20  ed2 : .         
16db0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45        SQLITE_IOE
16dc0 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  RR_LOCK;.       
16dd0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
16de0 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20  lock;.        } 
16df0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16e00 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
16e10 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d; .      }.    
16e20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64  }.    if( failed
16e30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
16e40 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ailed;.    }.  }
16e50 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  .  .  if( rc==SQ
16e60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
16e70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
16e80 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
16e90 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
16ea0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
16eb0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
16ec0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
16ed0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
16ee0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
16ef0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
16f00 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
16f10 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
16f20 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65  CK;.  }.  .afp_e
16f30 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  nd_lock:.  unixL
16f40 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
16f50 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
16f60 20 25 64 20 25 73 20 25 73 20 28 61 66 70 29 5c   %d %s %s (afp)\
16f70 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a  n", pFile->h, az
16f80 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
16f90 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72  ck), .         r
16fa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
16fb0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
16fc0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16fd0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
16fe0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
16ff0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
17000 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
17010 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
17020 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
17030 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
17040 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
17050 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
17060 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
17070 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
17080 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
17090 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
170a0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
170b0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
170c0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
170d0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55  .static int afpU
170e0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
170f0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
17100 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72  eLock) {.  int r
17110 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17120 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
17130 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
17140 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
17150 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  o *pInode;.  afp
17160 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
17170 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
17180 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
17190 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
171a0 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69  ntext;.  int ski
171b0 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66  pShared = 0;.#if
171c0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
171d0 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d    int h = pFile-
171e0 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  >h;.#endif..  as
171f0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
17200 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
17210 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28  K  %d %d was %d(
17220 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61  %d,%d) pid=%d (a
17230 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
17240 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
17250 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
17260 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
17270 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
17280 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
17290 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
172a0 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29         getpid())
172b0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46  );..  assert( eF
172c0 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
172d0 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
172e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
172f0 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
17300 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17310 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
17320 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
17330 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
17340 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
17350 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d  Inode->nShared!=
17360 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
17370 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
17380 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
17390 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
173a0 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d  FileLock==pFile-
173b0 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
173c0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
173d0 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
173e0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
173f0 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69   h=(-1) ).    Si
17400 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
17410 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69 66  ign(0);.    .#if
17420 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
17430 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
17440 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
17450 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
17460 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
17470 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
17480 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17490 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
174a0 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
174b0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
174c0 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
174d0 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
174e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
174f0 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
17500 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
17510 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
17520 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
17530 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
17540 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
17550 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
17560 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
17570 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
17580 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
17590 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
175a0 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
175b0 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
175c0 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
175d0 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
175e0 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
175f0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
17600 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
17610 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
17620 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  Write==0.       
17630 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62      || pFile->db
17640 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20  Update==0.      
17650 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74       || pFile->t
17660 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20  ransCntrChng==1 
17670 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  );.    pFile->in
17680 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
17690 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20  .#endif.    .   
176a0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
176b0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
176c0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
176d0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
176e0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
176f0 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
17700 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  RST, SHARED_SIZE
17710 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
17720 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17730 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
17740 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
17750 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20 29  de->nShared>1) )
17760 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c  {.        /* onl
17770 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74  y re-establish t
17780 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
17790 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
177a0 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72 65         int share
177b0 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52  dLockByte = SHAR
177c0 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
177d0 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
177e0 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
177f0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
17800 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61  Path, pFile, sha
17810 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
17820 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  1);.      } else
17830 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70 53   {.        skipS
17840 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  hared = 1;.     
17850 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
17860 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
17870 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
17880 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
17890 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
178a0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
178b0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
178c0 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
178d0 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20  1, 0);.    } .  
178e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
178f0 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  _OK && pFile->eF
17900 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ileLock>=RESERVE
17910 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78  D_LOCK && contex
17920 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20  t->reserved ){. 
17930 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
17940 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
17950 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
17960 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
17970 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 63  );.      if( !rc
17980 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f 6e   ){ .        con
17990 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
179a0 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20   0; .      }.   
179b0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
179c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69  QLITE_OK && (eFi
179d0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
179e0 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e  OCK || pInode->n
179f0 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20 20  Shared>1)){.    
17a00 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
17a10 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
17a20 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
17a30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17a40 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e   && eFileLock==N
17a50 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f  O_LOCK ){..    /
17a60 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
17a70 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e  shared lock coun
17a80 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68  ter.  Release th
17a90 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a  e lock using an.
17aa0 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f      ** OS call o
17ab0 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72  nly when all thr
17ac0 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d  eads in this sam
17ad0 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72  e process have r
17ae0 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74  eleased.    ** t
17af0 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a  he lock..    */.
17b00 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e      unsigned lon
17b10 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63  g long sharedLoc
17b20 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
17b30 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
17b40 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49 6e  redByte;.    pIn
17b50 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
17b60 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
17b70 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
17b80 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
17b90 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
17ba0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
17bb0 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
17bc0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
17bd0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
17be0 20 20 20 20 69 66 28 20 21 73 6b 69 70 53 68 61      if( !skipSha
17bf0 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  red ){.        r
17c00 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
17c10 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17c20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
17c30 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20  kByte, 1, 0);.  
17c40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
17c50 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !rc ){.        p
17c60 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
17c70 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
17c80 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
17c90 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
17ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17cb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17cc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  _OK ){.      pIn
17cd0 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
17ce0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
17cf0 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  de->nLock>=0 );.
17d00 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
17d10 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  ->nLock==0 ){.  
17d20 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
17d30 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
17d40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17d50 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
17d60 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
17d70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
17d80 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
17d90 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
17da0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17db0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20   Close a file & 
17dc0 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63  cleanup AFP spec
17dd0 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e  ific locking con
17de0 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20  text .*/.static 
17df0 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c  int afpClose(sql
17e00 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
17e10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17e20 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20  TE_OK;.  if( id 
17e30 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
17e40 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
17e50 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55  le*)id;.    afpU
17e60 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
17e70 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65  K);.    unixEnte
17e80 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66  rMutex();.    if
17e90 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  ( pFile->pInode 
17ea0 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  && pFile->pInode
17eb0 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  ->nLock ){.     
17ec0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
17ed0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
17ee0 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
17ef0 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
17f00 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a  le just.      **
17f10 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
17f20 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
17f30 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
17f40 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
17f50 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
17f60 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
17f70 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77  >aPending.  It w
17f80 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
17f90 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e  ally closed when
17fa0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  .      ** the la
17fb0 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
17fc0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
17fd0 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
17fe0 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
17ff0 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
18000 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 73  fo(pFile);.    s
18010 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
18020 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
18030 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f  t);.    rc = clo
18040 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
18050 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
18060 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ex();.  }.  retu
18070 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
18080 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
18090 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
180a0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
180b0 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  STYLE */./*.** T
180c0 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73  he code above is
180d0 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
180e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54  plementation.  T
180f0 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69  he code is speci
18100 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58  fic.** to MacOSX
18110 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f   and does not wo
18120 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78  rk on other unix
18130 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20   platforms.  No 
18140 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69  alternative.** i
18150 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66  s available.  If
18160 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69   you don't compi
18170 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68  le for a mac, th
18180 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70  en the "unix-afp
18190 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20  ".** VFS is not 
181a0 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
181b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
181c0 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41  *** End of the A
181d0 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FP lock implemen
181e0 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
181f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
18200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
18250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
182a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
182b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
182c0 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a   NFS Locking ***
182d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
182e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
182f0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
18300 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
18310 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
18320 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77  STYLE./*. ** Low
18330 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
18340 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
18350 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
18360 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
18370 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20  leLock. ** must 
18380 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
18390 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
183a0 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65  .. **. ** If the
183b0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
183c0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
183d0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
183e0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a   at or below. **
183f0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
18400 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
18410 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
18420 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69  no-op.. */.stati
18430 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28  c int nfsUnlock(
18440 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
18450 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
18460 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78  {.  return posix
18470 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
18480 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e  Lock, 1);.}..#en
18490 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
184a0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
184b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
184c0 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
184d0 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65  * The code above
184e0 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b   is the NFS lock
184f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
18500 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70    The code is sp
18510 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63  ecific.** to Mac
18520 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  OSX and does not
18530 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75   work on other u
18540 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  nix platforms.  
18550 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  No alternative.*
18560 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  * is available. 
18570 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   .**.***********
18580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
18590 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69  f the NFS lock i
185a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
185b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185c0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
185d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18610 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
18620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18660 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
18670 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69  ****** Non-locki
18680 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ng sqlite3_file 
18690 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
186a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186b0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
186c0 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f  next division co
186d0 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74  ntains implement
186e0 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d  ations for all m
186f0 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a  ethods of the .*
18700 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f  * sqlite3_file o
18710 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e  bject other than
18720 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   the locking met
18730 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69  hods.  The locki
18740 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65  ng.** methods we
18750 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69  re defined in di
18760 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f  visions above (o
18770 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  ne locking metho
18780 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f  d per.** divisio
18790 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f  n).  Those metho
187a0 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d  ds that are comm
187b0 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
187c0 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67  g modes.** are g
187d0 61 74 68 65 72 20 74 6f 67 65 74 68 65 72 20 69  ather together i
187e0 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f  nto this divisio
187f0 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  n..*/../*.** See
18800 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  k to the offset 
18810 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
18820 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74  cond argument, t
18830 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a  hen read cnt .**
18840 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66   bytes into pBuf
18850 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  . Return the num
18860 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
18870 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a  ually read..**.*
18880 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65  * NB:  If you de
18890 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f  fine USE_PREAD o
188a0 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74  r USE_PREAD64, t
188b0 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73  hen it might als
188c0 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72  o.** be necessar
188d0 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50  y to define _XOP
188e0 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20  EN_SOURCE to be 
188f0 35 30 30 2e 20 20 54 68 69 73 20 76 61 72 69 65  500.  This varie
18900 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79  s from.** one sy
18910 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e  stem to another.
18920 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64    Since SQLite d
18930 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55  oes not define U
18940 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20  SE_PREAD.** any 
18950 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61  any form by defa
18960 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74  ult, we will not
18970 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69   attempt to defi
18980 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
18990 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73  ..** See tickets
189a0 20 23 32 37 34 31 20 61 6e 64 20 23 32 36 38 31   #2741 and #2681
189b0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
189c0 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72   stomping the er
189d0 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66  rno value on a f
189e0 61 69 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c  ailed read the l
189f0 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
18a00 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
18a10 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
18a20 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
18a30 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69  Read(unixFile *i
18a40 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
18a50 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70   offset, void *p
18a60 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
18a70 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20   int got;.  int 
18a80 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28  prior = 0;.#if (
18a90 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
18aa0 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  AD) && !defined(
18ab0 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20  USE_PREAD64)).  
18ac0 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23  i64 newOffset;.#
18ad0 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54  endif.  TIMER_ST
18ae0 41 52 54 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ART;.  assert( c
18af0 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66  nt==(cnt&0x1ffff
18b00 29 20 29 3b 0a 20 20 63 6e 74 20 26 3d 20 30 78  ) );.  cnt &= 0x
18b10 31 66 66 66 66 3b 0a 20 20 64 6f 7b 0a 23 69 66  1ffff;.  do{.#if
18b20 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
18b30 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  AD).    got = os
18b40 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  Pread(id->h, pBu
18b50 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
18b60 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
18b70 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
18b80 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
18b90 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20  USE_PREAD64).   
18ba0 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34   got = osPread64
18bb0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
18bc0 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
18bd0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18be0 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
18bf0 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74  se.    newOffset
18c00 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
18c10 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
18c20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
18c30 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65  OError( newOffse
18c40 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  t-- );.    if( n
18c50 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74  ewOffset!=offset
18c60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
18c70 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b  wOffset == -1 ){
18c80 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69 78 46  .        ((unixF
18c90 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
18ca0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
18cb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18cc0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
18cd0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  )->lastErrno = 0
18ce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18cf0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
18d00 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 52 65 61  .    got = osRea
18d10 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
18d20 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nt);.#endif.    
18d30 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62  if( got==cnt ) b
18d40 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f  reak;.    if( go
18d50 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  t<0 ){.      if(
18d60 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b   errno==EINTR ){
18d70 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e   got = 1; contin
18d80 75 65 3b 20 7d 0a 20 20 20 20 20 20 70 72 69 6f  ue; }.      prio
18d90 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 28 28 75  r = 0;.      ((u
18da0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
18db0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
18dc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18dd0 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e    }else if( got>
18de0 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d  0 ){.      cnt -
18df0 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66  = got;.      off
18e00 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20  set += got;.    
18e10 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a    prior += got;.
18e20 20 20 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f        pBuf = (vo
18e30 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72  id*)(got + (char
18e40 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20  *)pBuf);.    }. 
18e50 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29   }while( got>0 )
18e60 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  ;.  TIMER_END;. 
18e70 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
18e80 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
18e90 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20  d %llu\n",.     
18ea0 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f         id->h, go
18eb0 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d  t+prior, offset-
18ec0 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41  prior, TIMER_ELA
18ed0 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e  PSED));.  return
18ee0 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f   got+prior;.}../
18ef0 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
18f00 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
18f10 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
18f20 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
18f30 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
18f40 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
18f50 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
18f60 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
18f70 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
18f80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
18f90 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  xRead(.  sqlite3
18fa0 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f  _file *id, .  vo
18fb0 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
18fc0 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
18fd0 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a  int64 offset.){.
18fe0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
18ff0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
19000 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  id;.  int got;. 
19010 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 0a   assert( id );..
19020 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
19030 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
19040 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
19050 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
19060 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
19070 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
19080 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
19090 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
190a0 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
190b0 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
190c0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
190d0 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
190e0 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
190f0 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
19100 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
19110 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
19120 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f   );.#endif..  go
19130 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  t = seekAndRead(
19140 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70  pFile, offset, p
19150 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28  Buf, amt);.  if(
19160 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20   got==amt ){.   
19170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19180 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67  K;.  }else if( g
19190 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  ot<0 ){.    /* l
191a0 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
191b0 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20  seekAndRead */. 
191c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
191d0 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d  _IOERR_READ;.  }
191e0 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
191f0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20  >lastErrno = 0; 
19200 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20  /* not a system 
19210 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20  error */.    /* 
19220 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
19230 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
19240 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
19250 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
19260 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d  char*)pBuf)[got]
19270 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20  , 0, amt-got);. 
19280 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19290 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
192a0 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
192b0 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
192c0 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74  et in id->offset
192d0 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62   then read cnt b
192e0 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a  ytes into pBuf..
192f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
19300 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
19310 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70  tually read.  Up
19320 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e  date the offset.
19330 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
19340 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72  stomping the err
19350 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61  no value on a fa
19360 69 6c 65 64 20 77 72 69 74 65 20 74 68 65 20 6c  iled write the l
19370 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
19380 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
19390 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
193a0 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
193b0 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a  Write(unixFile *
193c0 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  id, i64 offset, 
193d0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
193e0 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
193f0 74 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66  t got;.#if (!def
19400 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20  ined(USE_PREAD) 
19410 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f  && !defined(USE_
19420 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20  PREAD64)).  i64 
19430 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69  newOffset;.#endi
19440 66 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  f.  assert( cnt=
19450 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29 20 29  =(cnt&0x1ffff) )
19460 3b 0a 20 20 63 6e 74 20 26 3d 20 30 78 31 66 66  ;.  cnt &= 0x1ff
19470 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  ff;.  TIMER_STAR
19480 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  T;.#if defined(U
19490 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20  SE_PREAD).  do{ 
194a0 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 28 69  got = osPwrite(i
194b0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
194c0 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65   offset); }while
194d0 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
194e0 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66  ==EINTR );.#elif
194f0 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
19500 41 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f 74 20  AD64).  do{ got 
19510 3d 20 6f 73 50 77 72 69 74 65 36 34 28 69 64 2d  = osPwrite64(id-
19520 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
19530 66 66 73 65 74 29 3b 7d 77 68 69 6c 65 28 20 67  ffset);}while( g
19540 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ot<0 && errno==E
19550 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20 64  INTR);.#else.  d
19560 6f 7b 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74  o{.    newOffset
19570 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
19580 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
19590 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
195a0 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65  OError( newOffse
195b0 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  t-- );.    if( n
195c0 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74  ewOffset!=offset
195d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
195e0 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b  wOffset == -1 ){
195f0 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69 78 46  .        ((unixF
19600 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
19610 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
19620 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19630 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
19640 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  )->lastErrno = 0
19650 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19660 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
19670 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 57 72 69  .    got = osWri
19680 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  te(id->h, pBuf, 
19690 63 6e 74 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  cnt);.  }while( 
196a0 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
196b0 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a  EINTR );.#endif.
196c0 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69    TIMER_END;.  i
196d0 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
196e0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
196f0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
19700 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  no;.  }..  OSTRA
19710 43 45 28 28 22 57 52 49 54 45 20 20 20 25 2d 33  CE(("WRITE   %-3
19720 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75  d %5d %7lld %llu
19730 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c  \n", id->h, got,
19740 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45   offset, TIMER_E
19750 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75  LAPSED));.  retu
19760 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  rn got;.}.../*.*
19770 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
19780 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
19790 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
197a0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
197b0 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
197c0 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
197d0 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
197e0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57  static int unixW
197f0 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  rite(.  sqlite3_
19800 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e  file *id, .  con
19810 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a  st void *pBuf, .
19820 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c    int amt,.  sql
19830 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
19840 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  t .){.  unixFile
19850 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
19860 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77  ile*)id;.  int w
19870 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  rote = 0;.  asse
19880 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65  rt( id );.  asse
19890 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20  rt( amt>0 );..  
198a0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
198b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
198c0 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61  ot a journal, ma
198d0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20  ster-journal or 
198e0 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c  temp.  ** file),
198f0 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
19900 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
19910 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
19920 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
19930 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
19940 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  rt( pFile->pUnus
19950 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
19960 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
19970 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
19980 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
19990 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
199a0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
199b0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
199c0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
199d0 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74  ng a normal writ
199e0 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  e to a database 
199f0 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64  file (as opposed
19a00 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61   to.  ** doing a
19a10 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
19a20 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65  lback or a write
19a30 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74   to some file ot
19a40 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20  her than a.  ** 
19a50 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
19a60 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72  file) then recor
19a70 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
19a80 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
19a90 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20  * has changed.  
19aa0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
19ab0 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f  on counter is mo
19ac0 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74  dified, record t
19ad0 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f  hat.  ** fact to
19ae0 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  o..  */.  if( pF
19af0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
19b00 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  te ){.    pFile-
19b10 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20  >dbUpdate = 1;  
19b20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
19b30 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
19b40 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66  d */.    if( off
19b50 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65  set<=24 && offse
19b60 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20  t+amt>=27 ){.   
19b70 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
19b80 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d   char oldCntr[4]
19b90 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
19ba0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
19bb0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65  ;.      rc = see
19bc0 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
19bd0 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b  24, oldCntr, 4);
19be0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
19bf0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
19c00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34  .      if( rc!=4
19c10 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e   || memcmp(oldCn
19c20 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75  tr, &((char*)pBu
19c30 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34  f)[24-offset], 4
19c40 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
19c50 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
19c60 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68  Chng = 1;  /* Th
19c70 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
19c80 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65  unter has change
19c90 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  d */.      }.   
19ca0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
19cb0 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26   while( amt>0 &&
19cc0 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e   (wrote = seekAn
19cd0 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66  dWrite(pFile, of
19ce0 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
19cf0 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d  )>0 ){.    amt -
19d00 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66  = wrote;.    off
19d10 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20  set += wrote;.  
19d20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
19d30 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
19d40 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f    }.  SimulateIO
19d50 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d  Error(( wrote=(-
19d60 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20  1), amt=1 ));.  
19d70 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
19d80 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c  Error(( wrote=0,
19d90 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66   amt=1 ));..  if
19da0 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69  ( amt>0 ){.    i
19db0 66 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70 46  f( wrote<0 && pF
19dc0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21 3d  ile->lastErrno!=
19dd0 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20 20  ENOSPC ){.      
19de0 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
19df0 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65   by seekAndWrite
19e00 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
19e10 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
19e20 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ITE;.    }else{.
19e30 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
19e40 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e  tErrno = 0; /* n
19e50 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f  ot a system erro
19e60 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
19e70 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
19e80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
19e90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19ea0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
19eb0 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
19ec0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
19ed0 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
19ee0 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
19ef0 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
19f00 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
19f10 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
19f20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65  occurring at the
19f30 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
19f40 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
19f50 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
19f60 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
19f70 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
19f80 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f  dif../*.** We do
19f90 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65   not trust syste
19fa0 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20  ms to provide a 
19fb0 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e  working fdatasyn
19fc0 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a  c().  Some do..*
19fd0 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20  * Others do no. 
19fe0 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20   To be safe, we 
19ff0 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20  will stick with 
1a000 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c  the (slightly sl
1a010 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29  ower).** fsync()
1a020 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68  . If you know th
1a030 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64  at your system d
1a040 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74  oes support fdat
1a050 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c  async() correctl
1a060 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c  y,.** then simpl
1a070 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d  y compile with -
1a080 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61  Dfdatasync=fdata
1a090 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66  sync.*/.#if !def
1a0a0 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 0a  ined(fdatasync).
1a0b0 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79  # define fdatasy
1a0c0 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a  nc fsync.#endif.
1a0d0 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41  ./*.** Define HA
1a0e0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20  VE_FULLFSYNC to 
1a0f0 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67  0 or 1 depending
1a100 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
1a110 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c  ot.** the F_FULL
1a120 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64  FSYNC macro is d
1a130 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46  efined.  F_FULLF
1a140 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c  SYNC is currentl
1a150 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61  y.** only availa
1a160 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e  ble on Mac OS X.
1a170 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64    But that could
1a180 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64   change..*/.#ifd
1a190 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23  ef F_FULLFSYNC.#
1a1a0 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
1a1b0 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23  LFSYNC 1.#else.#
1a1c0 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
1a1d0 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a  LFSYNC 0.#endif.
1a1e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e  ../*.** The fsyn
1a1f0 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  c() system call 
1a200 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73  does not work as
1a210 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d   advertised on m
1a220 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74  any.** unix syst
1a230 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ems.  The follow
1a240 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73  ing procedure is
1a250 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d   an attempt to m
1a260 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62  ake.** it work b
1a270 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etter..**.** The
1a280 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1a290 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61  macro disables a
1a2a0 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68  ll fsync()s.  Th
1a2b0 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20  is is useful.** 
1a2c0 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e  for testing when
1a2d0 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20   we want to run 
1a2e0 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74  through the test
1a2f0 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a   suite quickly..
1a300 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e  ** You are stron
1a310 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74  gly advised *not
1a320 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68  * to deploy with
1a330 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
1a340 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65  ** enabled, howe
1a350 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20  ver, since with 
1a360 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
1a370 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72  nabled, an OS cr
1a380 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  ash.** or power 
1a390 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b  failure will lik
1a3a0 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20  ely corrupt the 
1a3b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1a3c0 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73  *.** SQLite sets
1a3d0 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
1a3e0 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f  ag if the size o
1a3f0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
1a400 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20  changed..** The 
1a410 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61  idea behind data
1a420 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20  Only is that it 
1a430 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74  should only writ
1a440 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65  e the file conte
1a450 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e  nt.** to disk, n
1a460 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57  ot the inode.  W
1a470 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f  e only set dataO
1a480 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20  nly if the file 
1a490 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68  size is .** unch
1a4a0 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20  anged since the 
1a4b0 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72  file size is par
1a4c0 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20  t of the inode. 
1a4d0 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65   However, .** Te
1a4e0 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20  d Ts'o tells us 
1a4f0 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29  that fdatasync()
1a500 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65   will also write
1a510 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68   the inode if th
1a520 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68  e.** file size h
1a530 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65  as changed.  The
1a540 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65   only real diffe
1a550 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64  rence between fd
1a560 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64  atasync().** and
1a570 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65   fsync(), Ted te
1a580 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20  lls us, is that 
1a590 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c  fdatasync() will
1a5a0 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a   not flush the.*
1a5b0 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d  * inode if the m
1a5c0 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72  time or owner or
1a5d0 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74   other inode att
1a5e0 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61  ributes have cha
1a5f0 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79  nged..** We only
1a600 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
1a610 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74  file size, not t
1a620 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74  he other file at
1a630 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20  tributes, so.** 
1a640 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65  as far as SQLite
1a650 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61   is concerned, a
1a660 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73  n fdatasync() is
1a670 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65   always adequate
1a680 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61  ..** So, we alwa
1a690 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63  ys use fdatasync
1a6a0 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69  () if it is avai
1a6b0 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73  lable, regardles
1a6c0 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75  s of.** the valu
1a6d0 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c  e of the dataOnl
1a6e0 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69  y flag..*/.stati
1a6f0 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  c int full_fsync
1a700 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c  (int fd, int ful
1a710 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f  lSync, int dataO
1a720 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
1a730 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1a740 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f  ing "ifdef/elif/
1a750 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73  else/" block has
1a760 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74   the same struct
1a770 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ure as.  ** the 
1a780 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73  one below. It is
1a790 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65   replicated here
1a7a0 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64   solely to avoid
1a7b0 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a   cluttering .  *
1a7c0 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f  * up the real co
1a7d0 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53  de with the UNUS
1a7e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d  ED_PARAMETER() m
1a7f0 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  acros..  */.#ifd
1a800 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
1a810 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
1a820 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
1a830 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c  ED_PARAMETER(ful
1a840 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44  lSync);.  UNUSED
1a850 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
1a860 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45  nly);.#elif HAVE
1a870 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55  _FULLFSYNC.  UNU
1a880 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
1a890 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20  taOnly);.#else. 
1a8a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1a8b0 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55  R(fullSync);.  U
1a8c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1a8d0 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69  dataOnly);.#endi
1a8e0 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  f..  /* Record t
1a8f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
1a900 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20  es that we do a 
1a910 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61  normal fsync() a
1a920 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e  nd .  ** FULLSYN
1a930 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  C.  This is used
1a940 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20   during testing 
1a950 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
1a960 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20  his procedure.  
1a970 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ** gets called w
1a980 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
1a990 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  arguments..  */.
1a9a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1a9b0 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  ST.  if( fullSyn
1a9c0 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  c ) sqlite3_full
1a9d0 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sync_count++;.  
1a9e0 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
1a9f0 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
1aa00 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  /* If we compile
1aa10 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
1aa20 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20  E_NO_SYNC flag, 
1aa30 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20  then syncing is 
1aa40 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a  a.  ** no-op.  *
1aa50 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1aa60 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53  NO_SYNC.  rc = S
1aa70 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20  QLITE_OK;.#elif 
1aa80 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
1aa90 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b   if( fullSync ){
1aaa0 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
1aab0 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e  l(fd, F_FULLFSYN
1aac0 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  C, 0);.  }else{.
1aad0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
1aae0 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c    /* If the FULL
1aaf0 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61  FSYNC failed, fa
1ab00 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d  ll back to attem
1ab10 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29  pting an fsync()
1ab20 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64  ..  ** It should
1ab30 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  n't be possible 
1ab40 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f  for fullfsync to
1ab50 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   fail on the loc
1ab60 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79  al .  ** file sy
1ab70 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73  stem (on OSX), s
1ab80 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61  o failure indica
1ab90 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59  tes that FULLFSY
1aba0 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75  NC.  ** isn't su
1abb0 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73  pported for this
1abc0 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f   file system. So
1abd0 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79  , attempt an fsy
1abe0 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f  nc .  ** and (fo
1abf0 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68  r now) ignore th
1ac00 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20  e overhead of a 
1ac10 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74  superfluous fcnt
1ac20 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49  l call.  .  ** I
1ac30 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f  t'd be better to
1ac40 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e   detect fullfsyn
1ac50 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61  c support once a
1ac60 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74  nd avoid .  ** t
1ac70 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76  he fcntl call ev
1ac80 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73  ery time sync is
1ac90 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20   called..  */.  
1aca0 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73  if( rc ) rc = fs
1acb0 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20  ync(fd);..#elif 
1acc0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1acd0 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e  _).  /* fdatasyn
1ace0 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73  c() on HFS+ does
1acf0 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68  n't yet flush th
1ad00 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69  e file size if i
1ad10 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63  t changed correc
1ad20 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72  tly.  ** so curr
1ad30 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74  ently we default
1ad40 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68   to the macro th
1ad50 61 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61  at redefines fda
1ad60 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a  tasync to fsync.
1ad70 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e    */.  rc = fsyn
1ad80 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20  c(fd);.#else .  
1ad90 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66  rc = fdatasync(f
1ada0 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d);.#if OS_VXWOR
1adb0 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20  KS.  if( rc==-1 
1adc0 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55  && errno==ENOTSU
1add0 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73  P ){.    rc = fs
1ade0 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e  ync(fd);.  }.#en
1adf0 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
1ae00 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69  S */.#endif /* i
1ae10 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1ae20 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55  YNC elif HAVE_FU
1ae30 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66  LLFSYNC */..  if
1ae40 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  ( OS_VXWORKS && 
1ae50 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72  rc!= -1 ){.    r
1ae60 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  c = 0;.  }.  ret
1ae70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ae80 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73   Open a file des
1ae90 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64  criptor to the d
1aea0 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1aeb0 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61  ing file zFilena
1aec0 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  me..** If succes
1aed0 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65  sful, *pFd is se
1aee0 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  t to the opened 
1aef0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1af00 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
1af10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1af20 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1af30 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  , either SQLITE_
1af40 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49  NOMEM.** or SQLI
1af50 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72  TE_CANTOPEN is r
1af60 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64  eturned and *pFd
1af70 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e   is set to an un
1af80 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65  defined.** value
1af90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65  ..**.** The dire
1afa0 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
1afb0 69 70 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f  iptor is used fo
1afc0 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67  r only one thing
1afd0 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29   - to.** fsync()
1afe0 20 61 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20   a directory to 
1aff0 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65 20 63  make sure file c
1b000 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65  reation and dele
1b010 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61  tion events.** a
1b020 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69  re flushed to di
1b030 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e 63 73  sk.  Such fsyncs
1b040 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 20   are not needed 
1b050 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72  on newer.** jour
1b060 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73 74 65  naling filesyste
1b070 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65 71 75  ms, but are requ
1b080 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69  ired on older fi
1b090 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a  lesystems..**.**
1b0a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
1b0b0 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  n be overridden 
1b0c0 75 73 69 6e 67 20 74 68 65 20 78 53 65 74 53 79  using the xSetSy
1b0d0 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e  sCall interface.
1b0e0 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20  .** The ability 
1b0f0 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73  to override this
1b100 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61 64 64   routine was add
1b110 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20 6f 66  ed in support of
1b120 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d   the.** chromium
1b130 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69   sandbox.  Openi
1b140 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 69  ng a directory i
1b150 73 20 61 20 73 65 63 75 72 69 74 79 20 72 69 73  s a security ris
1b160 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c  k (we are.** tol
1b170 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20  d) so making it 
1b180 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61 6c 6c  overrideable all
1b190 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69 75 6d  ows the chromium
1b1a0 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72   sandbox to.** r
1b1b0 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f 75 74  eplace this rout
1b1c0 69 6e 65 20 77 69 74 68 20 61 20 68 61 72 6d 6c  ine with a harml
1b1d0 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d  ess no-op.  To m
1b1e0 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ake this routine
1b1f0 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70  .** a no-op, rep
1b200 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 20 73  lace it with a s
1b210 74 75 62 20 74 68 61 74 20 72 65 74 75 72 6e 73  tub that returns
1b220 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
1b230 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65  eaves.** *pFd se
1b240 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76 65 20  t to a negative 
1b250 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  number..**.** If
1b260 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1b270 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c  turned, the call
1b280 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
1b290 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a  e for closing.**
1b2a0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1b2b0 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20  ptor *pFd using 
1b2c0 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  close()..*/.stat
1b2d0 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63  ic int openDirec
1b2e0 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20  tory(const char 
1b2f0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20  *zFilename, int 
1b300 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b  *pFd){.  int ii;
1b310 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
1b320 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b    char zDirname[
1b330 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
1b340 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
1b350 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
1b360 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73  E, zDirname, "%s
1b370 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
1b380 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72   for(ii=(int)str
1b390 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69  len(zDirname); i
1b3a0 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b  i>1 && zDirname[
1b3b0 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b  ii]!='/'; ii--);
1b3c0 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20  .  if( ii>0 ){. 
1b3d0 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20     zDirname[ii] 
1b3e0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d  = '\0';.    fd =
1b3f0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69   robust_open(zDi
1b400 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
1b410 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
1b420 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20    if( fd>=0 ){. 
1b430 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f       OSTRACE(("O
1b440 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e  PENDIR %-3d %s\n
1b450 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29  ", fd, zDirname)
1b460 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
1b470 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75  pFd = fd;.  retu
1b480 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45  rn (fd>=0?SQLITE
1b490 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72 72 6f 72  _OK:unixLogError
1b4a0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
1b4b0 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
1b4c0 44 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a  Dirname));.}../*
1b4d0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  .** Make sure al
1b4e0 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61  l writes to a pa
1b4f0 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72  rticular file ar
1b500 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
1b510 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61  isk..**.** If da
1b520 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62  taOnly==0 then b
1b530 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73  oth the file its
1b540 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61  elf and its meta
1b550 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69  data (file.** si
1b560 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c  ze, access time,
1b570 20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64   etc) are synced
1b580 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d  .  If dataOnly!=
1b590 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a  0 then only the.
1b5a0 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20  ** file data is 
1b5b0 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e  synced..**.** Un
1b5c0 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d  der Unix, also m
1b5d0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1b5e0 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
1b5f0 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a  y for the file.*
1b600 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  * has been creat
1b610 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20  ed by fsync-ing 
1b620 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
1b630 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1b640 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64  file..** If we d
1b650 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e  o not do this an
1b660 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61  d we encounter a
1b670 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
1b680 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  the directory.**
1b690 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a   entry for the j
1b6a0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
1b6b0 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20   exist after we 
1b6c0 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78  reboot.  The nex
1b6d0 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61  t.** SQLite to a
1b6e0 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77  ccess the file w
1b6f0 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61  ill not know tha
1b700 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78  t the journal ex
1b710 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a  ists (because.**
1b720 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
1b730 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75  ntry for the jou
1b740 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63  rnal was never c
1b750 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20  reated) and the 
1b760 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77  transaction.** w
1b770 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63  ill not roll bac
1b780 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61  k - possibly lea
1b790 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  ding to database
1b7a0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
1b7b0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
1b7c0 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ync(sqlite3_file
1b7d0 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29   *id, int flags)
1b7e0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
1b7f0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1b800 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
1b810 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79    int isDataOnly
1b820 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45   = (flags&SQLITE
1b830 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b  _SYNC_DATAONLY);
1b840 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e  .  int isFullsyn
1b850 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29  c = (flags&0x0F)
1b860 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1b870 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  LL;..  /* Check 
1b880 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
1b890 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
1b8a0 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
1b8b0 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
1b8c0 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
1b8d0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
1b8e0 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
1b8f0 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1b900 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f  C_FULL.  );..  /
1b910 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62  * Unix cannot, b
1b920 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  ut some systems 
1b930 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
1b940 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65  E_FULL from here
1b950 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65  . This.  ** line
1b960 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74   is to test that
1b970 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e   doing so does n
1b980 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ot cause any pro
1b990 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69  blems..  */.  Si
1b9a0 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
1b9b0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
1b9c0 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73  TE_FULL );..  as
1b9d0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
1b9e0 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20   OSTRACE(("SYNC 
1b9f0 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c     %-3d\n", pFil
1ba00 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20 66  e->h));.  rc = f
1ba10 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d  ull_fsync(pFile-
1ba20 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20  >h, isFullsync, 
1ba30 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53  isDataOnly);.  S
1ba40 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1ba50 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
1ba60 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
1ba70 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1ba80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69  ;.    return uni
1ba90 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1baa0 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 66  _IOERR_FSYNC, "f
1bab0 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c  ull_fsync", pFil
1bac0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a  e->zPath);.  }..
1bad0 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63 20    /* Also fsync 
1bae0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
1baf0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6c  ntaining the fil
1bb00 65 20 69 66 20 74 68 65 20 44 49 52 53 59 4e 43  e if the DIRSYNC
1bb10 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65   flag.  ** is se
1bb20 74 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f 6e  t.  This is a on
1bb30 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 61 6e 63  e-time occurranc
1bb40 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d 73  e.  Many systems
1bb50 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58 29   (examples: AIX)
1bb60 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c 65  .  ** are unable
1bb70 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72 65   to fsync a dire
1bb80 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72 65  ctory, so ignore
1bb90 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20 66   errors on the f
1bba0 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sync..  */.  if(
1bbb0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1bbc0 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49 52  s & UNIXFILE_DIR
1bbd0 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74 20  SYNC ){.    int 
1bbe0 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52 41  dirfd;.    OSTRA
1bbf0 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 73 20  CE(("DIRSYNC %s 
1bc00 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d  (have_fullfsync=
1bc10 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c  %d fullsync=%d)\
1bc20 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  n", pFile->zPath
1bc30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41  ,.            HA
1bc40 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73  VE_FULLFSYNC, is
1bc50 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20 20  Fullsync));.    
1bc60 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63  rc = osOpenDirec
1bc70 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61 74  tory(pFile->zPat
1bc80 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20  h, &dirfd);.    
1bc90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bca0 4b 20 26 26 20 64 69 72 66 64 3e 3d 30 20 29 7b  K && dirfd>=0 ){
1bcb0 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e  .      full_fsyn
1bcc0 63 28 64 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a  c(dirfd, 0, 0);.
1bcd0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
1bce0 73 65 28 70 46 69 6c 65 2c 20 64 69 72 66 64 2c  se(pFile, dirfd,
1bcf0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
1bd00 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
1bd10 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
1bd20 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1bd30 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1bd40 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1bd50 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44  s &= ~UNIXFILE_D
1bd60 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 72 65  IRSYNC;.  }.  re
1bd70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1bd80 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
1bd90 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
1bda0 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
1bdb0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
1bdc0 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
1bdd0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
1bde0 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  te){.  unixFile 
1bdf0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1be00 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  le *)id;.  int r
1be10 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  c;.  assert( pFi
1be20 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
1be30 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1be40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1be50 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  NCATE );..  /* I
1be60 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
1be70 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
1be80 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
1be90 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
1bea0 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
1beb0 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
1bec0 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
1bed0 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
1bee0 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
1bef0 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
1bf00 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
1bf10 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
1bf20 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
1bf30 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
1bf40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1bf50 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
1bf60 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42      nByte = ((nB
1bf70 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43  yte + pFile->szC
1bf80 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d  hunk - 1)/pFile-
1bf90 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
1bfa0 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a  e->szChunk;.  }.
1bfb0 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  .  rc = robust_f
1bfc0 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e  truncate(pFile->
1bfd0 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29  h, (off_t)nByte)
1bfe0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1bff0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1c000 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1c010 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1c020 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1c030 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75  _TRUNCATE, "ftru
1c040 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  ncate", pFile->z
1c050 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
1c060 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1c070 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  BUG.    /* If we
1c080 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
1c090 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
1c0a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
1c0b0 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20   opposed to.    
1c0c0 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
1c0d0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1c0e0 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
1c0f0 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
1c100 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d  an a.    ** norm
1c110 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1c120 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74  ) and we truncat
1c130 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
1c140 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a  ro length,.    *
1c150 2a 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65  * that effective
1c160 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
1c170 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20  hange counter.  
1c180 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1c190 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65  n.    ** when re
1c1a0 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61  storing a databa
1c1b0 73 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63  se using the bac
1c1c0 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a  kup API from a z
1c1d0 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a  ero-length.    *
1c1e0 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f  * source..    */
1c1f0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
1c200 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26  inNormalWrite &&
1c210 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
1c220 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
1c230 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20  ntrChng = 1;.   
1c240 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72   }.#endif..    r
1c250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c260 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
1c270 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
1c280 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
1c290 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
1c2a0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
1c2b0 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
1c2c0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53  ile *id, i64 *pS
1c2d0 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
1c2e0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1c2f0 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  f;.  assert( id 
1c300 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61  );.  rc = osFsta
1c310 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  t(((unixFile*)id
1c320 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53  )->h, &buf);.  S
1c330 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1c340 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
1c350 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  !=0 ){.    ((uni
1c360 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
1c370 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1c380 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c390 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1c3a0 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66  }.  *pSize = buf
1c3b0 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  .st_size;..  /* 
1c3c0 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a  When opening a z
1c3d0 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73  ero-size databas
1c3e0 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65  e, the findInode
1c3f0 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65  Info() procedure
1c400 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73  .  ** writes a s
1c410 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20  ingle byte into 
1c420 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64  that file in ord
1c430 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  er to work aroun
1c440 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20  d a bug.  ** in 
1c450 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66  the OS-X msdos f
1c460 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f  ilesystem.  In o
1c470 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72  rder to avoid pr
1c480 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65  oblems with uppe
1c490 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77  r.  ** layers, w
1c4a0 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74  e need to report
1c4b0 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20   this file size 
1c4c0 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f  as zero even tho
1c4d0 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72  ugh it is.  ** r
1c4e0 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65  eally 1.   Ticke
1c4f0 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20  t #3260..  */.  
1c500 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20  if( *pSize==1 ) 
1c510 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20  *pSize = 0;...  
1c520 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c530 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
1c540 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1c550 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1c560 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a  __APPLE__)./*.**
1c570 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f   Handler for pro
1c580 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d  xy-locking file-
1c590 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20  control verbs.  
1c5a0 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e  Defined below in
1c5b0 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67   the.** proxying
1c5c0 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f   locking divisio
1c5d0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1c5e0 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
1c5f0 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  l(sqlite3_file*,
1c600 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64  int,void*);.#end
1c610 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  if../* .** This 
1c620 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1c630 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
1c640 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
1c650 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65  ZE_HINT .** file
1c660 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69  -control operati
1c670 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65  on.  Enlarge the
1c680 20 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42 79   database to nBy
1c690 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28  tes in size.** (
1c6a0 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68  rounded up to th
1c6b0 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a  e next chunk-siz
1c6c0 65 29 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  e).  If the data
1c6d0 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 0a  base is already.
1c6e0 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72  ** nBytes or lar
1c6f0 67 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ger, this routin
1c700 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
1c710 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74  .static int fcnt
1c720 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69  lSizeHint(unixFi
1c730 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e  le *pFile, i64 n
1c740 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69  Byte){.  if( pFi
1c750 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
1c760 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20  .    i64 nSize; 
1c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c780 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66     /* Required f
1c790 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
1c7a0 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
1c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c7c0 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65   Used to hold re
1c7d0 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66  turn values of f
1c7e0 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20  stat() */.   .  
1c7f0 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46    if( osFstat(pF
1c800 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 20  ile->h, &buf) ) 
1c810 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1c820 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20 20  ERR_FSTAT;..    
1c830 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b  nSize = ((nByte+
1c840 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31  pFile->szChunk-1
1c850 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) / pFile->szChu
1c860 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1c870 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53  hunk;.    if( nS
1c880 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f  ize>(i64)buf.st_
1c890 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66  size ){..#if def
1c8a0 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f  ined(HAVE_POSIX_
1c8b0 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41  FALLOCATE) && HA
1c8c0 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1c8d0 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  TE.      /* The 
1c8e0 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61  code below is ha
1c8f0 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72  ndling the retur
1c900 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c  n value of osFal
1c910 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20 20  locate() .      
1c920 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f  ** correctly. po
1c930 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20  six_fallocate() 
1c940 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72  is defined to "r
1c950 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73  eturns zero on s
1c960 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a  uccess, .      *
1c970 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75  * or an error nu
1c980 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65  mber on  failure
1c990 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61  ". See the manpa
1c9a0 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  ge for details. 
1c9b0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  */.      int err
1c9c0 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
1c9d0 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c      err = osFall
1c9e0 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ocate(pFile->h, 
1c9f0 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69  buf.st_size, nSi
1ca00 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b  ze-buf.st_size);
1ca10 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65  .      }while( e
1ca20 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  rr==EINTR );.   
1ca30 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65 74     if( err ) ret
1ca40 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1ca50 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20  _WRITE;.#else.  
1ca60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53      /* If the OS
1ca70 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70   does not have p
1ca80 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1ca90 2c 20 66 61 6b 65 20 69 74 2e 20 46 69 72 73 74  , fake it. First
1caa0 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 74   use.      ** ft
1cab0 72 75 6e 63 61 74 65 28 29 20 74 6f 20 73 65 74  runcate() to set
1cac0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20   the file size, 
1cad0 74 68 65 6e 20 77 72 69 74 65 20 61 20 73 69 6e  then write a sin
1cae0 67 6c 65 20 62 79 74 65 20 74 6f 0a 20 20 20 20  gle byte to.    
1caf0 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 62 79    ** the last by
1cb00 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b  te in each block
1cb10 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74 65   within the exte
1cb20 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 69  nded region. Thi
1cb30 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68  s.      ** is th
1cb40 65 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75 65  e same technique
1cb50 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20 74   used by glibc t
1cb60 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73 69  o implement posi
1cb70 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20 20  x_fallocate().  
1cb80 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65 6d      ** on system
1cb90 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61  s that do not ha
1cba0 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63  ve a real falloc
1cbb0 61 74 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ate() system cal
1cbc0 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
1cbd0 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66    int nBlk = buf
1cbe0 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a  .st_blksize;  /*
1cbf0 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f   File-system blo
1cc00 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ck size */.     
1cc10 20 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20   i64 iWrite;    
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cc30 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77  Next offset to w
1cc40 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20  rite to */..    
1cc50 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
1cc60 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
1cc70 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20   nSize) ){.     
1cc80 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1cc90 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1cca0 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
1ccb0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1ccc0 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1ccd0 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1cce0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
1ccf0 20 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74 65    }.      iWrite
1cd00 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65   = ((buf.st_size
1cd10 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e   + 2*nBlk - 1)/n
1cd20 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20  Blk)*nBlk-1;.   
1cd30 20 20 20 77 68 69 6c 65 28 20 69 57 72 69 74 65     while( iWrite
1cd40 3c 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  <nSize ){.      
1cd50 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 73    int nWrite = s
1cd60 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c  eekAndWrite(pFil
1cd70 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31  e, iWrite, "", 1
1cd80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1cd90 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72  Write!=1 ) retur
1cda0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1cdb0 52 49 54 45 3b 0a 20 20 20 20 20 20 20 20 69 57  RITE;.        iW
1cdc0 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20  rite += nBlk;.  
1cdd0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1cde0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1cdf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1ce00 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
1ce10 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67   inititially neg
1ce20 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20  ative then this 
1ce30 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74  is a query.  Set
1ce40 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f   *pArg to.** 1 o
1ce50 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 0 depending on
1ce60 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1ce70 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c  bit mask of pFil
1ce80 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20  e->ctrlFlags is 
1ce90 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  set..**.** If *p
1cea0 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74  Arg is 0 or 1, t
1ceb0 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74  hen clear or set
1cec0 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66   the mask bit of
1ced0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1cee0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1cef0 64 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e  d unixModeBit(un
1cf00 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  ixFile *pFile, u
1cf10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73  nsigned char mas
1cf20 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20  k, int *pArg){. 
1cf30 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a   if( *pArg<0 ){.
1cf40 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69      *pArg = (pFi
1cf50 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
1cf60 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  mask)!=0;.  }els
1cf70 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30  e if( (*pArg)==0
1cf80 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
1cf90 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73  trlFlags &= ~mas
1cfa0 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  k;.  }else{.    
1cfb0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1cfc0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a   |= mask;.  }.}.
1cfd0 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69  ./*.** Informati
1cfe0 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f  on and control o
1cff0 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68  f an open file h
1d000 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
1d010 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e   int unixFileCon
1d020 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
1d030 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
1d040 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e  oid *pArg){.  un
1d050 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1d060 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
1d070 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1d080 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1d090 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20  CNTL_LOCKSTATE: 
1d0a0 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1d0b0 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69  Arg = pFile->eFi
1d0c0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65  leLock;.      re
1d0d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d0e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1d0f0 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f  QLITE_LAST_ERRNO
1d100 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
1d110 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c  )pArg = pFile->l
1d120 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
1d130 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1d150 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
1d160 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
1d170 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b    pFile->szChunk
1d180 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
1d190 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1d1a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1d1b0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1d1c0 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
1d1d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
1d1e0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1d1f0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1d200 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c        rc = fcntl
1d210 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20  SizeHint(pFile, 
1d220 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20  *(i64 *)pArg);. 
1d230 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1d240 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
1d250 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1d260 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1d270 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
1d280 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20  IST_WAL: {.     
1d290 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69   unixModeBit(pFi
1d2a0 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52  le, UNIXFILE_PER
1d2b0 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29  SIST_WAL, (int*)
1d2c0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
1d2d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d2e0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1d2f0 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52  LITE_FCNTL_POWER
1d300 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20  SAFE_OVERWRITE: 
1d310 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65  {.      unixMode
1d320 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46  Bit(pFile, UNIXF
1d330 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29  ILE_PSOW, (int*)
1d340 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
1d350 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d360 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1d370 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
1d380 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68  ME: {.      *(ch
1d390 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  ar**)pArg = sqli
1d3a0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
1d3b0 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a  , pFile->pVfs->z
1d3c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
1d3d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d3e0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
1d3f0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
1d400 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20  The pager calls 
1d410 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73  this method to s
1d420 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61  ignal that it ha
1d430 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20  s done.    ** a 
1d440 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61  rollback and tha
1d450 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  t the database i
1d460 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68  s therefore unch
1d470 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a  anged and.    **
1d480 20 69 74 20 68 65 6e 63 65 20 69 74 20 69 73 20   it hence it is 
1d490 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73  OK for the trans
1d4a0 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f  action change co
1d4b0 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20  unter to be.    
1d4c0 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  ** unchanged..  
1d4d0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1d4e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1d4f0 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20  CHANGED: {.     
1d500 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1d510 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a  ->dbUpdate = 0;.
1d520 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d530 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65  ITE_OK;.    }.#e
1d540 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1d550 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d560 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1d570 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63  __APPLE__).    c
1d580 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  ase SQLITE_SET_L
1d590 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20  OCKPROXYFILE:.  
1d5a0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45    case SQLITE_GE
1d5b0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
1d5c0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
1d5d0 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
1d5e0 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20  (id,op,pArg);.  
1d5f0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1d600 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1d610 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1d620 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1d630 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
1d640 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
1d650 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1d660 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1d670 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
1d680 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
1d690 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
1d6a0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
1d6b0 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
1d6c0 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
1d6d0 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
1d6e0 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
1d6f0 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
1d700 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
1d710 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
1d720 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
1d730 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
1d740 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
1d750 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
1d760 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
1d770 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
1d780 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
1d790 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
1d7a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
1d7b0 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
1d7c0 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
1d7d0 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
1d7e0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e  .*/.#ifndef __QN
1d7f0 58 4e 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69  XNTO__ .static i
1d800 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
1d810 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1d820 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
1d830 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1d840 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
1d850 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1d860 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65  ECTOR_SIZE;.}.#e
1d870 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1d880 66 6f 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f  following versio
1d890 6e 20 6f 66 20 75 6e 69 78 53 65 63 74 6f 72 53  n of unixSectorS
1d8a0 69 7a 65 28 29 20 69 73 20 6f 70 74 69 6d 69 7a  ize() is optimiz
1d8b0 65 64 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23  ed for QNX..*/.#
1d8c0 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f  ifdef __QNXNTO__
1d8d0 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64  .#include <sys/d
1d8e0 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c  cmd_blk.h>.#incl
1d8f0 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73  ude <sys/statvfs
1d900 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .h>.static int u
1d910 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nixSectorSize(sq
1d920 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
1d930 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1d940 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1d950 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  id;.  if( pFile-
1d960 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30  >sectorSize == 0
1d970 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
1d980 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20  tatvfs fsInfo;. 
1d990 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65        .    /* Se
1d9a0 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e  t defaults for n
1d9b0 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c  on-supported fil
1d9c0 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20  esystems */.    
1d9d0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1d9e0 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
1d9f0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1da00 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1da10 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1da20 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73   = 0;.    if( fs
1da30 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c  tatvfs(pFile->h,
1da40 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
1da50 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ) {.      return
1da60 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1da70 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ze;.    }..    i
1da80 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66  f( !strcmp(fsInf
1da90 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74  o.f_basetype, "t
1daa0 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70  mp") ) {.      p
1dab0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1dac0 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
1dad0 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
1dae0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1daf0 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
1db00 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1db10 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a  MIC4K |       /*
1db20 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73   All ram filesys
1db30 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61  tem writes are a
1db40 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20  tomic */.       
1db50 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
1db60 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f  FE_APPEND |    /
1db70 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69  * growing the fi
1db80 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  le does not occu
1db90 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20  r until.        
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1dbc0 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65   the write succe
1dbd0 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  eds */.        S
1dbe0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1dbf0 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
1dc00 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
1dc10 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
1dc20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1dc50 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
1dc60 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
1dc70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1dc80 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  str(fsInfo.f_bas
1dc90 65 74 79 70 65 2c 20 22 65 74 66 73 22 29 20 29  etype, "etfs") )
1dca0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1dcb0 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
1dcc0 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
1dcd0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1dce0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1dcf0 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73  .        /* etfs
1dd00 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72   cluster size wr
1dd10 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ites are atomic 
1dd20 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c  */.        (pFil
1dd30 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20  e->sectorSize / 
1dd40 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43  512 * SQLITE_IOC
1dd50 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a  AP_ATOMIC512) |.
1dd60 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1dd70 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1dd80 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
1dd90 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
1dda0 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddd0 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
1dde0 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
1ddf0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1de00 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
1de10 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
1de20 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
1de30 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
1de40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de60 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
1de70 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
1de80 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
1de90 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
1dea0 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
1deb0 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20  qnx6") ){.      
1dec0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1ded0 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
1dee0 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
1def0 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1df00 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
1df10 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
1df20 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f  OMIC |         /
1df30 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d  * All filesystem
1df40 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d   writes are atom
1df50 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ic */.        SQ
1df60 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1df70 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
1df80 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
1df90 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
1dfa0 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
1dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfc0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
1dfd0 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
1dfe0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
1dff0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1e000 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
1e010 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1e020 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
1e030 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
1e040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e050 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
1e060 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
1e070 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1e080 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d  }else if( !strcm
1e090 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  p(fsInfo.f_baset
1e0a0 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a  ype, "qnx4") ){.
1e0b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
1e0c0 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
1e0d0 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
1e0e0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1e0f0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
1e100 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62         /* full b
1e110 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73  itset of atomics
1e120 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72   from max sector
1e130 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65   size and smalle
1e140 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70  r */.        ((p
1e150 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1e160 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f   / 512 * SQLITE_
1e170 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29  IOCAP_ATOMIC512)
1e180 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20   << 1) - 2 |.   
1e190 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1e1a0 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
1e1b0 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
1e1c0 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
1e1d0 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
1e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e200 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
1e210 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
1e220 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
1e230 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f  f( strstr(fsInfo
1e240 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f  .f_basetype, "do
1e250 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  s") ){.      pFi
1e260 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1e270 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
1e280 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1e290 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1e2a0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a  ics =.        /*
1e2b0 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20   full bitset of 
1e2c0 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78  atomics from max
1e2d0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64   sector size and
1e2e0 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20   smaller */.    
1e2f0 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63      ((pFile->sec
1e300 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20  torSize / 512 * 
1e310 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1e320 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20  MIC512) << 1) - 
1e330 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  2 |.        SQLI
1e340 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1e350 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
1e360 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1e370 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
1e380 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
1e3b0 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
1e3c0 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1e3d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
1e3e0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
1e3f0 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
1e400 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1e410 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20  _ATOMIC512 |    
1e420 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20    /* blocks are 
1e430 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
1e440 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
1e450 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
1e460 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
1e470 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
1e480 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
1e490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1e4b0 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
1e4c0 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
1e4d0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  0;.    }.  }.  /
1e4e0 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65  * Last chance ve
1e4f0 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20  rification.  If 
1e500 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
1e510 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65  isn't a multiple
1e520 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65   of 512.  ** the
1e530 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64  n it isn't valid
1e540 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  .*/.  if( pFile-
1e550 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31  >sectorSize % 51
1e560 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46  2 != 0 ){.    pF
1e570 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1e580 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a  cteristics = 0;.
1e590 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1e5a0 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  rSize = SQLITE_D
1e5b0 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
1e5c0 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
1e5d0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1e5e0 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ze;.}.#endif /* 
1e5f0 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f  __QNXNTO__ */../
1e600 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1e610 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
1e620 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66  istics for the f
1e630 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
1e640 56 46 53 20 69 73 20 73 65 74 20 75 70 20 74 6f  VFS is set up to
1e650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1e660 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1e670 56 45 52 57 52 49 54 45 20 62 79 20 64 65 66 61  VERWRITE by defa
1e680 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ult..** However,
1e690 20 74 68 61 74 20 63 68 6f 69 63 65 20 69 73 20   that choice is 
1e6a0 63 6f 6e 74 72 61 76 65 72 73 69 61 6c 20 73 69  contraversial si
1e6b0 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20  nce technically 
1e6c0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
1e6d0 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f  * file system do
1e6e0 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72  es not always pr
1e6f0 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66 65 20  ovide powersafe 
1e700 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e  overwrites.  (In
1e710 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
1e720 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c   after a power-l
1e730 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73  oss event, parts
1e740 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68 61   of the file tha
1e750 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20  t were never.** 
1e760 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e  written might en
1e770 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72  d up being alter
1e780 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e  ed.)  However, n
1e790 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72  on-PSOW behavior
1e7a0 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72   is very,.** ver
1e7b0 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73  y rare.  And ass
1e7c0 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65  erting PSOW make
1e7d0 73 20 61 20 6c 61 72 67 65 20 72 65 64 75 63 74  s a large reduct
1e7e0 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e  ion in the amoun
1e7f0 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64  t.** of required
1e800 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c   I/O for journal
1e810 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74  ing, since a lot
1e820 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 65   of padding is e
1e830 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48  liminated..**  H
1e840 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45  ence, while POWE
1e850 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
1e860 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
1e870 2c 20 74 68 65 72 65 20 69 73 20 61 20 66 69 6c  , there is a fil
1e880 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61  e-control.** ava
1e890 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69  ilable to turn i
1e8a0 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75  t off and URI qu
1e8b0 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 61 76  ery parameter av
1e8c0 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20  ailable to turn 
1e8d0 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  it off..*/.stati
1e8e0 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65  c int unixDevice
1e8f0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1e900 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1e910 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1e920 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1e930 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
1e940 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f  #ifdef __QNXNTO_
1e950 5f 0a 20 20 69 66 28 20 70 2d 3e 73 65 63 74 6f  _.  if( p->secto
1e960 72 53 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53  rSize==0 ) unixS
1e970 65 63 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20  ectorSize(id);. 
1e980 20 72 63 20 3d 20 70 2d 3e 64 65 76 69 63 65 43   rc = p->deviceC
1e990 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a  haracteristics;.
1e9a0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
1e9b0 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
1e9c0 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20  FILE_PSOW ){.   
1e9d0 20 72 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f   rc |= SQLITE_IO
1e9e0 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1e9f0 45 52 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72  ERWRITE;.  }.  r
1ea00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1ea10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ea20 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  _WAL.../*.** Obj
1ea30 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
1ea40 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
1ea50 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
1ea60 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
1ea70 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
1ea80 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
1ea90 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
1eaa0 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
1eab0 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
1eac0 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
1ead0 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
1eae0 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
1eaf0 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
1eb00 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
1eb10 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1eb20 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
1eb30 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
1eb40 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
1eb50 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
1eb60 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1eb70 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
1eb80 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
1eb90 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
1eba0 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
1ebb0 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
1ebc0 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
1ebd0 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
1ebe0 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
1ebf0 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
1ec00 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
1ec10 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
1ec20 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
1ec30 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
1ec40 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
1ec50 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
1ec60 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
1ec70 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
1ec80 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
1ec90 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
1eca0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
1ecb0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1ecc0 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
1ecd0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1ece0 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
1ecf0 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
1ed00 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
1ed10 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
1ed20 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
1ed30 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
1ed40 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
1ed50 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
1ed60 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
1ed70 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
1ed80 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
1ed90 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1eda0 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
1edb0 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
1edc0 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
1edd0 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
1ede0 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
1edf0 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
1ee00 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
1ee10 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
1ee20 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
1ee30 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
1ee40 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
1ee50 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
1ee60 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1ee70 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
1ee80 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
1ee90 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
1eea0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20   unixShmNode {. 
1eeb0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
1eec0 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75  pInode;     /* u
1eed0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61  nixInodeInfo tha
1eee0 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20  t owns this SHM 
1eef0 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
1ef00 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
1ef10 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
1ef20 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
1ef30 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
1ef40 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
1ef50 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1ef60 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  he mmapped file 
1ef70 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
1ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef90 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
1efa0 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
1efb0 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
1efc0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1efd0 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
1efe0 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31   regions */.  u1
1eff0 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  6 nRegion;      
1f000 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1f010 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
1f020 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61  on */.  u8 isRea
1f030 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  donly;          
1f040 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
1f050 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61  ad-only */.  cha
1f060 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
1f070 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
1f080 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
1f090 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
1f0a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
1f0d0 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
1f0e0 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
1f0f0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
1f100 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
1f110 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
1f120 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
1f130 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
1f140 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1f150 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
1f160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1f170 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
1f180 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
1f190 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
1f1a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1f1b0 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
1f1c0 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
1f1d0 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
1f1e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1f1f0 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
1f200 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
1f210 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
1f220 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
1f230 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
1f240 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
1f250 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
1f260 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
1f270 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
1f280 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
1f290 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
1f2a0 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
1f2b0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
1f2c0 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
1f2d0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
1f2e0 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
1f2f0 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a    unixShm.pFile.
1f300 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64  **    unixShm.id
1f310 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
1f320 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
1f330 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69  /write.  The uni
1f340 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65  xShm.pFile->mute
1f350 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
1f360 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
1f370 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
1f380 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
1f390 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75  ct unixShm {.  u
1f3a0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
1f3b0 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  Node;     /* The
1f3c0 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78   underlying unix
1f3d0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
1f3e0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65  /.  unixShm *pNe
1f3f0 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  xt;            /
1f400 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77  * Next unixShm w
1f410 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69  ith the same uni
1f420 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  xShmNode */.  u8
1f430 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
1f440 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1f450 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
1f460 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65  unixShmNode mute
1f470 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20  x */.  u8 id;   
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f490 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
1f4a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69  connection withi
1f4b0 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64  n its unixShmNod
1f4c0 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  e */.  u16 share
1f4d0 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
1f4e0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
1f4f0 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
1f500 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
1f510 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1f520 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
1f530 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
1f540 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  /.};../*.** Cons
1f550 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
1f560 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
1f570 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20  e UNIX_SHM_BASE 
1f580 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
1f590 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
1f5a0 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
1f5b0 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
1f5c0 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20  e UNIX_SHM_DMS  
1f5d0 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45    (UNIX_SHM_BASE
1f5e0 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
1f5f0 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
1f600 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
1f610 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69  Apply posix advi
1f620 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
1f630 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66  ll bytes from of
1f640 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b  st through ofst+
1f650 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73  n-1..**.** Locks
1f660 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61   block if the ma
1f670 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e  sk is exactly UN
1f680 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65  IX_SHM_C and are
1f690 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a   non-blocking.**
1f6a0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1f6b0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
1f6c0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75  mSystemLock(.  u
1f6d0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
1f6e0 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20 6c  Node, /* Apply l
1f6f0 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
1f700 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
1f710 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
1f720 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
1f730 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20      /* F_UNLCK, 
1f740 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52  F_RDLCK, or F_WR
1f750 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
1f760 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1f770 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
1f780 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
1f790 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20  ge */.  int n   
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f7b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1f7c0 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  s to lock */.){.
1f7d0 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66    struct flock f
1f7e0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
1f7f0 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
1f800 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
1f810 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1f820 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65  LITE_OK;   /* Re
1f830 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66  sult code form f
1f840 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  cntl() */..  /* 
1f850 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e  Access to the un
1f860 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
1f870 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
1f880 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
1f890 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f8a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68  3_mutex_held(pSh
1f8b0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c  mNode->mutex) ||
1f8c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
1f8d0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72  =0 );..  /* Shar
1f8e0 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73  ed locks never s
1f8f0 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  pan more than on
1f900 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65  e byte */.  asse
1f910 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b  rt( n==1 || lock
1f920 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b  Type!=F_RDLCK );
1f930 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65  ..  /* Locks are
1f940 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f   within range */
1f950 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
1f960 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f  && n<SQLITE_SHM_
1f970 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20  NLOCK );..  if( 
1f980 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
1f990 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
1f9a0 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ize the locking 
1f9b0 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
1f9c0 20 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20    memset(&f, 0, 
1f9d0 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20 20  sizeof(f));.    
1f9e0 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54  f.l_type = lockT
1f9f0 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65  ype;.    f.l_whe
1fa00 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
1fa10 20 20 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20      f.l_start = 
1fa20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65  ofst;.    f.l_le
1fa30 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d  n = n;..    rc =
1fa40 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64   osFcntl(pShmNod
1fa50 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
1fa60 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63  f);.    rc = (rc
1fa70 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45  !=(-1)) ? SQLITE
1fa80 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  _OK : SQLITE_BUS
1fa90 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  Y;.  }..  /* Upd
1faa0 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  ate the global l
1fab0 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f  ock state and do
1fac0 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a   debug tracing *
1fad0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1fae0 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61  DEBUG.  { u16 ma
1faf0 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  sk;.  OSTRACE(("
1fb00 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20  SHM-LOCK "));.  
1fb10 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74  mask = (1<<(ofst
1fb20 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29  +n)) - (1<<ofst)
1fb30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1fb40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1fb50 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c   lockType==F_UNL
1fb60 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
1fb70 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20  ACE(("unlock %d 
1fb80 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
1fb90 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
1fba0 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
1fbb0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1fbc0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
1fbd0 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ask;.    }else i
1fbe0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52  f( lockType==F_R
1fbf0 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
1fc00 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
1fc10 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
1fc20 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1fc30 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
1fc40 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
1fc50 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
1fc60 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c  |= mask;.    }el
1fc70 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1fc80 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52  ( lockType==F_WR
1fc90 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54  LCK );.      OST
1fca0 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63  RACE(("write-loc
1fcb0 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
1fcc0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1fcd0 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61  ->exclMask |= ma
1fce0 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  sk;.      pShmNo
1fcf0 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  de->sharedMask &
1fd00 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  = ~mask;.    }. 
1fd10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
1fd20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43  lockType==F_UNLC
1fd30 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
1fd40 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66  CE(("unlock %d f
1fd50 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
1fd60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
1fd70 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
1fd80 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
1fd90 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69  (("read-lock fai
1fda0 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73  led"));.    }els
1fdb0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1fdc0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c   lockType==F_WRL
1fdd0 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  CK );.      OSTR
1fde0 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b  ACE(("write-lock
1fdf0 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73   %d failed", ofs
1fe00 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t));.    }.  }. 
1fe10 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61 66   OSTRACE((" - af
1fe20 74 65 72 77 61 72 64 73 20 25 30 33 78 2c 25 30  terwards %03x,%0
1fe30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3x\n",.         
1fe40 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
1fe50 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65  edMask, pShmNode
1fe60 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
1fe70 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
1fe80 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d  rn rc;        .}
1fe90 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74  .../*.** Purge t
1fea0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69  he unixShmNodeLi
1feb0 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
1fec0 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e 69 78  ntries with unix
1fed0 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
1fee0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
1fef0 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
1ff00 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
1ff10 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
1ff20 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
1ff30 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
1ff40 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
1ff50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
1ff60 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78  nixShmPurge(unix
1ff70 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e  File *pFd){.  un
1ff80 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70  ixShmNode *p = p
1ff90 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
1ffa0 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
1ffb0 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
1ffc0 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
1ffd0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1ffe0 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72  int i;.    asser
1fff0 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46  t( p->pInode==pF
20000 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  d->pInode );.   
20010 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
20020 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20  ree(p->mutex);. 
20030 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
20040 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a  >nRegion; i++){.
20050 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d        if( p->h>=
20060 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 75 6e  0 ){.        mun
20070 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  map(p->apRegion[
20080 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29  i], p->szRegion)
20090 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
200a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
200b0 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  ree(p->apRegion[
200c0 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
200d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
200e0 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29  ree(p->apRegion)
200f0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d  ;.    if( p->h>=
20100 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73  0 ){.      robus
20110 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e  t_close(pFd, p->
20120 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
20130 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20      p->h = -1;. 
20140 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f     }.    p->pIno
20150 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30  de->pShmNode = 0
20160 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
20170 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
20180 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65  .** Open a share
20190 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
201a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f 70  sociated with op
201b0 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
201c0 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69   pDbFd.  .** Thi
201d0 73 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70  s particular imp
201e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
201f0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a   mmapped files..
20200 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75  **.** The file u
20210 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
20220 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69   shared-memory i
20230 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  s in the same di
20240 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68  rectory.** as th
20250 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
20260 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65  file and has the
20270 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
20280 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a  e open database.
20290 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  ** file with the
202a0 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61   "-shm" suffix a
202b0 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70  dded.  For examp
202c0 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  le, if the datab
202d0 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22  ase file.** is "
202e0 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
202f0 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20  ig.db" then the 
20300 66 69 6c 65 20 74 68 61 74 20 69 73 20 63 72 65  file that is cre
20310 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64  ated and mmapped
20320 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d  .** for shared m
20330 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61  emory will be ca
20340 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72  lled "/home/user
20350 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22  1/config.db-shm"
20360 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65  .  .**.** Anothe
20370 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73  r approach to is
20380 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e   to use files in
20390 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65   /dev/shm or /de
203a0 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73  v/tmp or an.** s
203b0 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20  ome other tmpfs 
203c0 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20  mount. But if a 
203d0 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72  file in a differ
203e0 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  ent directory.**
203f0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
20400 73 65 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c  se file is used,
20410 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20   then differing 
20420 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
20430 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f  ns.** or a chroo
20440 74 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20  t() might cause 
20450 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72  two different pr
20460 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73  ocesses on the s
20470 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ame.** database 
20480 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20  to end up using 
20490 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20  different files 
204a0 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  for shared memor
204b0 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20  y - .** meaning 
204c0 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72  that their memor
204d0 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c  y would not real
204e0 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 72  ly be shared - r
204f0 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64  esulting.** in d
20500 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
20510 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  on.  Nevertheles
20520 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66 69  s, this tmpfs fi
20530 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20  le usage.** can 
20540 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  be enabled at co
20550 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67  mpile-time using
20560 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49   -DSQLITE_SHM_DI
20570 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68  RECTORY="/dev/sh
20580 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75  m".** or the equ
20590 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73  ivalent.  The us
205a0 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
205b0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f  SHM_DIRECTORY co
205c0 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70  mpile-time.** op
205d0 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20  tion results in 
205e0 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
205f0 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b  build of SQLite;
20600 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69    builds of SQLi
20610 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20  te.** that with 
20620 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45  differing SQLITE
20630 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73  _SHM_DIRECTORY s
20640 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20  ettings attempt 
20650 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61  to use the.** sa
20660 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
20670 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
20680 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  e, database corr
20690 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65  uption will like
206a0 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68  ly.** result. Th
206b0 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
206c0 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
206d0 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f  ime option is co
206e0 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73  nsidered.** "uns
206f0 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61  upported" and ma
20700 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66  y go away in a f
20710 75 74 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c  uture SQLite rel
20720 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ease..**.** When
20730 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
20740 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
20750 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
20760 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
20770 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
20780 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
20790 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
207a0 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
207b0 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
207c0 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
207d0 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
207e0 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
207f0 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
20800 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
20810 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
20820 20 66 69 6c 65 20 28 70 44 62 46 64 29 20 69 73   file (pDbFd) is
20830 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78   using the "unix
20840 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68  -excl" VFS.** th
20850 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e  at means that an
20860 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
20870 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
20880 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
20890 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  .** that no othe
208a0 72 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 20  r processes are 
208b0 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20  able to read or 
208c0 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61  write the databa
208d0 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20  se.  In.** that 
208e0 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20  case, we do not 
208f0 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72  really need shar
20900 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73  ed memory.  No s
20910 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20  hared memory.** 
20920 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e  file is created.
20930 20 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d    The shared mem
20940 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75  ory will be simu
20950 6c 61 74 65 64 20 77 69 74 68 20 68 65 61 70 20  lated with heap 
20960 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
20970 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68  c int unixOpenSh
20980 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46  aredMemory(unixF
20990 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
209a0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70  truct unixShm *p
209b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
209c0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
209d0 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
209e0 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  .  struct unixSh
209f0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
20a00 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
20a10 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c  ying mmapped fil
20a20 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
20a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a40 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
20a50 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49   code */.  unixI
20a60 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
20a70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
20a80 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f  e inode of fd */
20a90 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c  .  char *zShmFil
20aa0 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
20ab0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
20ac0 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
20ad0 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68  SHM */.  int nSh
20ae0 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  mFilename;      
20af0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
20b00 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65   of the SHM file
20b10 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  name in bytes */
20b20 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
20b30 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
20b40 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  w unixShm object
20b50 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74  . */.  p = sqlit
20b60 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
20b70 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
20b80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
20b90 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
20ba0 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
20bb0 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74 28  (*p));.  assert(
20bc0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
20bd0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
20be0 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69 78 53  o see if a unixS
20bf0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c  hmNode object al
20c00 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 52 65  ready exists. Re
20c10 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
20c20 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65 73    ** one if pres
20c30 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e 65  ent. Create a ne
20c40 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
20c50 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ry..  */.  unixE
20c60 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
20c70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
20c80 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64  Inode;.  pShmNod
20c90 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  e = pInode->pShm
20ca0 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d  Node;.  if( pShm
20cb0 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Node==0 ){.    s
20cc0 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
20cd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20ce0 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e 66    /* fstat() inf
20cf0 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66  o for database f
20d00 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43  ile */..    /* C
20d10 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66  all fstat() to f
20d20 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65  igure out the pe
20d30 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
20d40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
20d50 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20  If.    ** a new 
20d60 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72  *-shm file is cr
20d70 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70  eated, an attemp
20d80 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  t will be made t
20d90 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20  o create it.    
20da0 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ** with the same
20db0 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20   permissions..  
20dc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46    */.    if( osF
20dd0 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26  stat(pDbFd->h, &
20de0 73 53 74 61 74 29 20 26 26 20 70 49 6e 6f 64 65  sStat) && pInode
20df0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
20e00 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
20e10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
20e20 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  AT;.      goto s
20e30 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
20e40 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
20e50 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
20e60 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65      nShmFilename
20e70 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45   = sizeof(SQLITE
20e80 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20  _SHM_DIRECTORY) 
20e90 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20  + 31;.#else.    
20ea0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36  nShmFilename = 6
20eb0 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70   + (int)strlen(p
20ec0 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65  DbFd->zPath);.#e
20ed0 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
20ee0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
20ef0 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  oc( sizeof(*pShm
20f00 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65  Node) + nShmFile
20f10 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20  name );.    if( 
20f20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20  pShmNode==0 ){. 
20f30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
20f40 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
20f50 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
20f60 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
20f70 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73  t(pShmNode, 0, s
20f80 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
20f90 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a  +nShmFilename);.
20fa0 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65      zShmFilename
20fb0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
20fc0 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
20fd0 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69  &pShmNode[1];.#i
20fe0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
20ff0 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71  DIRECTORY.    sq
21000 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
21010 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
21020 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20  mFilename, .    
21030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21040 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
21050 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73  CTORY "/sqlite-s
21060 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20  hm-%x-%x",.     
21070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21080 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e  (u32)sStat.st_in
21090 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74  o, (u32)sStat.st
210a0 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20  _dev);.#else.   
210b0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
210c0 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  f(nShmFilename, 
210d0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25  zShmFilename, "%
210e0 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  s-shm", pDbFd->z
210f0 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
21100 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44  e3FileSuffix3(pD
21110 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d  bFd->zPath, zShm
21120 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69  Filename);.#endi
21130 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  f.    pShmNode->
21140 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46  h = -1;.    pDbF
21150 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
21160 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
21170 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49      pShmNode->pI
21180 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49  node = pDbFd->pI
21190 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  node;.    pShmNo
211a0 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  de->mutex = sqli
211b0 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
211c0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
211d0 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
211e0 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  Node->mutex==0 )
211f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
21200 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
21210 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
21220 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rr;.    }..    i
21230 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
21240 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
21250 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67      int openFlag
21260 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
21270 52 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28 20  REAT;.      if( 
21280 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
21290 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ean(pDbFd->zPath
212a0 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22  , "readonly_shm"
212b0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
212c0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
212d0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70 53  ONLY;.        pS
212e0 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
212f0 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ly = 1;.      }.
21300 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21310 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  h = robust_open(
21320 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70  zShmFilename, op
21330 65 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74 2e  enFlags, (sStat.
21340 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a  st_mode&0777));.
21350 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
21360 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20  de->h<0 ){.     
21370 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
21380 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
21390 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
213a0 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  ", zShmFilename)
213b0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
213c0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
213d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
213e0 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  f this process i
213f0 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f  s running as roo
21400 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  t, make sure tha
21410 74 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a 20  t the SHM file. 
21420 20 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64       ** is owned
21430 20 62 79 20 74 68 65 20 73 61 6d 65 20 75 73 65   by the same use
21440 72 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65 20  r that owns the 
21450 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
21460 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  e.  Otherwise,. 
21470 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
21480 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20  inal owner will 
21490 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 63  not be able to c
214a0 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f  onnect..      */
214b0 0a 20 20 20 20 20 20 6f 73 46 63 68 6f 77 6e 28  .      osFchown(
214c0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74  pShmNode->h, sSt
214d0 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74 61 74  at.st_uid, sStat
214e0 2e 73 74 5f 67 69 64 29 3b 0a 20 20 0a 20 20 20  .st_gid);.  .   
214f0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
21500 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72  ee if another pr
21510 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
21520 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77   the dead-man sw
21530 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49  itch..      ** I
21540 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
21550 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
21560 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 20 20   length. .      
21570 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
21580 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
21590 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d  f( unixShmSystem
215a0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
215b0 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _WRLCK, UNIX_SHM
215c0 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
215d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
215e0 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
215f0 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ate(pShmNode->h,
21600 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
21610 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
21620 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
21630 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63  SHMOPEN, "ftrunc
21640 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  ate", zShmFilena
21650 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
21660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
21670 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21680 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
21690 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
216a0 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c  (pShmNode, F_RDL
216b0 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  CK, UNIX_SHM_DMS
216c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
216d0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
216e0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
216f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
21700 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e  Make the new con
21710 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20  nection a child 
21720 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  of the unixShmNo
21730 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e  de */.  p->pShmN
21740 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
21750 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
21760 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53  BUG.  p->id = pS
21770 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49  hmNode->nextShmI
21780 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53  d++;.#endif.  pS
21790 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  hmNode->nRef++;.
217a0 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
217b0 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  p;.  unixLeaveMu
217c0 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  tex();..  /* The
217d0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
217e0 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73   on pShmNode has
217f0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
21800 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a  cremented under.
21810 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f    ** the cover o
21820 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  f the unixEnterM
21830 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64  utex() mutex and
21840 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f   the pointer fro
21850 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28  m the.  ** new (
21860 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20  struct unixShm) 
21870 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53  object to the pS
21880 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20  hmNode has been 
21890 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73  set. All that is
218a0 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f  .  ** left to do
218b0 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20   is to link the 
218c0 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  new object into 
218d0 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
218e0 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74  starting.  ** at
218f0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
21900 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20  t. This must be 
21910 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69  done while holdi
21920 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d  ng the pShmNode-
21930 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74  >mutex .  ** mut
21940 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ex..  */.  sqlit
21950 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
21960 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
21970 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53  .  p->pNext = pS
21980 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a  hmNode->pFirst;.
21990 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72    pShmNode->pFir
219a0 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65  st = p;.  sqlite
219b0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
219c0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
219d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
219e0 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
219f0 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72  ere on any error
21a00 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72   */.shm_open_err
21a10 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65  :.  unixShmPurge
21a20 28 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f  (pDbFd);       /
21a30 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65  * This call free
21a40 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65  s pShmNode if re
21a50 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69  quired */.  sqli
21a60 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75  te3_free(p);.  u
21a70 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
21a80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21a90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
21aa0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
21ab0 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74  o obtain a point
21ac0 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65  er to region iRe
21ad0 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  gion of the .** 
21ae0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73  shared-memory as
21af0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
21b00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
21b10 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72  fd. Shared-memor
21b20 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72  y regions .** ar
21b30 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74  e numbered start
21b40 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45  ing from zero. E
21b50 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ach shared-memor
21b60 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65  y region is szRe
21b70 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69  gion .** bytes i
21b80 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  n size..**.** If
21b90 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
21ba0 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
21bb0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
21bc0 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
21bd0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  LL..**.** Otherw
21be0 69 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74  ise, if the bExt
21bf0 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  end parameter is
21c00 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65   0 and the reque
21c10 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
21c20 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73  ry.** region has
21c30 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
21c40 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65  ted (by any clie
21c50 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e  nt, including on
21c60 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a  e running in a.*
21c70 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
21c80 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73  ss), then *pp is
21c90 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
21ca0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
21cb0 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74  ned. If .** bExt
21cc0 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  end is non-zero 
21cd0 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
21ce0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
21cf0 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  region has not y
21d00 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  et .** been allo
21d10 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c  cated, it is all
21d20 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
21d30 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
21d40 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
21d50 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61  ory region has a
21d60 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
21d70 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f  cated or is allo
21d80 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  cated by.** this
21d90 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62   call as describ
21da0 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69  ed above, then i
21db0 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f  t is mapped into
21dc0 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
21dd0 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63  .** address spac
21de0 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
21df0 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73  already), *pp is
21e00 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
21e10 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20   the mapped .** 
21e20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
21e30 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
21e40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
21e50 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  xShmMap(.  sqlit
21e60 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
21e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
21e80 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
21e90 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
21ea0 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ec0 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
21ed0 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
21ee0 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
21ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
21f00 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
21f10 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20  .  int bExtend, 
21f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f30 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
21f40 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
21f50 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
21f60 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
21f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
21f80 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
21f90 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  y */.){.  unixFi
21fa0 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69  le *pDbFd = (uni
21fb0 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69  xFile*)fd;.  uni
21fc0 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53  xShm *p;.  unixS
21fd0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
21fe0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
21ff0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
22000 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
22010 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  ry file has not 
22020 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
22030 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f   open it now. */
22040 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53  .  if( pDbFd->pS
22050 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  hm==0 ){.    rc 
22060 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64  = unixOpenShared
22070 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20  Memory(pDbFd);. 
22080 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22090 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
220a0 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62  ;.  }..  p = pDb
220b0 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d  Fd->pShm;.  pShm
220c0 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
220d0 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  de;.  sqlite3_mu
220e0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
220f0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
22100 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
22110 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
22120 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
22130 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  nRegion==0 );.  
22140 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
22150 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
22160 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73  >pInode );.  ass
22170 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
22180 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
22190 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
221a0 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
221b0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
221c0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
221d0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
221e0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  =0 );..  if( pSh
221f0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
22200 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63  iRegion ){.    c
22210 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20  har **apNew;    
22220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22230 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f    /* New apRegio
22240 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
22250 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
22260 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
22270 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
22280 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
22290 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
222a0 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
222b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
222c0 73 65 64 20 62 79 20 66 73 74 61 74 28 29 20 2a  sed by fstat() *
222d0 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  /..    pShmNode-
222e0 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65  >szRegion = szRe
222f0 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70  gion;..    if( p
22300 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b  ShmNode->h>=0 ){
22310 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65  .      /* The re
22320 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69  quested region i
22330 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74  s not mapped int
22340 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
22350 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a   address space..
22360 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74        ** Check t
22370 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20  o see if it has 
22380 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
22390 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d  i.e. if the wal-
223a0 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20  index file is.  
223b0 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f      ** large eno
223c0 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ugh to contain t
223d0 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
223e0 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ion)..      */. 
223f0 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74       if( osFstat
22400 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73  (pShmNode->h, &s
22410 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Stat) ){.       
22420 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
22430 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20  RR_SHMSIZE;.    
22440 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
22450 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
22460 0a 20 20 20 20 20 20 69 66 28 20 73 53 74 61 74  .      if( sStat
22470 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29  .st_size<nByte )
22480 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
22490 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
224a0 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f  y region does no
224b0 74 20 65 78 69 73 74 2e 20 49 66 20 62 45 78 74  t exist. If bExt
224c0 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20 20  end is set to.  
224d0 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20        ** false, 
224e0 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
224f0 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
22500 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
22510 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
22520 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
22530 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c  * Alternatively,
22540 20 69 66 20 62 45 78 74 65 6e 64 20 69 73 20 74   if bExtend is t
22550 72 75 65 2c 20 75 73 65 20 66 74 72 75 6e 63 61  rue, use ftrunca
22560 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65  te() to allocate
22570 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
22580 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
22590 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 20   region..       
225a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
225b0 21 62 45 78 74 65 6e 64 20 29 20 67 6f 74 6f 20  !bExtend ) goto 
225c0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
225d0 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f       if( robust_
225e0 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f  ftruncate(pShmNo
225f0 64 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b  de->h, nByte) ){
22600 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
22610 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
22620 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
22630 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 0a  E, "ftruncate",.
22640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22650 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
22660 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
22670 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
22680 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
22690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
226a0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
226b0 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  p the requested 
226c0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e  memory region in
226d0 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
226e0 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
226f0 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20   */.    apNew = 
22700 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33  (char **)sqlite3
22710 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  _realloc(.      
22720 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
22730 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31  gion, (iRegion+1
22740 29 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29  )*sizeof(char *)
22750 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
22760 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !apNew ){.      
22770 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
22780 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  R_NOMEM;.      g
22790 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
227a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
227b0 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20  ode->apRegion = 
227c0 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65  apNew;.    while
227d0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  (pShmNode->nRegi
227e0 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a 20 20  on<=iRegion){.  
227f0 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a      void *pMem;.
22800 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
22810 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  de->h>=0 ){.    
22820 20 20 20 20 70 4d 65 6d 20 3d 20 6d 6d 61 70 28      pMem = mmap(
22830 30 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a 20 20 20  0, szRegion,.   
22840 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
22850 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20  e->isReadonly ? 
22860 50 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54  PROT_READ : PROT
22870 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45  _READ|PROT_WRITE
22880 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d  , .            M
22890 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e  AP_SHARED, pShmN
228a0 6f 64 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e  ode->h, szRegion
228b0 2a 28 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e  *(i64)pShmNode->
228c0 6e 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20  nRegion.        
228d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
228e0 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20  Mem==MAP_FAILED 
228f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
22900 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
22910 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
22920 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d  AP, "mmap", pShm
22930 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
22940 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
22950 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
22960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
22970 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  lse{.        pMe
22980 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  m = sqlite3_mall
22990 6f 63 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  oc(szRegion);.  
229a0 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d        if( pMem==
229b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
229c0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
229d0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
229e0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
229f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22a00 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20  memset(pMem, 0, 
22a10 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
22a20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64   }.      pShmNod
22a30 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d  e->apRegion[pShm
22a40 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d  Node->nRegion] =
22a50 20 70 4d 65 6d 3b 0a 20 20 20 20 20 20 70 53 68   pMem;.      pSh
22a60 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b  mNode->nRegion++
22a70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d  ;.    }.  }..shm
22a80 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
22a90 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
22aa0 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  n>iRegion ){.   
22ab0 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d   *pp = pShmNode-
22ac0 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f  >apRegion[iRegio
22ad0 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n];.  }else{.   
22ae0 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
22af0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73  if( pShmNode->is
22b00 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d  Readonly && rc==
22b10 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
22b20 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
22b30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
22b40 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
22b50 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
22b60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22b70 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20  Change the lock 
22b80 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72  state for a shar
22b90 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
22ba0 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  t..**.** Note th
22bb0 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73  at the relations
22bc0 68 69 70 20 62 65 74 77 65 65 6e 20 53 48 41 52  hip between SHAR
22bd0 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45  Ed and EXCLUSIVE
22be0 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74   locks is a litt
22bf0 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  le.** different 
22c00 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73  here than in pos
22c10 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b  ix.  In xShmLock
22c20 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66  (), one can go f
22c30 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20  rom unlocked.** 
22c40 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62 61  to shared and ba
22c50 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63  ck or from unloc
22c60 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ked to exclusive
22c70 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20   and back.  But 
22c80 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67  one may.** not g
22c90 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f  o from shared to
22ca0 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72   exclusive or fr
22cb0 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20  om exclusive to 
22cc0 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  shared..*/.stati
22cd0 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63  c int unixShmLoc
22ce0 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
22cf0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
22d00 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
22d10 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
22d20 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
22d30 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
22d40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
22d50 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
22d60 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
22d70 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22d90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
22da0 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
22db0 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
22dc0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
22dd0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
22de0 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
22df0 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ock */.){.  unix
22e00 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
22e10 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  nixFile*)fd;    
22e20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
22e30 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
22e40 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53  emory */.  unixS
22e50 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
22e60 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
22e70 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
22e80 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
22e90 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ed */.  unixShm 
22ea0 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ec0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
22ed0 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
22ee0 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
22ef0 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
22f00 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65  ShmNode;  /* The
22f10 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
22f20 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   iNode */.  int 
22f30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f50 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
22f60 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
22f90 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
22fa0 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
22fb0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  */..  assert( pS
22fc0 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
22fd0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
22fe0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
22ff0 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
23000 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
23010 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d    assert( ofst>=
23020 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c  0 && ofst+n<=SQL
23030 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
23040 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
23050 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
23060 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
23070 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
23080 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
23090 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
230a0 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
230b0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
230c0 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  VE).       || fl
230d0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
230e0 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
230f0 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
23100 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
23110 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
23120 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
23130 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73  CLUSIVE) );.  as
23140 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66  sert( n==1 || (f
23150 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
23160 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20  M_EXCLUSIVE)!=0 
23170 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
23180 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70  mNode->h>=0 || p
23190 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
231a0 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b  rocessLock==1 );
231b0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
231c0 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46  ode->h<0 || pDbF
231d0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
231e0 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  essLock==0 );.. 
231f0 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73   mask = (1<<(ofs
23200 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74  t+n)) - (1<<ofst
23210 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
23220 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
23230 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
23240 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
23250 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
23260 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
23270 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
23280 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
23290 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
232a0 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
232b0 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
232c0 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
232d0 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
232e0 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
232f0 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
23300 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
23310 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
23320 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
23330 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
23340 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
23350 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
23360 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
23370 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
23380 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
23390 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
233a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
233b0 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
233c0 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
233d0 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
233e0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
233f0 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
23400 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
23410 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b  , F_UNLCK, ofst+
23420 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
23430 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
23440 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23450 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
23460 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c  * Undo the local
23470 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
23480 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23490 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  ){.      p->excl
234a0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
234b0 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
234c0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
234d0 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   } .  }else if( 
234e0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
234f0 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  HM_SHARED ){.   
23500 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d   u16 allShared =
23510 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66   0;  /* Union of
23520 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
23530 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
23540 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20   than "p" */..  
23550 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68    /* Find out wh
23560 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  ich shared locks
23570 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c   are already hel
23580 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e  d by sibling con
23590 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  nections..    **
235a0 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20   If any sibling 
235b0 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e  already holds an
235c0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
235d0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65   go ahead and re
235e0 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49  turn.    ** SQLI
235f0 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a  TE_BUSY..    */.
23600 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
23610 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
23620 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
23630 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
23640 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
23650 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
23660 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
23670 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
23680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c       }.      all
23690 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68  Shared |= pX->sh
236a0 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
236b0 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72  .    /* Get shar
236c0 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ed locks at the 
236d0 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66  system level, if
236e0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
236f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23700 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
23710 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61   (allShared & ma
23720 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
23730 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
23740 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
23750 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74  e, F_RDLCK, ofst
23760 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20  +UNIX_SHM_BASE, 
23770 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
23780 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
23790 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
237a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
237b0 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61  et the local sha
237c0 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  red locks */.   
237d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
237e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  OK ){.      p->s
237f0 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
23800 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
23810 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  {.    /* Make su
23820 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f  re no sibling co
23830 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c  nnections hold l
23840 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ocks that will b
23850 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a  lock this.    **
23860 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64   lock.  If any d
23870 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  o, return SQLITE
23880 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79  _BUSY right away
23890 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
238a0 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
238b0 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
238c0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
238d0 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
238e0 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28   & mask)!=0 || (
238f0 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  pX->sharedMask &
23900 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
23910 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23920 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
23930 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
23940 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65    }.  .    /* Ge
23950 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
23960 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
23970 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e  tem level.  Then
23980 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20   if successful. 
23990 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20     ** also mark 
239a0 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63  the local connec
239b0 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f  tion as being lo
239c0 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cked..    */.   
239d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
239e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
239f0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
23a00 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57  ck(pShmNode, F_W
23a10 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f  RLCK, ofst+UNIX_
23a20 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
23a30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23a40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23a50 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61   assert( (p->sha
23a60 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  redMask & mask)=
23a70 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
23a80 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73  >exclMask |= mas
23a90 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
23aa0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
23ab0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
23ac0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f  ode->mutex);.  O
23ad0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
23ae0 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d  K shmid-%d, pid-
23af0 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78  %d got %03x,%03x
23b00 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
23b10 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c  p->id, getpid(),
23b20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20   p->sharedMask, 
23b30 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20  p->exclMask));. 
23b40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23b50 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61  *.** Implement a
23b60 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
23b70 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20  or memory fence 
23b80 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
23b90 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f  .  .**.** All lo
23ba0 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62  ads and stores b
23bb0 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20  egun before the 
23bc0 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d  barrier must com
23bd0 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20  plete before.** 
23be0 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72  any load or stor
23bf0 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68  e begun after th
23c00 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74  e barrier..*/.st
23c10 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
23c20 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69  mBarrier(.  sqli
23c30 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
23c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
23c50 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
23c60 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
23c70 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55  memory */.){.  U
23c80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
23c90 66 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  fd);.  unixEnter
23ca0 4d 75 74 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c  Mutex();.  unixL
23cb0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a  eaveMutex();.}..
23cc0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f  /*.** Close a co
23cd0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
23ce0 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65  ed-memory.  Dele
23cf0 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  te the underlyin
23d00 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66  g .** storage if
23d10 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74   deleteFlag is t
23d20 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
23d30 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64  ere is no shared
23d40 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
23d50 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e  ed with the conn
23d60 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73  ection then this
23d70 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61  .** routine is a
23d80 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
23d90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
23da0 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73  nixShmUnmap(.  s
23db0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23dd0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
23de0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
23df0 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  /.  int deleteFl
23e00 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
23e10 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68      /* Delete sh
23e20 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74  ared-memory if t
23e30 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  rue */.){.  unix
23e40 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
23e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23e60 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
23e70 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20   be closed */.  
23e80 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
23e90 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  mNode;          
23ea0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
23eb0 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
23ec0 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  file */.  unixSh
23ed0 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20  m **pp;         
23ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
23ef0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69   looping over si
23f00 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
23f10 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  s */.  unixFile 
23f20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 20 20  *pDbFd;         
23f30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
23f40 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
23f50 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62  e file */..  pDb
23f60 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
23f70 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d  fd;.  p = pDbFd-
23f80 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d  >pShm;.  if( p==
23f90 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
23fa0 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  E_OK;.  pShmNode
23fb0 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
23fc0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
23fd0 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
23fe0 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a  de->pShmNode );.
23ff0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
24000 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
24010 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20  d->pInode );..  
24020 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  /* Remove connec
24030 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20  tion p from the 
24040 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  set of connectio
24050 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  ns associated.  
24060 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65  ** with pShmNode
24070 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
24080 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
24090 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f  de->mutex);.  fo
240a0 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e  r(pp=&pShmNode->
240b0 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70  pFirst; (*pp)!=p
240c0 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70  ; pp = &(*pp)->p
240d0 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20  Next){}.  *pp = 
240e0 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20  p->pNext;..  /* 
240f0 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  Free the connect
24100 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74  ion p */.  sqlit
24110 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44  e3_free(p);.  pD
24120 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  bFd->pShm = 0;. 
24130 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
24140 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
24150 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
24160 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68  pShmNode->nRef h
24170 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68  as reached 0, th
24180 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64  en close the und
24190 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61  erlying.  ** sha
241a0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
241b0 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e   too */.  unixEn
241c0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
241d0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
241e0 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d  nRef>0 );.  pShm
241f0 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Node->nRef--;.  
24200 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
24210 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef==0 ){.    if(
24220 20 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70   deleteFlag && p
24230 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20  ShmNode->h>=0 ) 
24240 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64  osUnlink(pShmNod
24250 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
24260 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28     unixShmPurge(
24270 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e  pDbFd);.  }.  un
24280 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
24290 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
242a0 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23  _OK;.}...#else.#
242b0 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d   define unixShmM
242c0 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ap     0.# defin
242d0 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20  e unixShmLock   
242e0 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
242f0 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64  ShmBarrier 0.# d
24300 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d  efine unixShmUnm
24310 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a  ap   0.#endif /*
24320 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
24330 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
24340 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65  ** Here ends the
24350 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
24360 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  of all sqlite3_f
24370 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a  ile methods..**.
24380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24390 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74  ****** End sqlit
243a0 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20  e3_file Methods 
243b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
243c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
243d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
243e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
243f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
24420 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  ./*.** This divi
24430 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65  sion contains de
24440 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c  finitions of sql
24450 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
24460 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20  objects that.** 
24470 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75  implement variou
24480 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73  s file locking s
24490 74 72 61 74 65 67 69 65 73 2e 20 20 49 74 20 61  trategies.  It a
244a0 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66  lso contains def
244b0 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22  initions.** of "
244c0 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
244d0 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e  s.  A finder-fun
244e0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
244f0 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70 72   locate the appr
24500 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74  opriate.** sqlit
24510 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
24520 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72 74 69  ject for a parti
24530 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 66  cular database f
24540 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44 61  ile.  The pAppDa
24550 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ta.** field of t
24560 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56  he sqlite3_vfs V
24570 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69  FS objects are i
24580 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65  nitialized to be
24590 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20   pointers to.** 
245a0 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64  the correct find
245b0 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er-function for 
245c0 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20  that VFS..**.** 
245d0 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63  Most finder func
245e0 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70  tions return a p
245f0 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65  ointer to a fixe
24600 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  d sqlite3_io_met
24610 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20  hods.** object. 
24620 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65   The only intere
24630 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e  sting finder-fun
24640 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63  ction is autoloc
24650 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68  kIoFinder, which
24660 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  .** looks at the
24670 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   filesystem type
24680 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75   and tries to gu
24690 65 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ess the best loc
246a0 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79  king.** strategy
246b0 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a   from that..**.*
246c0 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e  * For finder-fun
246d0 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65  tion F, two obje
246e0 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 3a  cts are created:
246f0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68  .**.**    (1) Th
24700 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75  e real finder-fu
24710 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49  nction named "FI
24720 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20  mpt()"..**.**   
24730 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20   (2) A constant 
24740 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
24750 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a  function named j
24760 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a  ust "F"..**.**.*
24770 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * A pointer to t
24780 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20  he F pointer is 
24790 75 73 65 64 20 61 73 20 74 68 65 20 70 41 70 70  used as the pApp
247a0 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56  Data value for V
247b0 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20  FS.** objects.  
247c0 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68  We have to do th
247d0 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65  is instead of le
247e0 74 74 69 6e 67 20 70 41 70 70 44 61 74 61 20 70  tting pAppData p
247f0 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79  oint.** directly
24800 20 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66   at the finder-f
24810 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39  unction since C9
24820 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20  0 rules prevent 
24830 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20  a void*.** from 
24840 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66  be cast into a f
24850 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e  unction pointer.
24860 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69  .**.**.** Each i
24870 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
24880 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20  macro generates 
24890 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a  two objects:.**.
248a0 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61  **   *  A consta
248b0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  nt sqlite3_io_me
248c0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c  thods object cal
248d0 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61  l METHOD that ha
248e0 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20  s locking.**    
248f0 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c    methods CLOSE,
24900 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43   LOCK, UNLOCK, C
24910 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  KRESLOCK..**.** 
24920 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68    *  An I/O meth
24930 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  od finder functi
24940 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52  on called FINDER
24950 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20   that returns a 
24960 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20  pointer.**      
24970 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62  to the METHOD ob
24980 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72 65 76  ject in the prev
24990 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a  ious bullet..*/.
249a0 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44  #define IOMETHOD
249b0 53 28 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44  S(FINDER, METHOD
249c0 2c 20 56 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45  , VERSION, CLOSE
249d0 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20  , LOCK, UNLOCK, 
249e0 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20 5c 0a 73  CKLOCK)      \.s
249f0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
24a00 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d  te3_io_methods M
24a10 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20  ETHOD = {       
24a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a30 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
24a40 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20   VERSION,       
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a60 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20  iVersion */     
24a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a80 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
24a90 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20  CLOSE,          
24aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24ab0 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20  Close */        
24ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ad0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
24ae0 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20  nixRead,        
24af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
24b00 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ead */          
24b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
24b30 69 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  ixWrite,        
24b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
24b50 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ite */          
24b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b70 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
24b80 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  xTruncate,      
24b90 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
24ba0 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20  ncate */        
24bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bc0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
24bd0 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
24be0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
24bf0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c10 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
24c20 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
24c30 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
24c40 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
24c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c60 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20       \.   LOCK, 
24c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c80 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
24c90 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
24ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cb0 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c      \.   UNLOCK,
24cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cd0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
24ce0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
24cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d00 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20     \.   CKLOCK, 
24d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
24d30 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20  ervedLock */    
24d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d50 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43    \.   unixFileC
24d60 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
24d70 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
24d80 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ol */           
24d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24da0 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72   \.   unixSector
24db0 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
24dc0 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
24dd0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
24de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24df0 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43  \.   unixDeviceC
24e00 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20  haracteristics, 
24e10 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62   /* xDeviceCapab
24e20 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20  ilities */      
24e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
24e40 0a 20 20 20 75 6e 69 78 53 68 6d 4d 61 70 2c 20  .   unixShmMap, 
24e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e60 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20  /* xShmMap */   
24e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
24e90 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20     unixShmLock, 
24ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24eb0 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20  * xShmLock */   
24ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
24ee0 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72    unixShmBarrier
24ef0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
24f00 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20   xShmBarrier */ 
24f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
24f30 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20   unixShmUnmap   
24f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24f50 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20  xShmUnmap */    
24f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f70 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20             \.}; 
24f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fc0 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
24fd0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
24fe0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e  _io_methods *FIN
24ff0 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20  DER##Impl(const 
25000 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c  char *z, unixFil
25010 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55  e *p){   \.  UNU
25020 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29  SED_PARAMETER(z)
25030 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  ; UNUSED_PARAMET
25040 45 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 20  ER(p);          
25050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25060 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75          \.  retu
25070 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20  rn &METHOD;     
25080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250b0 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20         \.}      
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25100 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
25110 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
25120 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74  methods *(*const
25130 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63   FINDER)(const c
25140 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70  har*,unixFile *p
25150 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e  )    \.    = FIN
25160 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a  DER##Impl;../*.*
25170 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f  * Here are all o
25180 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  f the sqlite3_io
25190 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
251a0 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65   for each of the
251b0 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  .** locking stra
251c0 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f  tegies.  Functio
251d0 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70  ns that return p
251e0 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65  ointers to these
251f0 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20   methods.** are 
25200 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f  also created..*/
25210 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f  .IOMETHODS(.  po
25220 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  sixIoFinder,    
25230 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
25240 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
25250 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68  */.  posixIoMeth
25260 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
25270 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
25280 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
25290 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20 20 20   */.  2,        
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252b0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
252c0 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20   is enabled */. 
252d0 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
252e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
252f0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
25300 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
25310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
25320 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
25330 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  unixUnlock,     
25340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
25350 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
25360 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
25370 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43  edLock     /* xC
25380 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
25390 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
253a0 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b  ETHODS(.  nolock
253b0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
253c0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
253d0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
253e0 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73   nolockIoMethods
253f0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  ,          /* sq
25400 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
25410 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
25420 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
25430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
25440 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
25450 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f  disabled */.  no
25460 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
25470 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
25480 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  e method */.  no
25490 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
254a0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
254b0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
254c0 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
254d0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
254e0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  k method */.  no
254f0 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
25500 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63  dLock   /* xChec
25510 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
25520 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48  thod */.).IOMETH
25530 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  ODS(.  dotlockIo
25540 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
25550 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
25560 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f  ion name */.  do
25570 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  tlockIoMethods, 
25580 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
25590 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
255a0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
255b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
255c0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
255d0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
255e0 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  abled */.  dotlo
255f0 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
25600 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
25610 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
25620 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
25630 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
25640 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
25650 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
25660 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
25670 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
25680 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
25690 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ock  /* xCheckRe
256a0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
256b0 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49  d */.)..#if SQLI
256c0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
256d0 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
256e0 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
256f0 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65  (.  flockIoFinde
25700 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
25710 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
25720 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b   name */.  flock
25730 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
25740 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
25750 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
25760 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
25770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25780 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
25790 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
257a0 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f  ed */.  flockClo
257b0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
257c0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
257d0 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63  od */.  flockLoc
257e0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
257f0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
25800 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f  d */.  flockUnlo
25810 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
25820 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
25830 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65  od */.  flockChe
25840 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
25850 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
25860 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
25870 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
25880 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54  OS_VXWORKS.IOMET
25890 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e  HODS(.  semIoFin
258a0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
258b0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
258c0 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73  tion name */.  s
258d0 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  emIoMethods,    
258e0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
258f0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
25900 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
25910 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
25920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
25930 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
25940 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43  sabled */.  semC
25950 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
25960 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
25970 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c  method */.  semL
25980 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
25990 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
259a0 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e  ethod */.  semUn
259b0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
259c0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
259d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43  method */.  semC
259e0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
259f0 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
25a00 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
25a10 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
25a20 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
25a30 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
25a40 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
25a50 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
25a60 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20  .  afpIoFinder, 
25a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25a80 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
25a90 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d  name */.  afpIoM
25aa0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
25ab0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
25ac0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
25ad0 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
25ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25af0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
25b00 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
25b10 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c  d */.  afpClose,
25b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b30 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
25b40 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20  d */.  afpLock, 
25b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b60 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
25b70 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c   */.  afpUnlock,
25b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b90 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
25ba0 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52  d */.  afpCheckR
25bb0 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
25bc0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
25bd0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
25be0 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .).#endif../*.**
25bf0 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69   The proxy locki
25c00 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22  ng method is a "
25c10 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e  super-method" in
25c20 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20   the sense that 
25c30 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f  it.** opens seco
25c40 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73 63 72  ndary file descr
25c50 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63  iptors for the c
25c60 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69  onch and lock fi
25c70 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73  les and.** it us
25c80 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69  es proxy, dot-fi
25c90 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f  le, AFP, and flo
25ca0 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  ck() locking met
25cb0 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a  hods on those.**
25cc0 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73   secondary files
25cd0 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  .  For this reas
25ce0 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e  on, the division
25cf0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
25d00 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** proxy lockin
25d10 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63  g is located muc
25d20 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69  h further down i
25d30 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74  n the file.  But
25d40 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67   we need.** to g
25d50 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65 66 69  o ahead and defi
25d60 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ne the sqlite3_i
25d70 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69  o_methods and fi
25d80 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  nder function.**
25d90 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
25da0 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20  ng here.  So we 
25db0 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65 20  forward declare 
25dc0 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e  the I/O methods.
25dd0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
25de0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
25df0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
25e00 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63  ING_STYLE.static
25e10 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28   int proxyClose(
25e20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
25e30 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
25e40 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
25e50 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63  e*, int);.static
25e60 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b   int proxyUnlock
25e70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
25e80 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
25e90 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
25ea0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
25eb0 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f  file*, int*);.IO
25ec0 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79  METHODS(.  proxy
25ed0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
25ee0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
25ef0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
25f00 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73    proxyIoMethods
25f10 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
25f20 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
25f30 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
25f40 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
25f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25f60 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
25f70 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70   disabled */.  p
25f80 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20  roxyClose,      
25f90 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
25fa0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  se method */.  p
25fb0 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20  roxyLock,       
25fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
25fd0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
25fe0 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  oxyUnlock,      
25ff0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
26000 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  ck method */.  p
26010 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
26020 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65  dLock    /* xChe
26030 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
26040 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
26050 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20  f../* nfs lockd 
26060 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65  on OSX 10.3+ doe
26070 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74 65  sn't clear write
26080 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65   locks when a re
26090 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a  ad lock is set *
260a0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
260b0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
260c0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
260d0 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44  G_STYLE.IOMETHOD
260e0 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72  S(.  nfsIoFinder
260f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26100 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
26110 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73  on name */.  nfs
26120 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
26130 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
26140 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
26150 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
26160 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
26180 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
26190 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78  sabled */.  unix
261a0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
261b0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
261c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
261d0 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  xLock,          
261e0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
261f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73   method */.  nfs
26200 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
26210 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
26220 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
26230 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
26240 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68  Lock      /* xCh
26250 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
26260 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
26270 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
26280 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
26290 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
262a0 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
262b0 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
262c0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
262d0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
262e0 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
262f0 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
26300 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26310 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
26320 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
26330 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
26340 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
26350 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
26360 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
26370 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
26380 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f   MacOSX only..*/
26390 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
263a0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
263b0 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   *autolockIoFind
263c0 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
263d0 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
263e0 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
263f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26400 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
26410 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
26420 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63   open file objec
26430 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  t for the databa
26440 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  se file */.){.  
26450 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
26460 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20  uct Mapping {.  
26470 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
26480 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20  ilesystem;      
26490 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73          /* Files
264a0 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20  ystem type name 
264b0 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  */.    const sql
264c0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
264d0 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20  *pMethods;   /* 
264e0 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  Appropriate lock
264f0 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ing method */.  
26500 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20  } aMap[] = {.   
26510 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f   { "hfs",    &po
26520 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
26530 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20      { "ufs",    
26540 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
26550 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22  },.    { "afpfs"
26560 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
26570 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73   },.    { "smbfs
26580 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64  ",  &afpIoMethod
26590 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64  s },.    { "webd
265a0 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  av", &nolockIoMe
265b0 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30  thods },.    { 0
265c0 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74  , 0 }.  };.  int
265d0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
265e0 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74  tfs fsInfo;.  st
265f0 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
26600 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
26610 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
26620 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
26630 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
26640 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
26650 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
26660 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
26670 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
26680 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
26690 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
266a0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20  oMethods;.  }.  
266b0 69 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50  if( statfs(fileP
266c0 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d  ath, &fsInfo) !=
266d0 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66   -1 ){.    if( f
266e0 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20  sInfo.f_flags & 
266f0 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20  MNT_RDONLY ){.  
26700 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
26710 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  ckIoMethods;.   
26720 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
26730 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
26740 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  tem; i++){.     
26750 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e   if( strcmp(fsIn
26760 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
26770 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79   aMap[i].zFilesy
26780 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  stem)==0 ){.    
26790 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b      return aMap[
267a0 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20  i].pMethods;.   
267b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
267c0 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73    /* Default cas
267d0 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e  e. Handles, amon
267e0 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73  gst others, "nfs
267f0 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74  "..  ** Test byt
26800 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69  e-range lock usi
26810 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74  ng fcntl(). If t
26820 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73  he call succeeds
26830 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  , .  ** assume t
26840 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73  hat the file-sys
26850 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53  tem supports POS
26860 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20  IX style locks. 
26870 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f  .  */.  lockInfo
26880 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
26890 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
268a0 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
268b0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
268c0 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
268d0 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
268e0 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70  .  if( osFcntl(p
268f0 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  New->h, F_GETLK,
26900 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20   &lockInfo)!=-1 
26910 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  ) {.    if( strc
26920 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
26930 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d  pename, "nfs")==
26940 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
26950 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b  n &nfsIoMethods;
26960 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
26970 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69      return &posi
26980 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  xIoMethods;.    
26990 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
269a0 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f  eturn &dotlockIo
269b0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73  Methods;.  }.}.s
269c0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
269d0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a  te3_io_methods .
269e0 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c    *(*const autol
269f0 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e  ockIoFinder)(con
26a00 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
26a10 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f  e*) = autolockIo
26a20 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e  FinderImpl;..#en
26a30 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
26a40 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
26a50 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
26a60 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
26a70 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53   OS_VXWORKS && S
26a80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
26a90 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a  KING_STYLE./* .*
26aa0 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20  * This "finder" 
26ab0 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
26ac0 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  s to determine t
26ad0 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20  he best locking 
26ae0 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72  strategy .** for
26af0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26b00 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20  le "filePath".  
26b10 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20  It then returns 
26b20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
26b30 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74  ethods.** object
26b40 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
26b50 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a   that strategy..
26b60 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f  **.** This is fo
26b70 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a  r VXWorks only..
26b80 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
26b90 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
26ba0 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ds *autolockIoFi
26bb0 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73  nderImpl(.  cons
26bc0 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68  t char *filePath
26bd0 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20  ,    /* name of 
26be0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26bf0 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
26c00 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20  *pNew           
26c10 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  /* the open file
26c20 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
26c30 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
26c40 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66  kInfo;..  if( !f
26c50 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f  ilePath ){.    /
26c60 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e  * If filePath==N
26c70 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ULL that means w
26c80 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
26c90 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  th a transient f
26ca0 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ile.    ** that 
26cb0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
26cc0 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20   be locked. */. 
26cd0 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
26ce0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
26cf0 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63  .  /* Test if fc
26d00 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74  ntl() is support
26d10 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58  ed and use POSIX
26d20 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20   style locks..  
26d30 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  ** Otherwise fal
26d40 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61  l back to the na
26d50 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65  med semaphore me
26d60 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63  thod..  */.  loc
26d70 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  kInfo.l_len = 1;
26d80 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74  .  lockInfo.l_st
26d90 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49  art = 0;.  lockI
26da0 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  nfo.l_whence = S
26db0 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49  EEK_SET;.  lockI
26dc0 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  nfo.l_type = F_R
26dd0 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63  DLCK;.  if( osFc
26de0 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47  ntl(pNew->h, F_G
26df0 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29  ETLK, &lockInfo)
26e00 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74  !=-1 ) {.    ret
26e10 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68  urn &posixIoMeth
26e20 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
26e30 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d    return &semIoM
26e40 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
26e50 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
26e60 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
26e70 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f   *(*const autolo
26e80 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ckIoFinder)(cons
26e90 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
26ea0 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  *) = autolockIoF
26eb0 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
26ec0 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
26ed0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
26ee0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
26ef0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73  */../*.** An abs
26f00 74 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61  tract type for a
26f10 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f   pointer to a IO
26f20 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
26f30 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65  unction:.*/.type
26f40 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  def const sqlite
26f50 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
26f60 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e  finder_type)(con
26f70 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
26f80 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  e*);.../********
26f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26fd0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
26fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26ff0 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  * sqlite3_vfs me
27000 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
27010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27020 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69  **.**.** This di
27030 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
27040 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
27050 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e  on of methods on
27060 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
27070 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a  vfs object..*/..
27080 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
27090 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
270a0 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   the unixFile st
270b0 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
270c0 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74  to by pId..*/.st
270d0 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55  atic int fillInU
270e0 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74  nixFile(.  sqlit
270f0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
27100 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
27110 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
27120 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20   int h,         
27130 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
27140 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
27150 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f   of file being o
27160 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  pened */.  sqlit
27170 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20  e3_file *pId,   
27180 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
27190 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
271a0 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
271b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
271c0 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
271d0 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  of the file bein
271e0 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e  g opened */.  in
271f0 74 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20  t ctrlFlags     
27200 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72        /* Zero or
27210 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a   more UNIXFILE_*
27220 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
27230 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
27240 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69  _methods *pLocki
27250 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46  ngStyle;.  unixF
27260 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69  ile *pNew = (uni
27270 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69  xFile *)pId;.  i
27280 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
27290 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  K;..  assert( pN
272a0 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c  ew->pInode==NULL
272b0 20 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c   );..  /* Usuall
272c0 79 20 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65  y the path zFile
272d0 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  name should not 
272e0 62 65 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  be a relative pa
272f0 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a  thname. The.  **
27300 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68   exception is wh
27310 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70  en opening the p
27320 72 6f 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c  roxy "conch" fil
27330 65 20 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74  e in builds that
27340 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68  .  ** include th
27350 65 20 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20  e special Apple 
27360 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a  locking styles..
27370 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
27380 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
27390 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
273a0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73  KING_STYLE.  ass
273b0 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ert( zFilename==
273c0 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
273d0 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70  ]=='/' .    || p
273e0 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28  Vfs->pAppData==(
273f0 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49  void*)&autolockI
27400 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65  oFinder );.#else
27410 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65  .  assert( zFile
27420 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
27430 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  name[0]=='/' );.
27440 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20  #endif..  /* No 
27450 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69  locking occurs i
27460 6e 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  n temporary file
27470 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  s */.  assert( z
27480 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28  Filename!=0 || (
27490 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
274a0 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20  FILE_NOLOCK)!=0 
274b0 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
274c0 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c  OPEN    %-3d %s\
274d0 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65  n", h, zFilename
274e0 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20  ));.  pNew->h = 
274f0 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73 20  h;.  pNew->pVfs 
27500 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e  = pVfs;.  pNew->
27510 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d  zPath = zFilenam
27520 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  e;.  pNew->ctrlF
27530 6c 61 67 73 20 3d 20 28 75 38 29 63 74 72 6c 46  lags = (u8)ctrlF
27540 6c 61 67 73 3b 0a 20 20 69 66 28 20 73 71 6c 69  lags;.  if( sqli
27550 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
27560 28 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ((ctrlFlags & UN
27570 49 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46  IXFILE_URI) ? zF
27580 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20  ilename : 0),.  
27590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275a0 20 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c           "psow",
275b0 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46   SQLITE_POWERSAF
275c0 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a  E_OVERWRITE) ){.
275d0 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
275e0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
275f0 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20  PSOW;.  }.  if( 
27600 6d 65 6d 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61  memcmp(pVfs->zNa
27610 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 2c 31  me,"unix-excl",1
27620 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  0)==0 ){.    pNe
27630 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  w->ctrlFlags |= 
27640 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20  UNIXFILE_EXCL;. 
27650 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   }..#if OS_VXWOR
27660 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d  KS.  pNew->pId =
27670 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65   vxworksFindFile
27680 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  Id(zFilename);. 
27690 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d   if( pNew->pId==
276a0 30 20 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61  0 ){.    ctrlFla
276b0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e  gs |= UNIXFILE_N
276c0 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  OLOCK;.    rc = 
276d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
276e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
276f0 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
27700 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20  FILE_NOLOCK ){. 
27710 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
27720 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68   = &nolockIoMeth
27730 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
27740 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
27750 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70  = (**(finder_typ
27760 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74  e*)pVfs->pAppDat
27770 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e  a)(zFilename, pN
27780 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ew);.#if SQLITE_
27790 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
277a0 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68  TYLE.    /* Cach
277b0 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74  e zFilename in t
277c0 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
277d0 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c  xt (AFP and dotl
277e0 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f  ock override) fo
277f0 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f  r.    ** proxyLo
27800 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73  ck activation is
27810 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74   possible (remot
27820 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64  e proxy is based
27830 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20   on db name).   
27840 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65   ** zFilename re
27850 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
27860 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
27870 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a  , to support */.
27880 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
27890 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64  gContext = (void
278a0 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e  *)zFilename;.#en
278b0 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
278c0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
278d0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a  &posixIoMethods.
278e0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
278f0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
27900 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
27910 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f  STYLE.    || pLo
27920 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e  ckingStyle == &n
27930 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64  fsIoMethods.#end
27940 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78  if.  ){.    unix
27950 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
27960 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
27970 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
27980 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
27990 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
279a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
279b0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
279c0 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   in findInodeInf
279d0 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66  o(), close the f
279e0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20  ile descriptor. 
279f0 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74       ** immediat
27a00 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65  ely, before rele
27a10 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e  asing the mutex.
27a20 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
27a30 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20   may fail.      
27a40 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ** in two scenar
27a50 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ios:.      **.  
27a60 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63      **   (a) A c
27a70 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66  all to fstat() f
27a80 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  ailed..      ** 
27a90 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66    (b) A malloc f
27aa0 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ailed..      **.
27ab0 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69        ** Scenari
27ac0 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f  o (b) may only o
27ad0 63 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63  ccur if the proc
27ae0 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e  ess is holding n
27af0 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  o other.      **
27b00 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
27b10 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  s open on the sa
27b20 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  me file. If ther
27b30 65 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c  e were other fil
27b40 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
27b50 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66  iptors on this f
27b60 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c  ile, then no mal
27b70 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71  loc would be req
27b80 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
27b90 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  * findInodeInfo(
27ba0 29 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ). If this is th
27bb0 65 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75  e case, it is qu
27bc0 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73  ite safe to clos
27bd0 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c  e.      ** handl
27be0 65 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67  e h - as it is g
27bf0 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e  uaranteed that n
27c00 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69  o posix locks wi
27c10 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20  ll be released. 
27c20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67       ** by doing
27c30 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20   so..      **.  
27c40 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72      ** If scenar
27c50 69 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68  io (a) caused th
27c60 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69  e error then thi
27c70 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73  ngs are not so s
27c80 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  afe. The.      *
27c90 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d  * implicit assum
27ca0 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68  ption here is th
27cb0 61 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61  at if fstat() fa
27cc0 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20  ils, things are 
27cd0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68  in.      ** such
27ce0 20 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20   bad shape that 
27cf0 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20  dropping a lock 
27d00 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d  or two doesn't m
27d10 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20  atter much..    
27d20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73    */.      robus
27d30 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
27d40 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
27d50 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a    h = -1;.    }.
27d60 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
27d70 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53  ex();.  }..#if S
27d80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
27d90 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
27da0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
27db0 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
27dc0 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66  kingStyle == &af
27dd0 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
27de0 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67    /* AFP locking
27df0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
27e00 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
27e10 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
27e20 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70  n.    ** the afp
27e30 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a  LockingContext..
27e40 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f      */.    afpLo
27e50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
27e60 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f  tx;.    pNew->lo
27e70 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
27e80 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ctx = sqlite3_ma
27e90 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
27ea0 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  tx) );.    if( p
27eb0 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ctx==0 ){.      
27ec0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
27ed0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
27ee0 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65      /* NB: zFile
27ef0 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20  name exists and 
27f00 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
27f10 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20  til the file is 
27f20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  closed.      ** 
27f30 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71  according to req
27f40 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e  uirement F11141.
27f50 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e    So we do not n
27f60 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20  eed to make a.  
27f70 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
27f80 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a  he filename. */.
27f90 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61        pCtx->dbPa
27fa0 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
27fb0 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65        pCtx->rese
27fc0 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rved = 0;.      
27fd0 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20  srandomdev();.  
27fe0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
27ff0 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ex();.      rc =
28000 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
28010 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
28020 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  de);.      if( r
28030 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28040 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
28050 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69  free(pNew->locki
28060 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ngContext);.    
28070 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
28080 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
28090 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d  __);.        h =
280a0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
280b0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
280c0 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20  x();        .   
280d0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
280e0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
280f0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c  ngStyle == &dotl
28100 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  ockIoMethods ){.
28110 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c      /* Dotfile l
28120 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
28130 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
28140 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
28150 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
28160 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  he dotlockLockin
28170 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f  gContext .    */
28180 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  .    char *zLock
28190 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46  File;.    int nF
281a0 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73  ilename;.    ass
281b0 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d  ert( zFilename!=
281c0 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61  0 );.    nFilena
281d0 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  me = (int)strlen
281e0 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b  (zFilename) + 6;
281f0 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d  .    zLockFile =
28200 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
28210 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d  _malloc(nFilenam
28220 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63  e);.    if( zLoc
28230 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  kFile==0 ){.    
28240 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
28250 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
28260 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
28270 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65  printf(nFilename
28280 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73  , zLockFile, "%s
28290 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  " DOTLOCK_SUFFIX
282a0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
282b0 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f    }.    pNew->lo
282c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a  ckingContext = z
282d0 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23  LockFile;.  }..#
282e0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
282f0 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
28300 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f  gStyle == &semIo
28310 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
28320 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
28330 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  e locking uses t
28340 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
28350 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  it needs to be. 
28360 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69     ** included i
28370 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67  n the semLocking
28380 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20  Context.    */. 
28390 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
283a0 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
283b0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
283c0 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
283d0 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  ;.    if( (rc==S
283e0 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e  QLITE_OK) && (pN
283f0 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
28400 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ==NULL) ){.     
28410 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20   char *zSemName 
28420 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e  = pNew->pInode->
28430 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20  aSemName;.      
28440 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c  int n;.      sql
28450 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
28460 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d  X_PATHNAME, zSem
28470 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c  Name, "/%s.sem",
28480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28490 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49          pNew->pI
284a0 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
284b0 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e  e);.      for( n
284c0 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b  =1; zSemName[n];
284d0 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69   n++ ).        i
284e0 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d  f( zSemName[n]==
284f0 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e  '/' ) zSemName[n
28500 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70  ] = '_';.      p
28510 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
28520 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65  m = sem_open(zSe
28530 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20  mName, O_CREAT, 
28540 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20  0666, 1);.      
28550 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  if( pNew->pInode
28560 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41  ->pSem == SEM_FA
28570 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
28580 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
28590 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
285a0 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
285b0 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  e[0] = '\0';.   
285c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
285d0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
285e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
285f0 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f   pNew->lastErrno
28600 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57   = 0;.#if OS_VXW
28610 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53  ORKS.  if( rc!=S
28620 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28630 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73  if( h>=0 ) robus
28640 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
28650 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
28660 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e  h = -1;.    osUn
28670 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
28680 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d 20  .    isDelete = 
28690 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 44  0;.  }.  if( isD
286a0 65 6c 65 74 65 20 29 20 70 4e 65 77 2d 3e 63 74  elete ) pNew->ct
286b0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
286c0 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64  ILE_DELETE;.#end
286d0 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  if.  if( rc!=SQL
286e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
286f0 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  ( h>=0 ) robust_
28700 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
28710 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73  _LINE__);.  }els
28720 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  e{.    pNew->pMe
28730 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53  thod = pLockingS
28740 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f  tyle;.    OpenCo
28750 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20  unter(+1);.  }. 
28760 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28770 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
28780 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74  name of a direct
28790 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ory in which to 
287a0 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69  put temporary fi
287b0 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  les..** If no su
287c0 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79  itable temporary
287d0 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20   file directory 
287e0 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
287f0 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
28800 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
28810 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72  *unixTempFileDir
28820 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
28830 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
28840 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30  irs[] = {.     0
28850 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  ,.     0,.     "
28860 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
28870 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
28880 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20   "/tmp",.     0 
28890 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
288a0 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d  erminator */.  }
288b0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
288c0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
288d0 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63  t buf;.  const c
288e0 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a  har *zDir = 0;..
288f0 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71    azDirs[0] = sq
28900 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
28910 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44  tory;.  if( !azD
28920 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
28930 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  1] = getenv("TMP
28940 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  DIR");.  for(i=0
28950 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
28960 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
28970 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72  [0]); zDir=azDir
28980 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28  s[i++]){.    if(
28990 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69   zDir==0 ) conti
289a0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53  nue;.    if( osS
289b0 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20  tat(zDir, &buf) 
289c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
289d0 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66  if( !S_ISDIR(buf
289e0 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74  .st_mode) ) cont
289f0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73  inue;.    if( os
28a00 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29  Access(zDir, 07)
28a10 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
28a20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
28a30 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a  turn zDir;.}../*
28a40 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
28a50 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
28a60 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
28a70 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
28a80 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
28a90 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
28aa0 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
28ab0 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
28ac0 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
28ad0 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
28ae0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
28af0 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74  xGetTempname(int
28b00 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
28b10 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  f){.  static con
28b20 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
28b30 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
28b40 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
28b50 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
28b60 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
28b70 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
28b80 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
28b90 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
28ba0 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  , j;.  const cha
28bb0 72 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49  r *zDir;..  /* I
28bc0 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
28bd0 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
28be0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
28bf0 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
28c00 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
28c10 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
28c20 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
28c30 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
28c40 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
28c50 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
28c60 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
28c70 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
28c80 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
28c90 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46  zDir = unixTempF
28ca0 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20  ileDir();.  if( 
28cb0 7a 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d  zDir==0 ) zDir =
28cc0 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   ".";..  /* Chec
28cd0 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75  k that the outpu
28ce0 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67  t buffer is larg
28cf0 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65  e enough for the
28d00 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
28d10 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69  .  ** name. If i
28d20 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e  t is not, return
28d30 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20   SQLITE_ERROR.. 
28d40 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65   */.  if( (strle
28d50 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e  n(zDir) + strlen
28d60 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  (SQLITE_TEMP_FIL
28d70 45 5f 50 52 45 46 49 58 29 20 2b 20 31 38 29 20  E_PREFIX) + 18) 
28d80 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  >= (size_t)nBuf 
28d90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
28da0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
28db0 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
28dc0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
28dd0 2d 31 38 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22  -18, zBuf, "%s/"
28de0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
28df0 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a  _PREFIX, zDir);.
28e00 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72      j = (int)str
28e10 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73  len(zBuf);.    s
28e20 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
28e30 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
28e40 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
28e50 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
28e60 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28       zBuf[j] = (
28e70 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
28e80 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
28e90 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
28ea0 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20  hars)-1) ];.    
28eb0 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  }.    zBuf[j] = 
28ec0 30 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 31 5d  0;.    zBuf[j+1]
28ed0 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20   = 0;.  }while( 
28ee0 6f 73 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29  osAccess(zBuf,0)
28ef0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
28f00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
28f10 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
28f20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
28f30 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
28f40 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  __)./*.** Routin
28f50 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61  e to transform a
28f60 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61   unixFile into a
28f70 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75   proxy-locking u
28f80 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c  nixFile..** Impl
28f90 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68  ementation in th
28fa0 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76  e proxy-lock div
28fb0 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20  ision, but used 
28fc0 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a  by unixOpen().**
28fd0 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45   if SQLITE_PREFE
28fe0 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20  R_PROXY_LOCKING 
28ff0 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73  is defined..*/.s
29000 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
29010 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
29020 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73  (unixFile*, cons
29030 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66  t char*);.#endif
29040 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66  ../*.** Search f
29050 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c  or an unused fil
29060 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
29070 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  t was opened on 
29080 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
29090 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
290a0 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a  rnal or master-j
290b0 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65  ournal file) ide
290c0 6e 74 69 66 69 65 64 20 62 79 20 70 61 74 68 6e  ntified by pathn
290d0 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74  ame.** zPath wit
290e0 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58  h SQLITE_OPEN_XX
290f0 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67  X flags matching
29100 20 74 68 6f 73 65 20 70 61 73 73 65 64 20 61 73   those passed as
29110 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   the second.** a
29120 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
29130 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
29140 53 75 63 68 20 61 20 66 69 6c 65 20 64 65 73 63  Such a file desc
29150 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74  riptor may exist
29160 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 63   if a database c
29170 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c  onnection was cl
29180 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20  osed.** but the 
29190 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20  associated file 
291a0 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64  descriptor could
291b0 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62   not be closed b
291c0 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f  ecause some.** o
291d0 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
291e0 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ptor open on the
291f0 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f   same file is ho
29200 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63  lding a file-loc
29210 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63  k..** Refer to c
29220 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75  omments in the u
29230 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74  nixClose() funct
29240 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67  ion and the leng
29250 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64  thy comment.** d
29260 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78  escribing "Posix
29270 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e   Advisory Lockin
29280 67 22 20 61 74 20 74 68 65 20 73 74 61 72 74 20  g" at the start 
29290 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72  of this file for
292a0 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74   .** further det
292b0 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b  ails. Also, tick
292c0 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20  et #4018..**.** 
292d0 49 66 20 61 20 73 75 69 74 61 62 6c 65 20 66 69  If a suitable fi
292e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
292f0 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20   found, then it 
29300 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
29310 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20  no.** such file 
29320 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f  descriptor is lo
29330 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74  cated, -1 is ret
29340 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
29350 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66   UnixUnusedFd *f
29360 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f  indReusableFd(co
29370 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
29380 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55   int flags){.  U
29390 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
293a0 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  used = 0;..  /* 
293b0 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f  Do not search fo
293c0 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65  r an unused file
293d0 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76   descriptor on v
293e0 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61  xworks. Not beca
293f0 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73  use.  ** vxworks
29400 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66   would not benef
29410 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e  it from the chan
29420 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65  ge (it might, we
29430 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20  're not sure),. 
29440 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65 20   ** but because 
29450 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20 69  no way to test i
29460 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  t is currently a
29470 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20  vailable. It is 
29480 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74  better .  ** not
29490 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e   to risk breakin
294a0 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72  g vxworks suppor
294b0 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f  t for the sake o
294c0 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72  f such an obscur
294d0 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e  e .  ** feature.
294e0 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57    */.#if !OS_VXW
294f0 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74  ORKS.  struct st
29500 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
29510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
29520 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29  esults of stat()
29530 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41   call */..  /* A
29540 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79   stat() call may
29550 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75   fail for variou
29560 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68  s reasons. If th
29570 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69  is happens, it i
29580 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65  s.  ** almost ce
29590 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70  rtain that an op
295a0 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65  en() call on the
295b0 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20   same path will 
295c0 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20  also fail..  ** 
295d0 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
295e0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
295f0 75 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28  urs in the stat(
29600 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20  ) call here, it 
29610 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20  is.  ** ignored 
29620 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e  and -1 is return
29630 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
29640 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ill try to open 
29650 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20  a new file.  ** 
29660 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68  descriptor on th
29670 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69  e same path, fai
29680 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  l, and return an
29690 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65   error to SQLite
296a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  **.  ** Even
296b0 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74   if a subsequent
296c0 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65   open() call doe
296d0 73 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63  s succeed, the c
296e0 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20  onsequences of. 
296f0 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e   ** not searchin
29700 67 20 66 6f 72 20 61 20 72 65 73 75 73 61 62 6c  g for a resusabl
29710 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
29720 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20  r are not dire. 
29730 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53   */.  if( 0==osS
29740 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61  tat(zPath, &sSta
29750 74 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e  t) ){.    unixIn
29760 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
29770 0a 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ..    unixEnterM
29780 75 74 65 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f  utex();.    pIno
29790 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  de = inodeList;.
297a0 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64      while( pInod
297b0 65 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69  e && (pInode->fi
297c0 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e  leId.dev!=sStat.
297d0 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20  st_dev.         
297e0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
297f0 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e  Inode->fileId.in
29800 6f 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29  o!=sStat.st_ino)
29810 20 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64   ){.       pInod
29820 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  e = pInode->pNex
29830 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
29840 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20   pInode ){.     
29850 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a   UnixUnusedFd **
29860 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70  pp;.      for(pp
29870 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  =&pInode->pUnuse
29880 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d  d; *pp && (*pp)-
29890 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70  >flags!=flags; p
298a0 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p=&((*pp)->pNext
298b0 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  ));.      pUnuse
298c0 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69  d = *pp;.      i
298d0 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
298e0 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75        *pp = pUnu
298f0 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  sed->pNext;.    
29900 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
29910 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
29920 20 20 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a    }.#endif    /*
29930 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20   if !OS_VXWORKS 
29940 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75  */.  return pUnu
29950 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  sed;.}../*.** Th
29960 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
29970 61 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65  alled by unixOpe
29980 6e 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  n() to determine
29990 20 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73   the unix permis
299a0 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61  sions.** to crea
299b0 74 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74  te new files wit
299c0 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  h. If no error o
299d0 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
299e0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
299f0 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65  d.** and a value
29a00 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61   suitable for pa
29a10 73 73 69 6e 67 20 61 73 20 74 68 65 20 74 68 69  ssing as the thi
29a20 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f  rd argument to o
29a30 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69  pen(2) is.** wri
29a40 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20  tten to *pMode. 
29a50 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
29a60 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65  ccurs, an SQLite
29a70 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a   error code is .
29a80 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  ** returned and 
29a90 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d  the value of *pM
29aa0 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66  ode is not modif
29ab0 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f  ied..**.** In mo
29ac0 73 74 20 63 61 73 65 73 20 63 61 73 65 73 2c 20  st cases cases, 
29ad0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  this routine set
29ae0 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77  s *pMode to 0, w
29af0 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65  hich will become
29b00 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74 69 6f  .** an indicatio
29b10 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e  n to robust_open
29b20 28 29 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  () to create the
29b30 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53   file using.** S
29b40 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
29b50 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 61  LE_PERMISSIONS a
29b60 64 6a 75 73 74 65 64 20 62 79 20 74 68 65 20 75  djusted by the u
29b70 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20  mask..** But if 
29b80 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
29b90 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f  pened is a WAL o
29ba0 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61  r regular journa
29bb0 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a  l file, then .**
29bc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71   this function q
29bd0 75 65 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d  ueries the file-
29be0 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70  system for the p
29bf0 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68  ermissions on th
29c00 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  e .** correspond
29c10 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
29c20 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64  e and sets *pMod
29c30 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e  e to this value.
29c40 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f   Whenever .** po
29c50 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20  ssible, WAL and 
29c60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72  journal files ar
29c70 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  e created using 
29c80 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73  the same permiss
29c90 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20  ions .** as the 
29ca0 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  associated datab
29cb0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
29cc0 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  If the SQLITE_EN
29cd0 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f  ABLE_8_3_NAMES o
29ce0 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
29cf0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72  , then the.** or
29d00 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  iginal filename 
29d10 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20  is unavailable. 
29d20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69   But 8_3_NAMES i
29d30 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a  s only used for.
29d40 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74 65  ** FAT filesyste
29d50 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f  ms and permissio
29d60 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72  ns do not matter
29d70 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20   there, so just 
29d80 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75  use.** the defau
29d90 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a  lt permissions..
29da0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
29db0 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65  ndCreateFileMode
29dc0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
29dd0 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
29de0 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66      /* Path of f
29df0 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62  ile (possibly) b
29e00 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a  eing created */.
29e10 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
29e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e30 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
29e40 64 20 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e  d as 4th argumen
29e50 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  t to xOpen() */.
29e60 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c    mode_t *pMode,
29e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e80 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73    /* OUT: Permis
29e90 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69  sions to open fi
29ea0 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69 64  le with */.  uid
29eb0 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20  _t *pUid,       
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29ed0 4f 55 54 3a 20 75 69 64 20 74 6f 20 73 65 74 20  OUT: uid to set 
29ee0 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  on the file */. 
29ef0 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20   gid_t *pGid    
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f10 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f 20   /* OUT: gid to 
29f20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  set on the file 
29f30 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
29f40 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
29f50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
29f60 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f  n Code */.  *pMo
29f70 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20  de = 0;.  *pUid 
29f80 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30  = 0;.  *pGid = 0
29f90 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
29fa0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  (SQLITE_OPEN_WAL
29fb0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
29fc0 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20  N_JOURNAL) ){.  
29fd0 20 20 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50    char zDb[MAX_P
29fe0 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20  ATHNAME+1];     
29ff0 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
2a000 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74   path */.    int
2a010 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   nDb;           
2a020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2a030 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79  mber of valid by
2a040 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20  tes in zDb */.  
2a050 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
2a060 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
2a070 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20 73 74 61  /* Output of sta
2a080 74 28 29 20 6f 6e 20 64 61 74 61 62 61 73 65 20  t() on database 
2a090 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  file */..    /* 
2a0a0 7a 50 61 74 68 20 69 73 20 61 20 70 61 74 68 20  zPath is a path 
2a0b0 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72  to a WAL or jour
2a0c0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f  nal file. The fo
2a0d0 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65  llowing block de
2a0e0 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  rives.    ** the
2a0f0 20 70 61 74 68 20 74 6f 20 74 68 65 20 61 73 73   path to the ass
2a100 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
2a110 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68   file from zPath
2a120 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e  . This block han
2a130 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  dles.    ** the 
2a140 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67  following naming
2a150 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20   conventions:.  
2a160 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c    **.    **   "<
2a170 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72  path to db>-jour
2a180 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c  nal".    **   "<
2a190 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22  path to db>-wal"
2a1a0 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
2a1b0 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e   to db>-journalN
2a1c0 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  N".    **   "<pa
2a1d0 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22  th to db>-walNN"
2a1e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77  .    **.    ** w
2a1f0 68 65 72 65 20 4e 4e 20 69 73 20 61 20 64 65 63  here NN is a dec
2a200 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65  imal number. The
2a210 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d   NN naming schem
2a220 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75  es are .    ** u
2a230 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74 5f  sed by the test_
2a240 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75  multiplex.c modu
2a250 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  le..    */.    n
2a260 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  Db = sqlite3Strl
2a270 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b  en30(zPath) - 1;
2a280 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
2a290 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53  ENABLE_8_3_NAMES
2a2a0 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 44 62 3e  .    while( nDb>
2a2b0 30 20 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c  0 && sqlite3Isal
2a2c0 6e 75 6d 28 7a 50 61 74 68 5b 6e 44 62 5d 29 20  num(zPath[nDb]) 
2a2d0 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 69 66 28  ) nDb--;.    if(
2a2e0 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68   nDb==0 || zPath
2a2f0 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 20 72 65 74  [nDb]!='-' ) ret
2a300 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
2a310 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20  else.    while( 
2a320 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20  zPath[nDb]!='-' 
2a330 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2a340 20 6e 44 62 3e 30 20 29 3b 0a 20 20 20 20 20 20   nDb>0 );.      
2a350 61 73 73 65 72 74 28 20 7a 50 61 74 68 5b 6e 44  assert( zPath[nD
2a360 62 5d 21 3d 27 5c 6e 27 20 29 3b 0a 20 20 20 20  b]!='\n' );.    
2a370 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 23    nDb--;.    }.#
2a380 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 63 70 79  endif.    memcpy
2a390 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62  (zDb, zPath, nDb
2a3a0 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20  );.    zDb[nDb] 
2a3b0 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28  = '\0';..    if(
2a3c0 20 30 3d 3d 6f 73 53 74 61 74 28 7a 44 62 2c 20   0==osStat(zDb, 
2a3d0 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
2a3e0 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e   *pMode = sStat.
2a3f0 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a  st_mode & 0777;.
2a400 20 20 20 20 20 20 2a 70 55 69 64 20 3d 20 73 53        *pUid = sS
2a410 74 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20  tat.st_uid;.    
2a420 20 20 2a 70 47 69 64 20 3d 20 73 53 74 61 74 2e    *pGid = sStat.
2a430 73 74 5f 67 69 64 3b 0a 20 20 20 20 7d 65 6c 73  st_gid;.    }els
2a440 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
2a450 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
2a460 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
2a470 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
2a480 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
2a490 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d  CLOSE ){.    *pM
2a4a0 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a  ode = 0600;.  }.
2a4b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a4c0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66  /*.** Open the f
2a4d0 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a  ile zPath..** .*
2a4e0 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68  * Previously, th
2a4f0 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65  e SQLite OS laye
2a500 72 20 75 73 65 64 20 74 68 72 65 65 20 66 75 6e  r used three fun
2a510 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20  ctions in place 
2a520 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a  of this.** one:.
2a530 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  **.**     sqlite
2a540 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
2a550 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ();.**     sqlit
2a560 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
2a570 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ();.**     sqlit
2a580 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
2a590 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  e();.**.** These
2a5a0 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e   calls correspon
2a5b0 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d to the followi
2a5c0 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
2a5d0 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
2a5e0 20 20 20 20 52 65 61 64 57 72 69 74 65 28 29 20      ReadWrite() 
2a5f0 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52 49 54  ->     (READWRIT
2a600 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20  E | CREATE).**  
2a610 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d     ReadOnly()  -
2a620 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29  >     (READONLY)
2a630 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63   .**     OpenExc
2a640 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41  lusive() -> (REA
2a650 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20  DWRITE | CREATE 
2a660 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a  | EXCLUSIVE).**.
2a670 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45  ** The old OpenE
2a680 78 63 6c 75 73 69 76 65 28 29 20 61 63 63 65 70  xclusive() accep
2a690 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72  ted a boolean ar
2a6a0 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61  gument - "delFla
2a6b0 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20  g". If.** true, 
2a6c0 74 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e  the file was con
2a6d0 66 69 67 75 72 65 64 20 74 6f 20 62 65 20 61 75  figured to be au
2a6e0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
2a6f0 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ted when the.** 
2a700 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73  file handle clos
2a710 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74  ed. To achieve t
2a720 68 65 20 73 61 6d 65 20 65 66 66 65 63 74 20 75  he same effect u
2a730 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a  sing this new .*
2a740 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64  * interface, add
2a750 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f   the DELETEONCLO
2a760 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65  SE flag to those
2a770 20 73 70 65 63 69 66 69 65 64 20 61 62 6f 76 65   specified above
2a780 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63   for .** OpenExc
2a790 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61  lusive()..*/.sta
2a7a0 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
2a7b0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2a7c0 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
2a7d0 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20   /* The VFS for 
2a7e0 77 68 69 63 68 20 74 68 69 73 20 69 73 20 74 68  which this is th
2a7f0 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a  e xOpen method *
2a800 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2a810 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
2a820 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20   /* Pathname of 
2a830 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65  file to be opene
2a840 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
2a850 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
2a860 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
2a870 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65  descriptor to be
2a880 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20   filled in */.  
2a890 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
2a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a8b0 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63  Input flags to c
2a8c0 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69  ontrol the openi
2a8d0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75  ng */.  int *pOu
2a8e0 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  tFlags          
2a8f0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66       /* Output f
2a900 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f  lags returned to
2a910 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a   SQLite core */.
2a920 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
2a930 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
2a940 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d  File;.  int fd =
2a950 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
2a960 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
2a970 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e  escriptor return
2a980 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed by open() */.
2a990 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20    int openFlags 
2a9a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2a9b0 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73   /* Flags to pas
2a9c0 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20  s to open() */. 
2a9d0 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61   int eType = fla
2a9e0 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20  gs&0xFFFFFF00;  
2a9f0 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20  /* Type of file 
2aa00 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
2aa10 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20   noLock;        
2aa20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2aa30 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b  rue to omit lock
2aa40 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a  ing primitives *
2aa50 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2aa60 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2aa70 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52     /* Function R
2aa80 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
2aa90 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 3d 20  int ctrlFlags = 
2aaa0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2aab0 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61  * UNIXFILE_* fla
2aac0 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45  gs */..  int isE
2aad0 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61  xclusive  = (fla
2aae0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2aaf0 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69  _EXCLUSIVE);.  i
2ab00 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20  nt isDelete     
2ab10 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2ab20 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
2ab30 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43  LOSE);.  int isC
2ab40 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61  reate     = (fla
2ab50 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2ab60 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20  _CREATE);.  int 
2ab70 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28  isReadonly   = (
2ab80 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2ab90 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
2aba0 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65   int isReadWrite
2abb0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2abc0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
2abd0 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  TE);.#if SQLITE_
2abe0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2abf0 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74  TYLE.  int isAut
2ac00 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73  oProxy  = (flags
2ac10 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41   & SQLITE_OPEN_A
2ac20 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69  UTOPROXY);.#endi
2ac30 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  f.#if defined(__
2ac40 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
2ac50 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2ac60 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74  G_STYLE.  struct
2ac70 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
2ac80 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
2ac90 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65  creating a maste
2aca0 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a  r or main-file j
2acb0 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e  ournal, this fun
2acc0 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a  ction will open.
2acd0 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63    ** a file-desc
2ace0 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69  riptor on the di
2acf0 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65  rectory too. The
2ad00 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78   first time unix
2ad10 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63  Sync().  ** is c
2ad20 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63 74  alled the direct
2ad30 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
2ad40 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e  tor will be fsyn
2ad50 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28  c()ed and close(
2ad60 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 73  )d..  */.  int s
2ad70 79 6e 63 44 69 72 20 3d 20 28 69 73 43 72 65 61  yncDir = (isCrea
2ad80 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20  te && (.        
2ad90 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2ada0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
2adb0 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
2adc0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2add0 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  IN_JOURNAL .    
2ade0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2adf0 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b  E_OPEN_WAL.  ));
2ae00 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
2ae10 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55  nt zPath is a NU
2ae20 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73  LL pointer, this
2ae30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71   function is req
2ae40 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20  uired to open.  
2ae50 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ** a temporary f
2ae60 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75  ile. Use this bu
2ae70 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68  ffer to store th
2ae80 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a  e file name in..
2ae90 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70    */.  char zTmp
2aea0 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  name[MAX_PATHNAM
2aeb0 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  E+2];.  const ch
2aec0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74  ar *zName = zPat
2aed0 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  h;..  /* Check t
2aee0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
2aef0 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65  tements are true
2af00 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  : .  **.  **   (
2af10 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f  a) Exactly one o
2af20 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20  f the READWRITE 
2af30 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61  and READONLY fla
2af40 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20  gs must be set, 
2af50 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20  and .  **   (b) 
2af60 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74  if CREATE is set
2af70 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45  , then READWRITE
2af80 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
2af90 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63  t, and.  **   (c
2afa0 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69  ) if EXCLUSIVE i
2afb0 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
2afc0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
2afd0 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20  set..  **   (d) 
2afe0 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  if DELETEONCLOSE
2aff0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
2b000 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
2b010 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e set..  */.  as
2b020 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79  sert((isReadonly
2b030 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
2b040 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61  te==0) && (isRea
2b050 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64  dWrite || isRead
2b060 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74  only));.  assert
2b070 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20  (isCreate==0 || 
2b080 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20  isReadWrite);.  
2b090 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69  assert(isExclusi
2b0a0 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  ve==0 || isCreat
2b0b0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44  e);.  assert(isD
2b0c0 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72  elete==0 || isCr
2b0d0 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  eate);..  /* The
2b0e0 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a   main DB, main j
2b0f0 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65  ournal, WAL file
2b100 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
2b110 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20  nal are never . 
2b120 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
2b130 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61  y deleted. Nor a
2b140 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d  re they ever tem
2b150 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a  porary files.  *
2b160 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  /.  assert( (!is
2b170 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
2b180 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
2b190 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
2b1a0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
2b1b0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
2b1c0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
2b1d0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2b1e0 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
2b1f0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
2b200 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
2b210 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
2b220 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  ER_JOURNAL );.  
2b230 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
2b240 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
2b250 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
2b260 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20  EN_WAL );..  /* 
2b270 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
2b280 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
2b290 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
2b2a0 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
2b2b0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
2b2c0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2b2d0 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
2b2e0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2b2f0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20  OPEN_TEMP_DB .  
2b300 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
2b310 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2b320 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65  JOURNAL || eType
2b330 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
2b340 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  MP_JOURNAL .    
2b350 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2b360 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
2b370 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
2b380 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
2b390 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
2b3a0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2b3b0 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
2b3c0 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d  NT_DB || eType==
2b3d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
2b3e0 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70    );..  memset(p
2b3f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
2b400 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65  File));..  if( e
2b410 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2b420 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20  N_MAIN_DB ){.   
2b430 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
2b440 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75  Unused;.    pUnu
2b450 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62  sed = findReusab
2b460 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67  leFd(zName, flag
2b470 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75  s);.    if( pUnu
2b480 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20  sed ){.      fd 
2b490 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20  = pUnused->fd;. 
2b4a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b4b0 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65  pUnused = sqlite
2b4c0 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
2b4d0 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20  *pUnused));.    
2b4e0 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29    if( !pUnused )
2b4f0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2b500 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2b510 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2b520 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55   p->pUnused = pU
2b530 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44  nused;..    /* D
2b540 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
2b550 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72  s are double-zer
2b560 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20  o terminated if 
2b570 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 20  they are not.   
2b580 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61   ** URIs with pa
2b590 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65  rameters.  Hence
2b5a0 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79  , they can alway
2b5b0 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f  s be passed into
2b5c0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
2b5d0 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e  uri_parameter().
2b5e0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2b5f0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2b600 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61  OPEN_URI) || zNa
2b610 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  me[strlen(zName)
2b620 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c  +1]==0 );..  }el
2b630 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b  se if( !zName ){
2b640 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
2b650 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70   is NULL, the up
2b660 70 65 72 20 6c 61 79 65 72 20 69 73 20 72 65 71  per layer is req
2b670 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66  uesting a temp f
2b680 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ile. */.    asse
2b690 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21  rt(isDelete && !
2b6a0 73 79 6e 63 44 69 72 29 3b 0a 20 20 20 20 72 63  syncDir);.    rc
2b6b0 20 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61   = unixGetTempna
2b6c0 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me(MAX_PATHNAME+
2b6d0 32 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  2, zTmpname);.  
2b6e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b6f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2b700 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2b710 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61    zName = zTmpna
2b720 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  me;..    /* Gene
2b730 72 61 74 65 64 20 74 65 6d 70 6f 72 61 72 79 20  rated temporary 
2b740 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 61 6c  filenames are al
2b750 77 61 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f  ways double-zero
2b760 20 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20   terminated.    
2b770 2a 2a 20 66 6f 72 20 75 73 65 20 62 79 20 73 71  ** for use by sq
2b780 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
2b790 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73  ter(). */.    as
2b7a0 73 65 72 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c  sert( zName[strl
2b7b0 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20  en(zName)+1]==0 
2b7c0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  );.  }..  /* Det
2b7d0 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65  ermine the value
2b7e0 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70 61   of the flags pa
2b7f0 72 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74  rameter passed t
2b800 6f 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e  o POSIX function
2b810 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68  .  ** open(). Th
2b820 65 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63  ese must be calc
2b830 75 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f  ulated even if o
2b840 70 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c  pen() is not cal
2b850 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65  led, as.  ** the
2b860 79 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  y may be stored 
2b870 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  as part of the f
2b880 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75  ile handle and u
2b890 73 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  sed by the .  **
2b8a0 20 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f   'conch file' lo
2b8b0 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20  cking functions 
2b8c0 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20  later on.  */.  
2b8d0 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29  if( isReadonly )
2b8e0 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
2b8f0 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69  _RDONLY;.  if( i
2b900 73 52 65 61 64 57 72 69 74 65 20 29 20 6f 70 65  sReadWrite ) ope
2b910 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52  nFlags |= O_RDWR
2b920 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65  ;.  if( isCreate
2b930 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20   )    openFlags 
2b940 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66  |= O_CREAT;.  if
2b950 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20  ( isExclusive ) 
2b960 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f  openFlags |= (O_
2b970 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29  EXCL|O_NOFOLLOW)
2b980 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  ;.  openFlags |=
2b990 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f   (O_LARGEFILE|O_
2b9a0 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20  BINARY);..  if( 
2b9b0 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65  fd<0 ){.    mode
2b9c0 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20  _t openMode;    
2b9d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72            /* Per
2b9e0 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61  missions to crea
2b9f0 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a  te file with */.
2ba00 20 20 20 20 75 69 64 5f 74 20 75 69 64 3b 20 20      uid_t uid;  
2ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba20 20 20 2f 2a 20 55 73 65 72 69 64 20 66 6f 72 20    /* Userid for 
2ba30 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
2ba40 67 69 64 5f 74 20 67 69 64 3b 20 20 20 20 20 20  gid_t gid;      
2ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ba60 20 47 72 6f 75 70 69 64 20 66 6f 72 20 74 68 65   Groupid for the
2ba70 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20   file */.    rc 
2ba80 3d 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65  = findCreateFile
2ba90 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67  Mode(zName, flag
2baa0 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75  s, &openMode, &u
2bab0 69 64 2c 20 26 67 69 64 29 3b 0a 20 20 20 20 69  id, &gid);.    i
2bac0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2bad0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2bae0 28 20 21 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b  ( !p->pUnused );
2baf0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
2bb00 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2bb10 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  N_WAL || eType==
2bb20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2bb30 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20  _JOURNAL );.    
2bb40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2bb50 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75   }.    fd = robu
2bb60 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f  st_open(zName, o
2bb70 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
2bb80 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  de);.    OSTRACE
2bb90 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20  (("OPENX   %-3d 
2bba0 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a  %s 0%o\n", fd, z
2bbb0 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29  Name, openFlags)
2bbc0 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  );.    if( fd<0 
2bbd0 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52  && errno!=EISDIR
2bbe0 20 26 26 20 69 73 52 65 61 64 57 72 69 74 65 20   && isReadWrite 
2bbf0 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20  && !isExclusive 
2bc00 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  ){.      /* Fail
2bc10 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66  ed to open the f
2bc20 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ile for read/wri
2bc30 74 65 20 61 63 63 65 73 73 2e 20 54 72 79 20 72  te access. Try r
2bc40 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  ead-only. */.   
2bc50 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51     flags &= ~(SQ
2bc60 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2bc70 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
2bc80 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 6f  CREATE);.      o
2bc90 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f  penFlags &= ~(O_
2bca0 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20  RDWR|O_CREAT);. 
2bcb0 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
2bcc0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2bcd0 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c  LY;.      openFl
2bce0 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  ags |= O_RDONLY;
2bcf0 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c  .      isReadonl
2bd00 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 64 20  y = 1;.      fd 
2bd10 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e  = robust_open(zN
2bd20 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
2bd30 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d  openMode);.    }
2bd40 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
2bd50 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
2bd60 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2bd70 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
2bd80 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  open", zName);. 
2bd90 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
2bda0 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a  inished;.    }..
2bdb0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
2bdc0 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e  rocess is runnin
2bdd0 67 20 61 73 20 72 6f 6f 74 20 61 6e 64 20 69 66  g as root and if
2bde0 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20   creating a new 
2bdf0 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20  rollback.    ** 
2be00 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66  journal or WAL f
2be10 69 6c 65 2c 20 73 65 74 20 74 68 65 20 6f 77 6e  ile, set the own
2be20 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 6a 6f  ership of the jo
2be30 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20  urnal or WAL to 
2be40 62 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61  be.    ** the sa
2be50 6d 65 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e  me as the origin
2be60 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  al database..   
2be70 20 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67   */.    if( flag
2be80 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
2be90 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  _WAL|SQLITE_OPEN
2bea0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29  _MAIN_JOURNAL) )
2beb0 7b 0a 20 20 20 20 20 20 6f 73 46 63 68 6f 77 6e  {.      osFchown
2bec0 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a  (fd, uid, gid);.
2bed0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
2bee0 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69  rt( fd>=0 );.  i
2bef0 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a  f( pOutFlags ){.
2bf00 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
2bf10 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
2bf20 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b  f( p->pUnused ){
2bf30 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d  .    p->pUnused-
2bf40 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d  >fd = fd;.    p-
2bf50 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20  >pUnused->flags 
2bf60 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
2bf70 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a  if( isDelete ){.
2bf80 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2bf90 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65     zPath = zName
2bfa0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e  ;.#else.    osUn
2bfb0 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e  link(zName);.#en
2bfc0 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  dif.  }.#if SQLI
2bfd0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2bfe0 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a  G_STYLE.  else{.
2bff0 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73      p->openFlags
2c000 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
2c010 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f  }.#endif..  noLo
2c020 63 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49  ck = eType!=SQLI
2c030 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b  TE_OPEN_MAIN_DB;
2c040 0a 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64  ..  .#if defined
2c050 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53  (__APPLE__) || S
2c060 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2c070 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28  KING_STYLE.  if(
2c080 20 66 73 74 61 74 66 73 28 66 64 2c 20 26 66 73   fstatfs(fd, &fs
2c090 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
2c0a0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
2c0b0 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  File)->lastErrno
2c0c0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 6f   = errno;.    ro
2c0d0 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64  bust_close(p, fd
2c0e0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2c0f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2c100 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d  OERR_ACCESS;.  }
2c110 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e  .  if (0 == strn
2c120 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49  cmp("msdos", fsI
2c130 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
2c140 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e  , 5)) {.    ((un
2c150 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
2c160 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  fsFlags |= SQLIT
2c170 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
2c180 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  OS;.  }.#endif..
2c190 20 20 2f 2a 20 53 65 74 20 75 70 20 61 70 70 72    /* Set up appr
2c1a0 6f 70 72 69 61 74 65 20 63 74 72 6c 46 6c 61 67  opriate ctrlFlag
2c1b0 73 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 65 6c  s */.  if( isDel
2c1c0 65 74 65 20 29 20 20 20 20 20 20 20 20 20 20 20  ete )           
2c1d0 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
2c1e0 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  = UNIXFILE_DELET
2c1f0 45 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f  E;.  if( isReado
2c200 6e 6c 79 20 29 20 20 20 20 20 20 20 20 20 20 20  nly )           
2c210 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
2c220 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b  UNIXFILE_RDONLY;
2c230 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20  .  if( noLock ) 
2c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c250 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
2c260 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20  IXFILE_NOLOCK;. 
2c270 20 69 66 28 20 73 79 6e 63 44 69 72 20 29 20 20   if( syncDir )  
2c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2c290 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2c2a0 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20  FILE_DIRSYNC;.  
2c2b0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
2c2c0 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63 74  TE_OPEN_URI ) ct
2c2d0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2c2e0 49 4c 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51  ILE_URI;..#if SQ
2c2f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2c300 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51  ING_STYLE.#if SQ
2c310 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
2c320 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75  Y_LOCKING.  isAu
2c330 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e  toProxy = 1;.#en
2c340 64 69 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f  dif.  if( isAuto
2c350 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21  Proxy && (zPath!
2c360 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f  =NULL) && (!noLo
2c370 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70  ck) && pVfs->xOp
2c380 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  en ){.    char *
2c390 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e  envforce = geten
2c3a0 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  v("SQLITE_FORCE_
2c3b0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b  PROXY_LOCKING");
2c3c0 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78  .    int useProx
2c3d0 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  y = 0;..    /* S
2c3e0 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
2c3f0 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61  Y_LOCKING==1 mea
2c400 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20  ns force always 
2c410 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61  use proxy, 0 mea
2c420 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72  ns .    ** never
2c430 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c   use proxy, NULL
2c440 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79   means use proxy
2c450 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66   for non-local f
2c460 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20  iles only.  */. 
2c470 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21     if( envforce!
2c480 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75  =NULL ){.      u
2c490 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65  seProxy = atoi(e
2c4a0 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20  nvforce)>0;.    
2c4b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
2c4c0 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26   statfs(zPath, &
2c4d0 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b  fsInfo) == -1 ){
2c4e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  .        /* In t
2c4f0 68 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65  heory, the close
2c500 28 66 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62  (fd) call is sub
2c510 2d 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65  -optimal. If the
2c520 20 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20   file opened.   
2c530 20 20 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20       ** with fd 
2c540 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
2c550 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  le, and there ar
2c560 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
2c570 6f 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20  ons open.       
2c580 20 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65   ** on that file
2c590 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
2c5a0 74 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69  tly holding advi
2c5b0 73 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74  sory locks on it
2c5c0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
2c5d0 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c  n the call to cl
2c5e0 6f 73 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65  ose() will cance
2c5f0 6c 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49  l those locks. I
2c600 6e 20 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20  n practice,.    
2c610 20 20 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73      ** we're ass
2c620 75 6d 69 6e 67 20 74 68 61 74 20 73 74 61 74 66  uming that statf
2c630 73 28 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c  s() doesn't fail
2c640 20 76 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20   very often. At 
2c650 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  least.        **
2c660 20 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72   not while other
2c670 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2c680 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  s opened by the 
2c690 73 61 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a  same process on.
2c6a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
2c6b0 61 6d 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72  ame file are wor
2c6c0 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20  king.  */.      
2c6d0 20 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d    p->lastErrno =
2c6e0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
2c6f0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20  robust_close(p, 
2c700 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
2c710 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2c720 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
2c730 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  .        goto op
2c740 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
2c750 20 20 20 7d 0a 20 20 20 20 20 20 75 73 65 50 72     }.      usePr
2c760 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66  oxy = !(fsInfo.f
2c770 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c  _flags&MNT_LOCAL
2c780 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2c790 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20   useProxy ){.   
2c7a0 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e     rc = fillInUn
2c7b0 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c  ixFile(pVfs, fd,
2c7c0 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63   pFile, zPath, c
2c7d0 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  trlFlags);.     
2c7e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c7f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2c800 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
2c810 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46  mUnixFile((unixF
2c820 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75  ile*)pFile, ":au
2c830 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69  to:");.        i
2c840 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c850 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2c860 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74   Use unixClose t
2c870 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72  o clean up the r
2c880 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69  esources added i
2c890 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  n fillInUnixFile
2c8a0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
2c8b0 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65  nd clear all the
2c8c0 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66   structure's ref
2c8d0 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66  erences.  Specif
2c8e0 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20  ically, .       
2c8f0 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65     ** pFile->pMe
2c900 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55  thods will be NU
2c910 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43  LL so sqlite3OsC
2c920 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e  lose will be a n
2c930 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20  o-op .          
2c940 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  */.          uni
2c950 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20  xClose(pFile);. 
2c960 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2c970 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2c980 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
2c990 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
2c9a0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2c9b0 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  .  .  rc = fillI
2c9c0 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
2c9d0 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
2c9e0 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f  , ctrlFlags);..o
2c9f0 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20  pen_finished:.  
2ca00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ca10 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
2ca20 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64  _free(p->pUnused
2ca30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2ca40 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  rc;.}.../*.** De
2ca50 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74  lete the file at
2ca60 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64   zPath. If the d
2ca70 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20  irSync argument 
2ca80 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  is true, fsync()
2ca90 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
2caa0 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67  y after deleting
2cab0 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
2cac0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c  atic int unixDel
2cad0 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ete(.  sqlite3_v
2cae0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20  fs *NotUsed,    
2caf0 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69   /* VFS containi
2cb00 6e 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78  ng this as the x
2cb10 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f  Delete method */
2cb20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2cb30 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20  Path,        /* 
2cb40 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
2cb50 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  be deleted */.  
2cb60 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20  int dirSync     
2cb70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2cb80 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69  true, fsync() di
2cb90 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
2cba0 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29  leting file */.)
2cbb0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2cbc0 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44  ITE_OK;.  UNUSED
2cbd0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2cbe0 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ed);.  SimulateI
2cbf0 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
2cc00 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
2cc10 45 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69  E);.  if( osUnli
2cc20 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20  nk(zPath)==(-1) 
2cc30 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72 6e 6f  ){.    if( errno
2cc40 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20  ==ENOENT ){.    
2cc50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
2cc60 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
2cc70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2cc80 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
2cc90 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
2cca0 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e  R_DELETE, "unlin
2ccb0 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  k", zPath);.    
2ccc0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
2ccd0 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
2cce0 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
2ccf0 59 4e 43 0a 20 20 69 66 28 20 28 64 69 72 53 79  YNC.  if( (dirSy
2cd00 6e 63 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20  nc & 1)!=0 ){.  
2cd10 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63    int fd;.    rc
2cd20 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f   = osOpenDirecto
2cd30 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a  ry(zPath, &fd);.
2cd40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2cd50 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f  TE_OK ){.#if OS_
2cd60 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66  VXWORKS.      if
2cd70 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20  ( fsync(fd)==-1 
2cd80 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66  ).#else.      if
2cd90 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65  ( fsync(fd) ).#e
2cda0 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
2cdb0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
2cdc0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
2cdd0 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22  ERR_DIR_FSYNC, "
2cde0 66 73 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a  fsync", zPath);.
2cdf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f        }.      ro
2ce00 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64  bust_close(0, fd
2ce10 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2ce20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
2ce30 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
2ce40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2ce50 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2ce60 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
2ce70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2ce80 65 73 74 20 74 68 65 20 65 78 69 73 74 61 6e 63  est the existanc
2ce90 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70  e of or access p
2cea0 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69  ermissions of fi
2ceb0 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a  le zPath. The.**
2cec0 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20   test performed 
2ced0 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76  depends on the v
2cee0 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  alue of flags:.*
2cef0 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
2cf00 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52  ACCESS_EXISTS: R
2cf10 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
2cf20 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20  ile exists.**   
2cf30 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
2cf40 52 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72  READWRITE: Retur
2cf50 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
2cf60 69 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  is read and writ
2cf70 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c  able..**     SQL
2cf80 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f  ITE_ACCESS_READO
2cf90 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66  NLY: Return 1 if
2cfa0 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
2cfb0 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  dable..**.** Oth
2cfc0 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e  erwise return 0.
2cfd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2cfe0 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c  nixAccess(.  sql
2cff0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2d000 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20  d,   /* The VFS 
2d010 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
2d020 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a  xAccess method *
2d030 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2d040 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50  zPath,      /* P
2d050 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ath of the file 
2d060 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20  to examine */.  
2d070 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
2d080 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
2d090 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65  do we want to le
2d0a0 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50  arn about the zP
2d0b0 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69  ath file? */.  i
2d0c0 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20  nt *pResOut     
2d0d0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
2d0e0 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68  result boolean h
2d0f0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2d100 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55  amode = 0;.  UNU
2d110 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2d120 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
2d130 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
2d140 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
2d150 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74  CCESS; );.  swit
2d160 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
2d170 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
2d180 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20  ESS_EXISTS:.    
2d190 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a    amode = F_OK;.
2d1a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2d1b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
2d1c0 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20  ESS_READWRITE:. 
2d1d0 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f       amode = W_O
2d1e0 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  K|R_OK;.      br
2d1f0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2d200 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
2d210 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
2d220 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  R_OK;.      brea
2d230 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  k;..    default:
2d240 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22  .      assert(!"
2d250 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72  Invalid flags ar
2d260 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20  gument");.  }.  
2d270 2a 70 52 65 73 4f 75 74 20 3d 20 28 6f 73 41 63  *pResOut = (osAc
2d280 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64  cess(zPath, amod
2d290 65 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c  e)==0);.  if( fl
2d2a0 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45  ags==SQLITE_ACCE
2d2b0 53 53 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52  SS_EXISTS && *pR
2d2c0 65 73 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72  esOut ){.    str
2d2d0 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
2d2e0 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28    if( 0==osStat(
2d2f0 7a 50 61 74 68 2c 20 26 62 75 66 29 20 26 26 20  zPath, &buf) && 
2d300 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29  buf.st_size==0 )
2d310 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74  {.      *pResOut
2d320 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2d330 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d340 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75  OK;.}.../*.** Tu
2d350 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
2d360 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
2d370 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ll pathname. The
2d380 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a   relative path.*
2d390 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61  * is stored as a
2d3a0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
2d3b0 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75  string in the bu
2d3c0 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
2d3d0 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a  by.** zPath. .**
2d3e0 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20  .** zOut points 
2d3f0 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
2d400 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f  t least sqlite3_
2d410 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62  vfs.mxPathname b
2d420 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69  ytes .** (in thi
2d430 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48  s case, MAX_PATH
2d440 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65  NAME bytes). The
2d450 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72   full-path is wr
2d460 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73  itten to.** this
2d470 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72   buffer before r
2d480 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
2d490 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c  tic int unixFull
2d4a0 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
2d4b0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2d4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2d4d0 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
2d4e0 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
2d4f0 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
2d500 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
2d510 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
2d520 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
2d530 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
2d540 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2d550 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
2d560 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
2d570 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20  char *zOut      
2d580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d590 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
2d5a0 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  /.){..  /* It's 
2d5b0 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
2d5c0 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
2d5d0 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
2d5e0 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
2d5f0 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
2d600 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
2d610 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
2d620 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
2d630 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
2d640 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
2d650 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
2d660 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
2d670 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
2d680 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
2d690 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
2d6a0 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
2d6b0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
2d6c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2d6d0 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72  RROR );..  asser
2d6e0 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  t( pVfs->mxPathn
2d6f0 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d  ame==MAX_PATHNAM
2d700 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  E );.  UNUSED_PA
2d710 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a  RAMETER(pVfs);..
2d720 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d    zOut[nOut-1] =
2d730 20 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61   '\0';.  if( zPa
2d740 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  th[0]=='/' ){.  
2d750 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2d760 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22  tf(nOut, zOut, "
2d770 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d  %s", zPath);.  }
2d780 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43  else{.    int nC
2d790 77 64 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65  wd;.    if( osGe
2d7a0 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d  tcwd(zOut, nOut-
2d7b0 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  1)==0 ){.      r
2d7c0 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
2d7d0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
2d7e0 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64  EN_BKPT, "getcwd
2d7f0 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  ", zPath);.    }
2d800 0a 20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74  .    nCwd = (int
2d810 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20  )strlen(zOut);. 
2d820 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2d830 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26  ntf(nOut-nCwd, &
2d840 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73  zOut[nCwd], "/%s
2d850 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  ", zPath);.  }. 
2d860 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d870 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  K;.}...#ifndef S
2d880 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
2d890 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
2d8a0 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
2d8b0 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
2d8c0 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
2d8d0 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
2d8e0 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
2d8f0 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
2d900 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
2d910 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  ed library..*/.#
2d920 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68  include <dlfcn.h
2d930 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75  >.static void *u
2d940 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65  nixDlOpen(sqlite
2d950 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2d960 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2d970 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44  ename){.  UNUSED
2d980 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2d990 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c  ed);.  return dl
2d9a0 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
2d9b0 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f  RTLD_NOW | RTLD_
2d9c0 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  GLOBAL);.}../*.*
2d9d0 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74  * SQLite calls t
2d9e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d  his function imm
2d9f0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61  ediately after a
2da00 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53   call to unixDlS
2da10 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44  ym() or.** unixD
2da20 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72  lOpen() fails (r
2da30 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f  eturns a null po
2da40 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72  inter). If a mor
2da50 65 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72  e detailed error
2da60 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61  .** message is a
2da70 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20  vailable, it is 
2da80 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f  written to zBufO
2da90 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  ut. If no error 
2daa0 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76  message.** is av
2dab0 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74  ailable, zBufOut
2dac0 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66   is left unmodif
2dad0 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75  ied and SQLite u
2dae0 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a  ses a default.**
2daf0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
2db00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
2db10 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74  nixDlError(sqlit
2db20 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2db30 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
2db40 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e  *zBufOut){.  con
2db50 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  st char *zErr;. 
2db60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2db70 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e  R(NotUsed);.  un
2db80 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2db90 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72    zErr = dlerror
2dba0 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29  ();.  if( zErr )
2dbb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
2dbc0 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
2dbd0 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72  fOut, "%s", zErr
2dbe0 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
2dbf0 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61  veMutex();.}.sta
2dc00 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44  tic void (*unixD
2dc10 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
2dc20 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20   *NotUsed, void 
2dc30 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a  *p, const char*z
2dc40 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f  Sym))(void){.  /
2dc50 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68  * .  ** GCC with
2dc60 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72   -pedantic-error
2dc70 73 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20  s says that C90 
2dc80 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  does not allow a
2dc90 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a   void* to be.  *
2dca0 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f  * cast into a po
2dcb0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
2dcc0 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68  ion.  And yet th
2dcd0 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28  e library dlsym(
2dce0 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72  ) routine.  ** r
2dcf0 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77  eturns a void* w
2dd00 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61  hich is really a
2dd10 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
2dd20 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20  nction.  So how 
2dd30 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64  do we.  ** use d
2dd40 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64  lsym() with -ped
2dd50 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20  antic-errors?.  
2dd60 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65  **.  ** Variable
2dd70 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69   x below is defi
2dd80 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e  ned to be a poin
2dd90 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
2dda0 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61  n taking.  ** pa
2ddb0 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61  rameters void* a
2ddc0 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61  nd const char* a
2ddd0 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70  nd returning a p
2dde0 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
2ddf0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e  tion..  ** We in
2de00 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73  itialize x by as
2de10 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69  signing it a poi
2de20 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79  nter to the dlsy
2de30 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  m() function..  
2de40 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d  ** (That assignm
2de50 65 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63  ent requires a c
2de60 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63  ast.)  Then we c
2de70 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  all the function
2de80 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69   that.  ** x poi
2de90 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20  nts to.  .  **. 
2dea0 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72   ** This work-ar
2deb0 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79  ound is unlikely
2dec0 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74   to work correct
2ded0 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d  ly on any system
2dee0 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20   where.  ** you 
2def0 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61  really cannot ca
2df00 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f  st a function po
2df10 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a  inter into void*
2df20 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20  .  But then, on 
2df30 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68  the.  ** other h
2df40 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c  and, dlsym() wil
2df50 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75  l not work on su
2df60 63 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68  ch a system eith
2df70 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20  er, so we have. 
2df80 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c   ** not really l
2df90 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20  ost anything..  
2dfa0 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29  */.  void (*(*x)
2dfb0 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
2dfc0 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e  r*))(void);.  UN
2dfd0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2dfe0 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28  otUsed);.  x = (
2dff0 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c  void(*(*)(void*,
2e000 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f  const char*))(vo
2e010 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74  id))dlsym;.  ret
2e020 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d  urn (*x)(p, zSym
2e030 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
2e040 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c   unixDlClose(sql
2e050 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2e060 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  d, void *pHandle
2e070 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2e080 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2e090 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c    dlclose(pHandl
2e0a0 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  e);.}.#else /* i
2e0b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
2e0c0 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20  AD_EXTENSION is 
2e0d0 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64  defined: */.  #d
2e0e0 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e  efine unixDlOpen
2e0f0 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e    0.  #define un
2e100 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  ixDlError 0.  #d
2e110 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20  efine unixDlSym 
2e120 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e    0.  #define un
2e130 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64  ixDlClose 0.#end
2e140 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
2e150 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61  nBuf bytes of ra
2e160 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65  ndom data to the
2e170 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72   supplied buffer
2e180 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63   zBuf..*/.static
2e190 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e   int unixRandomn
2e1a0 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
2e1b0 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42  *NotUsed, int nB
2e1c0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
2e1d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2e1e0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2e1f0 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e  assert((size_t)n
2e200 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d  Buf>=(sizeof(tim
2e210 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29  e_t)+sizeof(int)
2e220 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76  ));..  /* We hav
2e230 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
2e240 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20  zBuf to prevent 
2e250 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65  valgrind from re
2e260 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72  porting.  ** err
2e270 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74  ors.  The report
2e280 73 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67  s issued by valg
2e290 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65  rind are incorre
2e2a0 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20  ct - we would.  
2e2b0 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74  ** prefer that t
2e2c0 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65  he randomness be
2e2d0 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61   increased by ma
2e2e0 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a  king use of the.
2e2f0 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a    ** uninitializ
2e300 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66  ed space in zBuf
2e310 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20   - but valgrind 
2e320 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77  errors tend to w
2e330 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75  orry.  ** some u
2e340 73 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68  sers.  Rather th
2e350 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65  an argue, it see
2e360 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74  ms easier just t
2e370 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a  o initialize.  *
2e380 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61  * the whole arra
2e390 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61  y and silence va
2e3a0 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20  lgrind, even if 
2e3b0 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20  that means less 
2e3c0 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20  randomness.  ** 
2e3d0 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65  in the random se
2e3e0 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ed..  **.  ** Wh
2e3f0 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74  en testing, init
2e400 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20  ializing zBuf[] 
2e410 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77  to zero is all w
2e420 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e  e do.  That mean
2e430 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61  s.  ** that we a
2e440 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61  lways use the sa
2e450 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  me random number
2e460 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73   sequence.  This
2e470 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20   makes the.  ** 
2e480 74 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65  tests repeatable
2e490 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
2e4a0 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a  zBuf, 0, nBuf);.
2e4b0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2e4c0 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20  ITE_TEST).  {.  
2e4d0 20 20 69 6e 74 20 70 69 64 2c 20 66 64 2c 20 67    int pid, fd, g
2e4e0 6f 74 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62  ot;.    fd = rob
2e4f0 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75  ust_open("/dev/u
2e500 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c  random", O_RDONL
2e510 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66  Y, 0);.    if( f
2e520 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d  d<0 ){.      tim
2e530 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d  e_t t;.      tim
2e540 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d  e(&t);.      mem
2e550 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69  cpy(zBuf, &t, si
2e560 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20  zeof(t));.      
2e570 70 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a  pid = getpid();.
2e580 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42        memcpy(&zB
2e590 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26  uf[sizeof(t)], &
2e5a0 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29  pid, sizeof(pid)
2e5b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2e5c0 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f   sizeof(t)+sizeo
2e5d0 66 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29  f(pid)<=(size_t)
2e5e0 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42  nBuf );.      nB
2e5f0 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b  uf = sizeof(t) +
2e600 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20   sizeof(pid);.  
2e610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
2e620 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28  o{ got = osRead(
2e630 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b  fd, zBuf, nBuf);
2e640 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26   }while( got<0 &
2e650 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
2e660 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  ;.      robust_c
2e670 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49  lose(0, fd, __LI
2e680 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NE__);.    }.  }
2e690 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
2e6a0 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   nBuf;.}.../*.**
2e6b0 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
2e6c0 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
2e6d0 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
2e6e0 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20   time slept..** 
2e6f0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
2e700 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
2e710 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61  croseconds we wa
2e720 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20  nt to sleep..** 
2e730 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
2e740 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2e750 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f  f microseconds o
2e760 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79  f sleep actually
2e770 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72  .** requested fr
2e780 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  om the underlyin
2e790 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
2e7a0 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69  em, a number whi
2e7b0 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67  ch.** might be g
2e7c0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
2e7d0 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75  qual to the argu
2e7e0 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65  ment, but not le
2e7f0 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61  ss.** than the a
2e800 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
2e810 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70  ic int unixSleep
2e820 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2e830 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f  tUsed, int micro
2e840 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53  seconds){.#if OS
2e850 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
2e860 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a  t timespec sp;..
2e870 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69    sp.tv_sec = mi
2e880 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30  croseconds / 100
2e890 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73  0000;.  sp.tv_ns
2e8a0 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e  ec = (microsecon
2e8b0 64 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20  ds % 1000000) * 
2e8c0 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65  1000;.  nanoslee
2e8d0 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20  p(&sp, NULL);.  
2e8e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2e8f0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
2e900 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  urn microseconds
2e910 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
2e920 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20  HAVE_USLEEP) && 
2e930 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73  HAVE_USLEEP.  us
2e940 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64  leep(microsecond
2e950 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  s);.  UNUSED_PAR
2e960 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
2e970 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73  .  return micros
2e980 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20  econds;.#else.  
2e990 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d  int seconds = (m
2e9a0 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39  icroseconds+9999
2e9b0 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73  99)/1000000;.  s
2e9c0 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20  leep(seconds);. 
2e9d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2e9e0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
2e9f0 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30  turn seconds*100
2ea00 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  0000;.#endif.}..
2ea10 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
2ea20 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66  ing variable, if
2ea30 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65   set to a non-ze
2ea40 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74  ro value, is int
2ea50 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74  erpreted as.** t
2ea60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63  he number of sec
2ea70 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20  onds since 1970 
2ea80 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73  and is used to s
2ea90 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
2eaa0 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72  .** sqlite3OsCur
2eab0 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e  rentTime() durin
2eac0 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  g testing..*/.#i
2ead0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2eae0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
2eaf0 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20  rent_time = 0;  
2eb00 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74  /* Fake system t
2eb10 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73  ime in seconds s
2eb20 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65  ince 1970. */.#e
2eb30 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  ndif../*.** Find
2eb40 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
2eb50 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
2eb60 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
2eb70 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
2eb80 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72  piNow.** the cur
2eb90 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
2eba0 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
2ebb0 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20  ay number times 
2ebc0 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a  86_400_000.  In.
2ebd0 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  ** other words, 
2ebe0 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  write into *piNo
2ebf0 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  w the number of 
2ec00 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e  milliseconds sin
2ec10 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a  ce the Julian.**
2ec20 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69   epoch of noon i
2ec30 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e  n Greenwich on N
2ec40 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34  ovember 24, 4714
2ec50 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74   B.C according t
2ec60 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74  o the.** prolept
2ec70 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c  ic Gregorian cal
2ec80 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  endar..**.** On 
2ec90 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
2eca0 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75  SQLITE_OK.  Retu
2ecb0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
2ecc0 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
2ecd0 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  date .** cannot 
2ece0 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
2ecf0 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72  tic int unixCurr
2ed00 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c  entTimeInt64(sql
2ed10 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2ed20 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
2ed30 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74   *piNow){.  stat
2ed40 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2ed50 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68  _int64 unixEpoch
2ed60 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c   = 24405875*(sql
2ed70 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30  ite3_int64)86400
2ed80 30 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  00;.  int rc = S
2ed90 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65  QLITE_OK;.#if de
2eda0 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29  fined(NO_GETTOD)
2edb0 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74  .  time_t t;.  t
2edc0 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f  ime(&t);.  *piNo
2edd0 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e  w = ((sqlite3_in
2ede0 74 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e  t64)t)*1000 + un
2edf0 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f  ixEpoch;.#elif O
2ee00 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
2ee10 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77  ct timespec sNow
2ee20 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d  ;.  clock_gettim
2ee30 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45  e(CLOCK_REALTIME
2ee40 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e  , &sNow);.  *piN
2ee50 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b  ow = unixEpoch +
2ee60 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
2ee70 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63  nt64)sNow.tv_sec
2ee80 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f   + sNow.tv_nsec/
2ee90 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20  1000000;.#else. 
2eea0 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
2eeb0 73 4e 6f 77 3b 0a 20 20 69 66 28 20 67 65 74 74  sNow;.  if( gett
2eec0 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20  imeofday(&sNow, 
2eed0 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 69  0)==0 ){.    *pi
2eee0 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20  Now = unixEpoch 
2eef0 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  + 1000*(sqlite3_
2ef00 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65  int64)sNow.tv_se
2ef10 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63  c + sNow.tv_usec
2ef20 2f 31 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  /1000;.  }else{.
2ef30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ef40 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69  ERROR;.  }.#endi
2ef50 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
2ef60 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
2ef70 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
2ef80 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d   ){.    *piNow =
2ef90 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
2efa0 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72  nt64)sqlite3_cur
2efb0 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78  rent_time + unix
2efc0 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69  Epoch;.  }.#endi
2efd0 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  f.  UNUSED_PARAM
2efe0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2eff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2f000 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
2f010 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
2f020 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
2f030 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
2f040 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
2f050 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
2f060 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
2f070 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
2f080 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
2f090 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
2f0a0 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
2f0b0 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
2f0c0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
2f0d0 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
2f0e0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  e(sqlite3_vfs *N
2f0f0 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a  otUsed, double *
2f100 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65  prNow){.  sqlite
2f110 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20  3_int64 i = 0;. 
2f120 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45   int rc;.  UNUSE
2f130 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2f140 73 65 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69  sed);.  rc = uni
2f150 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
2f160 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e  4(0, &i);.  *prN
2f170 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e  ow = i/86400000.
2f180 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
2f190 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65  }../*.** We adde
2f1a0 64 20 74 68 65 20 78 47 65 74 4c 61 73 74 45 72  d the xGetLastEr
2f1b0 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74  ror() method wit
2f1c0 68 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20  h the intention 
2f1d0 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20  of providing.** 
2f1e0 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c  better low-level
2f1f0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
2f200 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73  when operating-s
2f210 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63  ystem problems c
2f220 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67  ome up.** during
2f230 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f   SQLite operatio
2f240 6e 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20  n.  But so far, 
2f250 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73  none of that has
2f260 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65   been implemente
2f270 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65  d.** in the core
2f280 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69  .  So this routi
2f290 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
2f2a0 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74  ed.  For now, it
2f2b0 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20   is merely.** a 
2f2c0 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f  place-holder..*/
2f2d0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2f2e0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
2f2f0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2f300 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c  d, int NotUsed2,
2f310 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29   char *NotUsed3)
2f320 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2f330 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2f340 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2f350 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55  R(NotUsed2);.  U
2f360 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2f370 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74  NotUsed3);.  ret
2f380 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
2f390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f3a0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71  ****** End of sq
2f3b0 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
2f3c0 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
2f3d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2f3e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
2f430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2f480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f490 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
2f4a0 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a  Proxy Locking **
2f4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2f4d0 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69  *.** Proxy locki
2f4e0 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f  ng is a "uber-lo
2f4f0 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e  cking-method" in
2f500 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74   this sense:  It
2f510 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68   uses the.** oth
2f520 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  er locking metho
2f530 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20  ds on secondary 
2f540 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f  lock files.  Pro
2f550 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a  xy locking is a.
2f560 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76  ** meta-layer ov
2f570 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72  er top of the pr
2f580 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20  imitive locking 
2f590 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76  implemented abov
2f5a0 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20  e.  For.** this 
2f5b0 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69  reason, the divi
2f5c0 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d  sion that implem
2f5d0 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f  ents of proxy lo
2f5e0 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65  cking is deferre
2f5f0 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20  d.** until late 
2f600 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65 72  in the file (her
2f610 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20  e) after all of 
2f620 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65  the other I/O me
2f630 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65  thods have.** be
2f640 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20  en defined - so 
2f650 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69  that the primiti
2f660 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  ve locking metho
2f670 64 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ds are available
2f680 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73 20  .** as services 
2f690 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68 65  to help with the
2f6a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2f6b0 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  of proxy locking
2f6c0 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  ..**.****.**.** 
2f6d0 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  The default lock
2f6e0 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53  ing schemes in S
2f6f0 51 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d 72  QLite use byte-r
2f700 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ange locks on th
2f710 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
2f720 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65  le to coordinate
2f730 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e   safe, concurren
2f740 74 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  t access by mult
2f750 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20  iple readers.** 
2f760 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74 74  and writers [htt
2f770 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c  p://sqlite.org/l
2f780 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20  ockingv3.html]. 
2f790 20 54 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c   The five file l
2f7a0 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  ocking.** states
2f7b0 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44   (UNLOCKED, PEND
2f7c0 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53  ING, SHARED, RES
2f7d0 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45  ERVED, EXCLUSIVE
2f7e0 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
2f7f0 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65  d.** as POSIX re
2f800 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73  ad & write locks
2f810 20 6f 76 65 72 20 66 69 78 65 64 20 73 65 74 20   over fixed set 
2f820 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69  of locations (vi
2f830 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20  a fsctl),.** on 
2f840 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79  AFP and SMB only
2f850 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d   exclusive byte-
2f860 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
2f870 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73  available via fs
2f880 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57  ctl.** with _IOW
2f890 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63  R('z', 23, struc
2f8a0 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
2f8b0 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65  B2) to track the
2f8c0 20 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a   same 5 states..
2f8d0 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61  ** To simulate a
2f8e0 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20   F_RDLCK on the 
2f8f0 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e  shared range, on
2f900 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20   AFP a randomly 
2f910 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72  selected.** addr
2f920 65 73 73 20 69 6e 20 74 68 65 20 73 68 61 72 65  ess in the share
2f930 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e  d range is taken
2f940 20 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f   for a SHARED lo
2f950 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a  ck, the entire.*
2f960 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69  * shared range i
2f970 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45  s taken for an E
2f980 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a  XCLUSIVE lock):.
2f990 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49  **.**      PENDI
2f9a0 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 30  NG_BYTE        0
2f9b0 78 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20  x40000000.**    
2f9c0 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20    RESERVED_BYTE 
2f9d0 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31        0x40000001
2f9e0 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f  .**      SHARED_
2f9f0 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34  RANGE        0x4
2fa00 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30  0000002 -> 0x400
2fa10 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73  00200.**.** This
2fa20 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74   works well on t
2fa30 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
2fa40 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20  stem, but shows 
2fa50 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a  a nearly 100x.**
2fa60 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61   slowdown in rea
2fa70 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e  d performance on
2fa80 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65   AFP because the
2fa90 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61   AFP client disa
2faa0 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64  bles.** the read
2fab0 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65   cache when byte
2fac0 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
2fad0 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c   present.  Enabl
2fae0 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20  ing the read.** 
2faf0 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20  cache exposes a 
2fb00 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
2fb10 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20  problem that is 
2fb20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f  present on all O
2fb30 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64  S X.** supported
2fb40 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79   network file sy
2fb50 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20  stems.  NFS and 
2fb60 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65  AFP both observe
2fb70 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f   the.** close-to
2fb80 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20  -open semantics 
2fb90 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63  for ensuring cac
2fba0 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20  he coherency.** 
2fbb0 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72  [http://nfs.sour
2fbc0 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71  ceforge.net/#faq
2fbd0 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73  _a8], which does
2fbe0 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79   not effectively
2fbf0 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20  .** address the 
2fc00 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72  requirements for
2fc10 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61   concurrent data
2fc20 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d  base access by m
2fc30 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65  ultiple.** reade
2fc40 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a  rs and writers.*
2fc50 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61  * [http://www.na
2fc60 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d  bble.com/SQLite-
2fc70 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68  on-NFS-cache-coh
2fc80 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30  erency-td1565570
2fc90 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54  1.html]..**.** T
2fca0 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65  o address the pe
2fcb0 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61  rformance and ca
2fcc0 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73  che coherency is
2fcd0 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65  sues, proxy file
2fce0 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e   locking.** chan
2fcf0 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61  ges the way data
2fd00 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63  base access is c
2fd10 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d  ontrolled by lim
2fd20 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20  iting access to 
2fd30 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74  a.** single host
2fd40 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d   at a time and m
2fd50 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  oving file locks
2fd60 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61   off of the data
2fd70 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  base file.** and
2fd80 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69   onto a proxy fi
2fd90 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  le on the local 
2fda0 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a  file system.  .*
2fdb0 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72  *.**.** Using pr
2fdc0 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d  oxy locks.** ---
2fdd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
2fde0 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a  *.** C APIs.**.*
2fdf0 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
2fe00 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
2fe10 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  me, SQLITE_SET_L
2fe20 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a  OCKPROXYFILE,.**
2fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe40 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61         <proxy_pa
2fe50 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b  th> | ":auto:");
2fe60 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .**  sqlite3_fil
2fe70 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62  e_control(db, db
2fe80 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54  name, SQLITE_GET
2fe90 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20  _LOCKPROXYFILE, 
2fea0 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a  &<proxy_path>);.
2feb0 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61  **.**.** SQL pra
2fec0 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47  gmas.**.**  PRAG
2fed0 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f  MA [database.]lo
2fee0 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70  ck_proxy_file=<p
2fef0 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75  roxy_path> | :au
2ff00 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b  to:.**  PRAGMA [
2ff10 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70  database.]lock_p
2ff20 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20  roxy_file.**.** 
2ff30 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74  Specifying ":aut
2ff40 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69  o:" means that i
2ff50 66 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e  f there is a con
2ff60 63 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d  ch file with a m
2ff70 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20  atching.** host 
2ff80 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72  ID in it, the pr
2ff90 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20  oxy path in the 
2ffa0 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20  conch file will 
2ffb0 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69  be used, otherwi
2ffc0 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61  se.** a proxy pa
2ffd0 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  th based on the 
2ffe0 75 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a  user's temp dir.
2fff0 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28  ** (via confstr(
30000 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
30010 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77  TEMP_DIR,...)) w
30020 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20  ill be used and 
30030 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72  the.** actual pr
30040 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  oxy file name is
30050 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
30060 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74  the name and pat
30070 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  h of the.** data
30080 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20  base file.  For 
30090 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
300a0 20 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73       For databas
300b0 65 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d  e path "/Users/m
300c0 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20  e/foo.db" .**   
300d0 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74      The lock pat
300e0 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64  h will be "<tmpd
300f0 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73  ir>/sqliteplocks
30100 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64  /_Users_me_foo.d
30110 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20  b:auto:").**.** 
30120 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78  Once a lock prox
30130 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  y is configured 
30140 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63  for a database c
30150 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61  onnection, it ca
30160 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f  n not.** be remo
30170 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20  ved, however it 
30180 6d 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20  may be switched 
30190 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
301a0 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a  roxy path via.**
301b0 20 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20   the above APIs 
301c0 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f  (assuming the co
301d0 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nch file is not 
301e0 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e  being held by an
301f0 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74  other.** connect
30200 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e  ion or process).
30210 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70   .**.**.** How p
30220 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72  roxy locking wor
30230 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ks.** ----------
30240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
30250 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c  .** Proxy file l
30260 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72  ocking relies pr
30270 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e  imarily on two n
30280 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69  ew supporting fi
30290 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  les: .**.**   * 
302a0 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c   conch file to l
302b0 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74  imit access to t
302c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
302d0 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73   to a single hos
302e0 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74  t.**      at a t
302f0 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70  ime.**.**   *  p
30300 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74  roxy file to act
30310 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20   as a proxy for 
30320 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  the advisory loc
30330 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20  ks normally.**  
30340 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65      taken on the
30350 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20   database.**.** 
30360 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d  The conch file -
30370 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20   to use a proxy 
30380 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73  file, sqlite mus
30390 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68  t first "hold th
303a0 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74  e conch".** by t
303b0 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d  aking an sqlite-
303c0 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63  style shared loc
303d0 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  k on the conch f
303e0 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65  ile, reading the
303f0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64  .** contents and
30400 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68   comparing the h
30410 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73  ost's unique hos
30420 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29  t ID (see below)
30430 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f   and lock.** pro
30440 78 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20  xy path against 
30450 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
30460 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20  d in the conch. 
30470 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
30480 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  is.** stored in 
30490 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
304a0 72 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61  ry as the databa
304b0 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  se file and the 
304c0 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20  file name.** is 
304d0 70 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20  patterned after 
304e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
304f0 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74  e name as ".<dat
30500 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68  abasename>-conch
30510 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  "..** If the con
30520 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  ch file does not
30530 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20   exist, or it's 
30540 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20  contents do not 
30550 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73  match the.** hos
30560 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78  t ID and/or prox
30570 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65  y path, then the
30580 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74   lock is escalat
30590 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69  ed to an exclusi
305a0 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74  ve.** lock and t
305b0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f  he conch file co
305c0 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65  ntents is update
305d0 64 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20  d with the host 
305e0 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20  ID and proxy.** 
305f0 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63  path and the loc
30600 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20  k is downgraded 
30610 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  to a shared lock
30620 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20   again.  If the 
30630 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64  conch.** is held
30640 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   by another proc
30650 65 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72  ess (with a shar
30660 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78  ed lock), the ex
30670 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20  clusive lock.** 
30680 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51  will fail and SQ
30690 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
306a0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
306b0 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20   proxy file - a 
306c0 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65  single-byte file
306d0 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64   used for all ad
306e0 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b  visory file lock
306f0 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61  s.** normally ta
30700 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
30710 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73  ase file.   This
30720 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65   allows for safe
30730 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74   sharing.** of t
30740 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30750 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65   for multiple re
30760 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72  aders and writer
30770 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  s on the same.**
30780 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68   host (the conch
30790 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
307a0 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73  ey all use the s
307b0 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  ame local lock f
307c0 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75  ile)..**.** Requ
307d0 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  esting the lock 
307e0 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69  proxy does not i
307f0 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20  mmediately take 
30800 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73  the conch, it is
30810 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77  .** only taken w
30820 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 72 65  hen the first re
30830 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61  quest to lock da
30840 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d  tabase file is m
30850 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d  ade.  .** This m
30860 61 74 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e  atches the seman
30870 74 69 63 73 20 6f 66 20 74 68 65 20 74 72 61 64  tics of the trad
30880 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20  itional locking 
30890 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a  behavior, where.
308a0 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e  ** opening a con
308b0 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74  nection to a dat
308c0 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20  abase file does 
308d0 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20  not take a lock 
308e0 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68  on it..** The sh
308f0 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e  ared lock and an
30900 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   open file descr
30910 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61  iptor are mainta
30920 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74  ined until .** t
30930 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
30940 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
30950 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   closed. .**.** 
30960 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61  The proxy file a
30970 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  nd the lock file
30980 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74   are never delet
30990 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20  ed so they only 
309a0 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72  need.** to be cr
309b0 65 61 74 65 64 20 74 68 65 20 66 69 72 73 74 20  eated the first 
309c0 74 69 6d 65 20 74 68 65 79 20 61 72 65 20 75 73  time they are us
309d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67  ed..**.** Config
309e0 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a  uration options.
309f0 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
30a00 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20  --------.**.**  
30a10 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
30a20 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a  OXY_LOCKING.**.*
30a30 2a 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65  *       Database
30a40 20 66 69 6c 65 73 20 61 63 63 65 73 73 65 64 20   files accessed 
30a50 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  on non-local fil
30a60 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a  e systems are.**
30a70 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63         automatic
30a80 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20  ally configured 
30a90 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  for proxy lockin
30aa0 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72  g, lock files ar
30ab0 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64  e.**       named
30ac0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75   automatically u
30ad0 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f  sing the same lo
30ae0 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20  gic as.**       
30af0 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78  PRAGMA lock_prox
30b00 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a  y_file=":auto:".
30b10 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54  **    .**  SQLIT
30b20 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a  E_PROXY_DEBUG.**
30b30 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65  .**       Enable
30b40 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66  s the logging of
30b50 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
30b60 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66  during host id f
30b70 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74  ile.**       ret
30b80 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74  rieval and creat
30b90 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50  ion.**.**  LOCKP
30ba0 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20  ROXYDIR.**.**   
30bb0 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68      Overrides th
30bc0 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74  e default direct
30bd0 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ory used for loc
30be0 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68  k proxy files th
30bf0 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20  at.**       are 
30c00 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61  named automatica
30c10 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61 75  lly via the ":au
30c20 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a  to:" setting.**.
30c30 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55  **  SQLITE_DEFAU
30c40 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
30c50 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20  ISSIONS.**.**   
30c60 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20      Permissions 
30c70 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61  to use when crea
30c80 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ting a directory
30c90 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65   for storing the
30ca0 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70  .**       lock p
30cb0 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79  roxy files, only
30cc0 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50   used when LOCKP
30cd0 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73  ROXYDIR is not s
30ce0 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20  et..**    .**   
30cf0 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65   .** As mentione
30d00 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f  d above, when co
30d10 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49  mpiled with SQLI
30d20 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
30d30 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74  LOCKING,.** sett
30d40 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d  ing the environm
30d50 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c  ent variable SQL
30d60 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
30d70 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c  LOCKING to 1 wil
30d80 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79  l.** force proxy
30d90 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75   locking to be u
30da0 73 65 64 20 66 6f 72 20 65 76 65 72 79 20 64 61  sed for every da
30db0 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
30dc0 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c  ed, and 0.** wil
30dd0 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69  l force automati
30de0 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  c proxy locking 
30df0 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20 66  to be disabled f
30e00 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a  or all database.
30e10 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63  ** files (explic
30e20 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20  ity calling the 
30e30 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
30e40 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20  ROXYFILE pragma 
30e50 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c  or.** sqlite_fil
30e60 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73  e_control API is
30e70 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62 79   not affected by
30e80 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
30e90 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f  OXY_LOCKING)..*/
30ea0 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f  ../*.** Proxy lo
30eb0 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
30ec0 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53  ailable on MacOS
30ed0 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  X .*/.#if define
30ee0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
30ef0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
30f00 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a  CKING_STYLE../*.
30f10 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b  ** The proxyLock
30f20 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74  ingContext has t
30f30 68 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65  he path and file
30f40 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20   structures for 
30f50 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61  the remote .** a
30f60 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66  nd local proxy f
30f70 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79  iles in it.*/.ty
30f80 70 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f  pedef struct pro
30f90 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
30fa0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
30fb0 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f  text;.struct pro
30fc0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
30fd0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63   {.  unixFile *c
30fe0 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20  onchFile;       
30ff0 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20    /* Open conch 
31000 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
31010 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20  conchFilePath;  
31020 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
31030 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
31040 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
31050 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20  lockProxy;      
31060 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79     /* Open proxy
31070 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
31080 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50  char *lockProxyP
31090 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ath;         /* 
310a0 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78  Name of the prox
310b0 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  y lock file */. 
310c0 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20   char *dbPath;  
310d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
310e0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65   Name of the ope
310f0 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  n file */.  int 
31100 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20  conchHeld;      
31110 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66           /* 1 if
31120 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65   the conch is he
31130 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65  ld, -1 if lockle
31140 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c  ss */.  void *ol
31150 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  dLockingContext;
31160 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
31170 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20   lockingcontext 
31180 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c  to restore on cl
31190 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ose */.  sqlite3
311a0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
311b0 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20  t *pOldMethod;  
311c0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49     /* Original I
311d0 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63  /O methods for c
311e0 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a  lose */.};../* .
311f0 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
31200 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20  k file path for 
31210 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
31220 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65  dbPath is writte
31230 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a  n into lPath, .*
31240 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69  * which must poi
31250 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69  nt to valid, wri
31260 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72  table memory lar
31270 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20  ge enough for a 
31280 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a  maxLen length.**
31290 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a   file path. .*/.
312a0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
312b0 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73  GetLockPath(cons
312c0 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20  t char *dbPath, 
312d0 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a  char *lPath, siz
312e0 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69  e_t maxLen){.  i
312f0 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62  nt len;.  int db
31300 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  Len;.  int i;..#
31310 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44  ifdef LOCKPROXYD
31320 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  IR.  len = strlc
31330 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52  py(lPath, LOCKPR
31340 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b  OXYDIR, maxLen);
31350 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f  .#else.# ifdef _
31360 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
31370 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20  EMP_DIR.  {.    
31380 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53  if( !confstr(_CS
31390 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
313a0 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61  P_DIR, lPath, ma
313b0 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f  xLen) ){.      O
313c0 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b  STRACE(("GETLOCK
313d0 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20  PATH  failed %s 
313e0 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c  errno=%d pid=%d\
313f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
31400 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c     lPath, errno,
31410 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20   getpid()));.   
31420 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
31430 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
31440 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72   }.    len = str
31450 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c  lcat(lPath, "sql
31460 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c  iteplocks", maxL
31470 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65  en);    .  }.# e
31480 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  lse.  len = strl
31490 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70  cpy(lPath, "/tmp
314a0 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65  /", maxLen);.# e
314b0 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ndif.#endif..  i
314c0 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21  f( lPath[len-1]!
314d0 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20  ='/' ){.    len 
314e0 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c  = strlcat(lPath,
314f0 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20   "/", maxLen);. 
31500 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73   }.  .  /* trans
31510 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68  form the db path
31520 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63   to a unique cac
31530 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c  he name */.  dbL
31540 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
31550 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28  (dbPath);.  for(
31560 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26   i=0; i<dbLen &&
31570 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29   (i+len+7)<(int)
31580 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20  maxLen; i++){.  
31590 20 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74    char c = dbPat
315a0 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b  h[i];.    lPath[
315b0 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27  i+len] = (c=='/'
315c0 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c  )?'_':c;.  }.  l
315d0 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27  Path[i+len]='\0'
315e0 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74  ;.  strlcat(lPat
315f0 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78  h, ":auto:", max
31600 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  Len);.  OSTRACE(
31610 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70  ("GETLOCKPATH  p
31620 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
31630 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61  s pid=%d\n", lPa
31640 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
31650 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31660 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43  OK;.}../* . ** C
31670 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20  reates the lock 
31680 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73  file and any mis
31690 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73  sing directories
316a0 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f   in lockPath. */
316b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
316c0 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28  yCreateLockPath(
316d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b  const char *lock
316e0 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Path){.  int i, 
316f0 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  len;.  char buf[
31700 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69  MAXPATHLEN];.  i
31710 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  nt start = 0;.  
31720 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61  .  assert(lockPa
31730 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20  th!=NULL);.  /* 
31740 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c  try to create al
31750 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  l the intermedia
31760 74 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a  te directories *
31770 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73  /.  len = (int)s
31780 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b  trlen(lockPath);
31790 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b  .  buf[0] = lock
317a0 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20  Path[0];.  for( 
317b0 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20  i=1; i<len; i++ 
317c0 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50  ){.    if( lockP
317d0 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26  ath[i] == '/' &&
317e0 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29   (i - start > 0)
317f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c   ){.      /* onl
31800 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20  y mkdir if leaf 
31810 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f  dir != "." or "/
31820 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20  " or ".." */.   
31830 20 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32     if( i-start>2
31840 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20   || (i-start==1 
31850 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d  && buf[start] !=
31860 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72   '.' && buf[star
31870 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20  t] != '/') .    
31880 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74       || (i-start
31890 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74  ==2 && buf[start
318a0 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b  ] != '.' && buf[
318b0 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29  start+1] != '.')
318c0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b   ){.        buf[
318d0 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20  i]='\0';.       
318e0 20 69 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66   if( osMkdir(buf
318f0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
31900 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
31910 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20  SIONS) ){.      
31920 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e      int err=errn
31930 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  o;.          if(
31940 20 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b   err!=EEXIST ) {
31950 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54  .            OST
31960 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43  RACE(("CREATELOC
31970 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72  KPATH  FAILED cr
31980 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20  eating %s, ".   
31990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319a0 20 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f    "'%s' proxy lo
319b0 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
319c0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
319d0 20 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20             buf, 
319e0 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c  strerror(err), l
319f0 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28  ockPath, getpid(
31a00 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )));.           
31a10 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20   return err;.   
31a20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31a30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
31a40 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20   start=i+1;.    
31a50 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c  }.    buf[i] = l
31a60 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a  ockPath[i];.  }.
31a70 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41    OSTRACE(("CREA
31a80 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78  TELOCKPATH  prox
31a90 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
31aa0 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61  id=%d\n", lockPa
31ab0 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
31ac0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
31ad0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
31ae0 77 20 56 46 53 20 66 69 6c 65 20 64 65 73 63 72  w VFS file descr
31af0 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e  iptor (stored in
31b00 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
31b10 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
31b20 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65  _malloc) and ope
31b30 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64  n the file named
31b40 20 22 70 61 74 68 22 20 69 6e 20 74 68 65 20 66   "path" in the f
31b50 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
31b60 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
31b70 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
31b80 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f  not only for clo
31b90 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65  sing the file de
31ba0 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20  scriptor.** but 
31bb0 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67  also for freeing
31bc0 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f   the memory asso
31bd0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
31be0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
31bf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
31c00 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
31c10 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le(.    const ch
31c20 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
31c30 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65   /* path for the
31c40 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f   new unixFile */
31c50 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a  .    unixFile **
31c60 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a  ppFile,       /*
31c70 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65   unixFile create
31c80 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62  d and returned b
31c90 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74  y ref */.    int
31ca0 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20   islockfile     
31cb0 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20        /* if non 
31cc0 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72  zero missing dir
31cd0 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  s will be create
31ce0 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66  d */.) {.  int f
31cf0 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69  d = -1;.  unixFi
31d00 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  le *pNew;.  int 
31d10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
31d20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20    int openFlags 
31d30 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45  = O_RDWR | O_CRE
31d40 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  AT;.  sqlite3_vf
31d50 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e  s dummyVfs;.  in
31d60 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  t terrno = 0;.  
31d70 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
31d80 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  nused = NULL;.. 
31d90 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79   /* 1. first try
31da0 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
31db0 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e  the file.  ** 2.
31dc0 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20   if that fails, 
31dd0 61 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f  and this is a lo
31de0 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e  ck file (not-con
31df0 63 68 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e  ch), try creatin
31e00 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e  g.  ** the paren
31e10 74 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e  t directories an
31e20 64 20 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e  d then try again
31e30 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61  ..  ** 3. if tha
31e40 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20  t fails, try to 
31e50 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65  open the file re
31e60 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68  ad-only.  ** oth
31e70 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 42 55  erwise return BU
31e80 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65  SY (if lock file
31e90 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f  ) or CANTOPEN fo
31ea0 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  r the conch file
31eb0 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20  .  */.  pUnused 
31ec0 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64  = findReusableFd
31ed0 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
31ee0 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64  );.  if( pUnused
31ef0 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e   ){.    fd = pUn
31f00 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73  used->fd;.  }els
31f10 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d  e{.    pUnused =
31f20 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
31f30 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29  sizeof(*pUnused)
31f40 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75  );.    if( !pUnu
31f50 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sed ){.      ret
31f60 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
31f70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
31f80 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64  ( fd<0 ){.    fd
31f90 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
31fa0 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
31fb0 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  0);.    terrno =
31fc0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
31fd0 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  fd<0 && errno==E
31fe0 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66  NOENT && islockf
31ff0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ile ){.      if(
32000 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b   proxyCreateLock
32010 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51  Path(path) == SQ
32020 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32030 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
32040 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
32050 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ags, 0);.      }
32060 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
32070 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65   fd<0 ){.    ope
32080 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c  nFlags = O_RDONL
32090 59 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  Y;.    fd = robu
320a0 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
320b0 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  enFlags, 0);.   
320c0 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   terrno = errno;
320d0 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
320e0 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63  ){.    if( isloc
320f0 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  kfile ){.      r
32100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
32110 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69  Y;.    }.    swi
32120 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20  tch (terrno) {. 
32130 20 20 20 20 20 63 61 73 65 20 45 41 43 43 45 53       case EACCES
32140 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  :.        return
32150 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
32160 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20 0a 20      case EIO: . 
32170 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
32180 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
32190 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20   /* even though 
321a0 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63 68 20  it is the conch 
321b0 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  */.      default
321c0 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  :.        return
321d0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
321e0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
321f0 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e  .  .  pNew = (un
32200 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  ixFile *)sqlite3
32210 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  _malloc(sizeof(*
32220 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e  pNew));.  if( pN
32230 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ew==NULL ){.    
32240 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
32250 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  M;.    goto end_
32260 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20  create_proxy;.  
32270 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c  }.  memset(pNew,
32280 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
32290 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f  ile));.  pNew->o
322a0 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46  penFlags = openF
322b0 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26  lags;.  memset(&
322c0 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a  dummyVfs, 0, siz
322d0 65 6f 66 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a  eof(dummyVfs));.
322e0 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44    dummyVfs.pAppD
322f0 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75  ata = (void*)&au
32300 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a  tolockIoFinder;.
32310 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65    dummyVfs.zName
32320 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55   = "dummy";.  pU
32330 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a  nused->fd = fd;.
32340 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73    pUnused->flags
32350 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
32360 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20  pNew->pUnused = 
32370 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63  pUnused;.  .  rc
32380 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
32390 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c  e(&dummyVfs, fd,
323a0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
323b0 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 29 3b 0a  pNew, path, 0);.
323c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
323d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69  _OK ){.    *ppFi
323e0 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72  le = pNew;.    r
323f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
32400 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f  .  }.end_create_
32410 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62  proxy:    .  rob
32420 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
32430 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
32440 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
32450 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ew);.  sqlite3_f
32460 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  ree(pUnused);.  
32470 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
32480 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
32490 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c  ./* simulate mul
324a0 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63  tiple hosts by c
324b0 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68  reating unique h
324c0 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73  ostid file paths
324d0 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
324e0 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a  hostid_num = 0;.
324f0 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
32500 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
32510 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20     16  /* conch 
32520 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e  file host id len
32530 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61  gth */../* Not a
32540 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e  lways defined in
32550 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73 20   the headers as 
32560 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a  it ought to be *
32570 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74  /.extern int get
32580 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74 20  hostuuid(uuid_t 
32590 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74  id, const struct
325a0 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29   timespec *wait)
325b0 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f  ;../* get the ho
325c0 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f 73  st ID via gethos
325d0 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44  tuuid(), pHostID
325e0 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50   must point to P
325f0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a  ROXY_HOSTIDLEN .
32600 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69 74  ** bytes of writ
32610 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  able memory..*/.
32620 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
32630 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e  GetHostID(unsign
32640 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44  ed char *pHostID
32650 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a  , int *pError){.
32660 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48    assert(PROXY_H
32670 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65  OSTIDLEN == size
32680 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d  of(uuid_t));.  m
32690 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30  emset(pHostID, 0
326a0 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
326b0 4e 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  N);.#if defined(
326c0 5f 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53 49  __MAX_OS_X_VERSI
326d0 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 29  ON_MIN_REQUIRED)
326e0 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
326f0 20 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56   && __MAC_OS_X_V
32700 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49  ERSION_MIN_REQUI
32710 52 45 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20 20  RED<1050.  {.   
32720 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
32730 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 74 69  ruct timespec ti
32740 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20  meout = {1, 0}; 
32750 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74  /* 1 sec timeout
32760 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68   */.    if( geth
32770 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c  ostuuid(pHostID,
32780 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20   &timeout) ){.  
32790 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72      int err = er
327a0 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rno;.      if( p
327b0 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Error ){.       
327c0 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a   *pError = err;.
327d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
327e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
327f0 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  R;.    }.  }.#el
32800 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
32810 4d 45 54 45 52 28 70 45 72 72 6f 72 29 3b 0a 23  METER(pError);.#
32820 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
32830 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69  ITE_TEST.  /* si
32840 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20  mulate multiple 
32850 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e  hosts by creatin
32860 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20  g unique hostid 
32870 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20  file paths */.  
32880 69 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74  if( sqlite3_host
32890 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20  id_num != 0){.  
328a0 20 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28    pHostID[0] = (
328b0 63 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d  char)(pHostID[0]
328c0 20 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74 65   + (char)(sqlite
328d0 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30  3_hostid_num & 0
328e0 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  xFF));.  }.#endi
328f0 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  f.  .  return SQ
32900 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54  LITE_OK;.}../* T
32910 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f  he conch file co
32920 6e 74 61 69 6e 73 20 74 68 65 20 68 65 61 64 65  ntains the heade
32930 72 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c  r, host id and l
32940 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a  ock file path. *
32950 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  /.#define PROXY_
32960 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20  CONCHVERSION 2  
32970 20 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65   /* 1-byte heade
32980 72 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20  r, 16-byte host 
32990 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66  id, path */.#def
329a0 69 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52  ine PROXY_HEADER
329b0 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f  LEN    1   /* co
329c0 6e 63 68 20 66 69 6c 65 20 68 65 61 64 65 72 20  nch file header 
329d0 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e  length */.#defin
329e0 65 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  e PROXY_PATHINDE
329f0 58 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44  X    (PROXY_HEAD
32a00 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54  ERLEN+PROXY_HOST
32a10 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50  IDLEN).#define P
32a20 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
32a30 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c    (PROXY_HEADERL
32a40 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  EN+PROXY_HOSTIDL
32a50 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a  EN+MAXPATHLEN)..
32a60 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20  /* .** Takes an 
32a70 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c  open conch file,
32a80 20 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74   copies the cont
32a90 65 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61  ents to a new pa
32aa0 74 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65  th and then move
32ab0 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20  s .** it back.  
32ac0 54 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65  The newly create
32ad0 64 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65  d file's file de
32ae0 73 63 72 69 70 74 6f 72 20 69 73 20 61 73 73 69  scriptor is assi
32af0 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63  gned to the.** c
32b00 6f 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63 74  onch file struct
32b10 75 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20  ure and finally 
32b20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  the original con
32b30 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ch file descript
32b40 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64  or is .** closed
32b50 2e 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20  .  Returns zero 
32b60 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
32b70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
32b80 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b  xyBreakConchLock
32b90 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
32ba0 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49  , uuid_t myHostI
32bb0 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  D){.  proxyLocki
32bc0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
32bd0 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
32be0 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
32bf0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
32c00 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
32c10 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
32c20 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72  onchFile;.  char
32c30 20 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45   tPath[MAXPATHLE
32c40 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50  N];.  char buf[P
32c50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
32c60 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68  ];.  char *cPath
32c70 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
32c80 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74  lePath;.  size_t
32c90 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20   readLen = 0;.  
32ca0 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d  size_t pathLen =
32cb0 20 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73   0;.  char errms
32cc0 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e  g[64] = "";.  in
32cd0 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  t fd = -1;.  int
32ce0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53   rc = -1;.  UNUS
32cf0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48  ED_PARAMETER(myH
32d00 6f 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72  ostID);..  /* cr
32d10 65 61 74 65 20 61 20 6e 65 77 20 70 61 74 68 20  eate a new path 
32d20 62 79 20 72 65 70 6c 61 63 65 20 74 68 65 20 74  by replace the t
32d30 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27  railing '-conch'
32d40 20 77 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a   with '-break' *
32d50 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74  /.  pathLen = st
32d60 72 6c 63 70 79 28 74 50 61 74 68 2c 20 63 50 61  rlcpy(tPath, cPa
32d70 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
32d80 0a 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d  .  if( pathLen>M
32d90 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74  AXPATHLEN || pat
32da0 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20  hLen<6 || .     
32db0 28 73 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b  (strlcpy(&tPath[
32dc0 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65  pathLen-5], "bre
32dd0 61 6b 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b  ak", 6) != 5) ){
32de0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
32df0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
32e00 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74  msg),errmsg,"pat
32e10 68 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29  h error (len %d)
32e20 22 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b  ",(int)pathLen);
32e30 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
32e40 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f  eaklock;.  }.  /
32e50 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68  * read the conch
32e60 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65   content */.  re
32e70 61 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28  adLen = osPread(
32e80 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75  conchFile->h, bu
32e90 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  f, PROXY_MAXCONC
32ea0 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20  HLEN, 0);.  if( 
32eb0 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41  readLen<PROXY_PA
32ec0 54 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73  THINDEX ){.    s
32ed0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
32ee0 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65  sizeof(errmsg),e
32ef0 72 72 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f  rrmsg,"read erro
32f00 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74  r (len %d)",(int
32f10 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67  )readLen);.    g
32f20 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
32f30 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74  k;.  }.  /* writ
32f40 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20  e it out to the 
32f50 74 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20  temporary break 
32f60 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72  file */.  fd = r
32f70 6f 62 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68  obust_open(tPath
32f80 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  , (O_RDWR|O_CREA
32f90 54 7c 4f 5f 45 58 43 4c 29 2c 20 30 29 3b 0a 20  T|O_EXCL), 0);. 
32fa0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
32fb0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
32fc0 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
32fd0 2c 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74  , errmsg, "creat
32fe0 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
32ff0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
33000 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
33010 20 20 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69    }.  if( osPwri
33020 74 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64  te(fd, buf, read
33030 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a  Len, 0) != (ssiz
33040 65 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20  e_t)readLen ){. 
33050 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
33060 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
33070 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69  g), errmsg, "wri
33080 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c  te failed (%d)",
33090 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74   errno);.    got
330a0 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
330b0 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d  .  }.  if( renam
330c0 65 28 74 50 61 74 68 2c 20 63 50 61 74 68 29 20  e(tPath, cPath) 
330d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
330e0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
330f0 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20  rrmsg), errmsg, 
33100 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28  "rename failed (
33110 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  %d)", errno);.  
33120 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
33130 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  lock;.  }.  rc =
33140 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74   0;.  fprintf(st
33150 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61  derr, "broke sta
33160 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22  le lock on %s\n"
33170 2c 20 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75  , cPath);.  robu
33180 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
33190 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f  conchFile->h, __
331a0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68  LINE__);.  conch
331b0 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20  File->h = fd;.  
331c0 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46  conchFile->openF
331d0 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20  lags = O_RDWR | 
331e0 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72  O_CREAT;..end_br
331f0 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72  eaklock:.  if( r
33200 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e  c ){.    if( fd>
33210 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e  =0 ){.      osUn
33220 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20  link(tPath);.   
33230 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
33240 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e  pFile, fd, __LIN
33250 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E__);.    }.    
33260 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
33270 22 66 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b  "failed to break
33280 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25   stale lock on %
33290 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c  s, %s\n", cPath,
332a0 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20   errmsg);.  }.  
332b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
332c0 20 54 61 6b 65 20 74 68 65 20 72 65 71 75 65 73   Take the reques
332d0 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ted lock on the 
332e0 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62  conch file and b
332f0 72 65 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63  reak a stale loc
33300 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73  k if the .** hos
33310 74 20 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f  t id matches..*/
33320 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
33330 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46  yConchLock(unixF
33340 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64  ile *pFile, uuid
33350 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74  _t myHostID, int
33360 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72   lockType){.  pr
33370 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
33380 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
33390 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
333a0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
333b0 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46  ontext; .  unixF
333c0 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d  ile *conchFile =
333d0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
333e0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
333f0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54  ITE_OK;.  int nT
33400 72 69 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75  ries = 0;.  stru
33410 63 74 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63  ct timespec conc
33420 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d  hModTime;.  .  m
33430 65 6d 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54  emset(&conchModT
33440 69 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63  ime, 0, sizeof(c
33450 6f 6e 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20  onchModTime));. 
33460 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63   do {.    rc = c
33470 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
33480 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65  d->xLock((sqlite
33490 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
334a0 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  e, lockType);.  
334b0 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20    nTries ++;.   
334c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
334d0 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a  BUSY ){.      /*
334e0 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69   If the lock fai
334f0 6c 65 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20  led (busy):.    
33500 20 20 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65     * 1st try: ge
33510 74 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f  t the mod time o
33520 66 20 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69  f the conch, wai
33530 74 20 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61  t 0.5s and try a
33540 67 61 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20  gain. .       * 
33550 32 6e 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66  2nd try: fail if
33560 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68   the mod time ch
33570 61 6e 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64  anged or host id
33580 20 69 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77   is different, w
33590 61 69 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20  ait .       *   
335a0 20 20 20 20 20 20 20 20 31 30 20 73 65 63 20 61          10 sec a
335b0 6e 64 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20  nd try again.   
335c0 20 20 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62      * 3rd try: b
335d0 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e  reak the lock un
335e0 6c 65 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d  less the mod tim
335f0 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20  e has changed.. 
33600 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
33610 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
33620 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
33630 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  t(conchFile->h, 
33640 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20  &buf) ){.       
33650 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
33660 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
33670 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
33680 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
33690 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
336a0 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 31 20    if( nTries==1 
336b0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68  ){.        conch
336c0 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73 74  ModTime = buf.st
336d0 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20 20 20  _mtimespec;.    
336e0 20 20 20 20 75 73 6c 65 65 70 28 35 30 30 30 30      usleep(50000
336f0 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35 20  0); /* wait 0.5 
33700 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65 20  sec and try the 
33710 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20  lock again*/.   
33720 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
33730 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
33740 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3e 31  assert( nTries>1
33750 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f   );.      if( co
33760 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65  nchModTime.tv_se
33770 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d  c != buf.st_mtim
33780 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20  espec.tv_sec || 
33790 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d  .         conchM
337a0 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21  odTime.tv_nsec !
337b0 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70  = buf.st_mtimesp
337c0 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20  ec.tv_nsec ){.  
337d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
337e0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
337f0 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  }.      .      i
33800 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20  f( nTries==2 ){ 
33810 20 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 74   .        char t
33820 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  Buf[PROXY_MAXCON
33830 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20  CHLEN];.        
33840 69 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65 61  int len = osPrea
33850 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
33860 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43  tBuf, PROXY_MAXC
33870 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20  ONCHLEN, 0);.   
33880 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29       if( len<0 )
33890 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
338a0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
338b0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
338c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
338d0 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
338e0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
338f0 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e  len>PROXY_PATHIN
33900 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d  DEX && tBuf[0]==
33910 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43  (char)PROXY_CONC
33920 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20  HVERSION){.     
33930 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72       /* don't br
33940 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66 20  eak the lock if 
33950 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f 65 73  the host id does
33960 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  n't match */.   
33970 20 20 20 20 20 20 20 69 66 28 20 30 21 3d 6d 65         if( 0!=me
33980 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f 58 59  mcmp(&tBuf[PROXY
33990 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48  _HEADERLEN], myH
339a0 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53  ostID, PROXY_HOS
339b0 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20  TIDLEN) ){.     
339c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
339d0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
339e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
339f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
33a00 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74  /* don't break t
33a10 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74  he lock on short
33a20 20 72 65 61 64 20 6f 72 20 61 20 76 65 72 73 69   read or a versi
33a30 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20  on mismatch */. 
33a40 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
33a50 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
33a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
33a70 73 6c 65 65 70 28 31 30 30 30 30 30 30 30 29 3b  sleep(10000000);
33a80 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65 63 20   /* wait 10 sec 
33a90 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b  and try the lock
33aa0 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20   again */.      
33ab0 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20    continue; .   
33ac0 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
33ad0 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73    assert( nTries
33ae0 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==3 );.      if(
33af0 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f   0==proxyBreakCo
33b00 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d  nchLock(pFile, m
33b10 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20 20 20  yHostID) ){.    
33b20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
33b30 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OK;.        if( 
33b40 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53  lockType==EXCLUS
33b50 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
33b60 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
33b70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
33b80 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
33b90 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53  le*)conchFile, S
33ba0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20  HARED_LOCK);    
33bb0 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d        .        }
33bc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 72 63  .        if( !rc
33bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
33be0 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
33bf0 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
33c00 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
33c10 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29  hFile, lockType)
33c20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33c30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68    }.    }.  } wh
33c40 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
33c50 42 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33  BUSY && nTries<3
33c60 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20   );.  .  return 
33c70 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20  rc;.}../* Takes 
33c80 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b  the conch by tak
33c90 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
33ca0 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65 20 63  k and read the c
33cb0 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69  ontents conch, i
33cc0 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69  f .** lockPath i
33cd0 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20  s non-NULL, the 
33ce0 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b  host ID and lock
33cf0 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20   file path must 
33d00 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a  match.  A NULL .
33d10 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e  ** lockPath mean
33d20 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50  s that the lockP
33d30 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  ath in the conch
33d40 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73   file will be us
33d50 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f  ed if the .** ho
33d60 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72  st IDs match, or
33d70 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68   a new lock path
33d80 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
33d90 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
33da0 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e   .** and written
33db0 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69   to the conch fi
33dc0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
33dd0 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68  t proxyTakeConch
33de0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
33df0 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
33e00 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
33e10 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
33e20 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
33e30 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
33e40 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63    .  if( pCtx->c
33e50 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20  onchHeld!=0 ){. 
33e60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
33e70 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
33e80 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
33e90 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
33ea0 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69  nchFile;.    uui
33eb0 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20  d_t myHostID;.  
33ec0 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30    int pError = 0
33ed0 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61 64 42  ;.    char readB
33ee0 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
33ef0 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
33f00 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48  lockPath[MAXPATH
33f10 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a  LEN];.    char *
33f20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e  tempLockPath = N
33f30 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  ULL;.    int rc 
33f40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
33f50 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68   int createConch
33f60 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f   = 0;.    int ho
33f70 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20  stIdMatch = 0;. 
33f80 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d     int readLen =
33f90 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79 4f   0;.    int tryO
33fa0 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ldLockPath = 0;.
33fb0 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65 77      int forceNew
33fc0 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20  LockPath = 0;.  
33fd0 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28    .    OSTRACE((
33fe0 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 66  "TAKECONCH  %d f
33ff0 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  or %s pid=%d\n",
34000 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
34010 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74              (pCt
34020 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
34030 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   ? pCtx->lockPro
34040 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a  xyPath : ":auto:
34050 22 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  "), getpid()));.
34060 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47  .    rc = proxyG
34070 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49  etHostID(myHostI
34080 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20  D, &pError);.   
34090 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d   if( (rc&0xff)==
340a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
340b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
340c0 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b  tErrno = pError;
340d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
340e0 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d  takeconch;.    }
340f0 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43  .    rc = proxyC
34100 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  onchLock(pFile, 
34110 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44  myHostID, SHARED
34120 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
34130 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34140 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
34150 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d  takeconch;.    }
34160 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74 68 65  .    /* read the
34170 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63 68 20   existing conch 
34180 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61 64  file */.    read
34190 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65 61  Len = seekAndRea
341a0 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e  d((unixFile*)con
341b0 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61 64 42  chFile, 0, readB
341c0 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
341d0 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28 20  CHLEN);.    if( 
341e0 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20  readLen<0 ){.   
341f0 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a     /* I/O error:
34200 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62   lastErrno set b
34210 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f  y seekAndRead */
34220 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
34230 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46  stErrno = conchF
34240 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
34250 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
34260 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
34270 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
34280 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73  econch;.    }els
34290 65 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28  e if( readLen<=(
342a0 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
342b0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
342c0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
342d0 20 20 72 65 61 64 42 75 66 5b 30 5d 21 3d 28 63    readBuf[0]!=(c
342e0 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
342f0 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  ERSION ){.      
34300 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64 20  /* a short read 
34310 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61  or version forma
34320 74 20 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e 73  t mismatch means
34330 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
34340 74 65 20 61 20 6e 65 77 20 0a 20 20 20 20 20 20  te a new .      
34350 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a  ** conch file. .
34360 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
34370 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a  reateConch = 1;.
34380 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20      }.    /* if 
34390 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63  the host id matc
343a0 68 65 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  hes and the lock
343b0 20 70 61 74 68 20 61 6c 72 65 61 64 79 20 65 78   path already ex
343c0 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 63  ists in the conc
343d0 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74  h.    ** we'll t
343e0 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  ry to use the pa
343f0 74 68 20 74 68 65 72 65 2c 20 69 66 20 77 65 20  th there, if we 
34400 63 61 6e 27 74 20 6f 70 65 6e 20 74 68 61 74 20  can't open that 
34410 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20  path, we'll .   
34420 20 2a 2a 20 72 65 74 72 79 20 77 69 74 68 20 61   ** retry with a
34430 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65 72 61   new auto-genera
34440 74 65 64 20 70 61 74 68 20 0a 20 20 20 20 2a 2f  ted path .    */
34450 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20  .    do { /* in 
34460 63 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20  case we need to 
34470 74 72 79 20 61 67 61 69 6e 20 66 6f 72 20 61 6e  try again for an
34480 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f   :auto: named lo
34490 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  ck file */..    
344a0 20 20 69 66 28 20 21 63 72 65 61 74 65 43 6f 6e    if( !createCon
344b0 63 68 20 26 26 20 21 66 6f 72 63 65 4e 65 77 4c  ch && !forceNewL
344c0 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20  ockPath ){.     
344d0 20 20 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d     hostIdMatch =
344e0 20 21 6d 65 6d 63 6d 70 28 26 72 65 61 64 42 75   !memcmp(&readBu
344f0 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  f[PROXY_HEADERLE
34500 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20  N], myHostID, . 
34510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34530 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
34540 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66  );.        /* if
34550 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64   the conch has d
34560 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20  ata compare the 
34570 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20  contents */.    
34580 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c      if( !pCtx->l
34590 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
345a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72            /* for
345b0 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61   auto-named loca
345c0 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73  l lock file, jus
345d0 74 20 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74  t check the host
345e0 20 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20   ID and we'll.  
345f0 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20           ** use 
34600 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  the local lock f
34610 69 6c 65 20 70 61 74 68 20 74 68 61 74 27 73 20  ile path that's 
34620 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 72 65  already in there
34630 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  .           */. 
34640 20 20 20 20 20 20 20 20 20 69 66 28 20 68 6f 73           if( hos
34650 74 49 64 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  tIdMatch ){.    
34660 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20 70          size_t p
34670 61 74 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65  athLen = (readLe
34680 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e  n - PROXY_PATHIN
34690 44 45 58 29 3b 0a 20 20 20 20 20 20 20 20 20 20  DEX);.          
346a0 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69    .            i
346b0 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50  f( pathLen>=MAXP
346c0 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20  ATHLEN ){.      
346d0 20 20 20 20 20 20 20 20 70 61 74 68 4c 65 6e 3d          pathLen=
346e0 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20  MAXPATHLEN-1;.  
346f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
34700 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6c          memcpy(l
34710 6f 63 6b 50 61 74 68 2c 20 26 72 65 61 64 42 75  ockPath, &readBu
34720 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  f[PROXY_PATHINDE
34730 58 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20  X], pathLen);.  
34740 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 50 61            lockPa
34750 74 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b  th[pathLen] = 0;
34760 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 6d  .            tem
34770 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b  pLockPath = lock
34780 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20  Path;.          
34790 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68    tryOldLockPath
347a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
347b0 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f    /* create a co
347c0 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70  py of the lock p
347d0 61 74 68 20 69 66 20 74 68 65 20 63 6f 6e 63 68  ath if the conch
347e0 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20   is taken */.   
347f0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
34800 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
34810 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34820 20 7d 65 6c 73 65 20 69 66 28 20 68 6f 73 74 49   }else if( hostI
34830 64 4d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20  dMatch.         
34840 20 20 20 20 20 20 26 26 20 21 73 74 72 6e 63 6d        && !strncm
34850 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  p(pCtx->lockProx
34860 79 50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b  yPath, &readBuf[
34870 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
34880 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
34890 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
348a0 64 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49  dLen-PROXY_PATHI
348b0 4e 44 45 58 29 0a 20 20 20 20 20 20 20 20 29 7b  NDEX).        ){
348c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f  .          /* co
348d0 6e 63 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63  nch host and loc
348e0 6b 20 70 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a  k path match */.
348f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
34900 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20  nd_takeconch; . 
34910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34920 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a  .      .      /*
34930 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73   if the conch is
34940 6e 27 74 20 77 72 69 74 61 62 6c 65 20 61 6e 64  n't writable and
34950 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c 20   doesn't match, 
34960 77 65 20 63 61 6e 27 74 20 74 61 6b 65 20 69 74  we can't take it
34970 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 63   */.      if( (c
34980 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  onchFile->openFl
34990 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30  ags&O_RDWR) == 0
349a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
349b0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
349c0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
349d0 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20  akeconch;.      
349e0 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f  }.      .      /
349f0 2a 20 65 69 74 68 65 72 20 74 68 65 20 63 6f 6e  * either the con
34a00 63 68 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20  ch didn't match 
34a10 6f 72 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  or we need to cr
34a20 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a  eate a new one *
34a30 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 74  /.      if( !pCt
34a40 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
34a50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78   ){.        prox
34a60 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70 43 74  yGetLockPath(pCt
34a70 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50  x->dbPath, lockP
34a80 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
34a90 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f  ;.        tempLo
34aa0 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74  ckPath = lockPat
34ab0 68 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 72  h;.        /* cr
34ac0 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
34ad0 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e  he lock path _on
34ae0 6c 79 5f 20 69 66 20 74 68 65 20 63 6f 6e 63 68  ly_ if the conch
34af0 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20   is taken */.   
34b00 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
34b10 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63    /* update conc
34b20 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20  h with host and 
34b30 70 61 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20  path (this will 
34b40 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72  fail if other pr
34b50 6f 63 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 68  ocess.      ** h
34b60 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  as a shared lock
34b70 20 61 6c 72 65 61 64 79 29 2c 20 69 66 20 74 68   already), if th
34b80 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65  e host id matche
34b90 73 2c 20 75 73 65 20 74 68 65 20 62 69 67 0a 20  s, use the big. 
34ba0 20 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a 20       ** stick.. 
34bb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 75       */.      fu
34bc0 74 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65 2d  times(conchFile-
34bd0 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  >h, NULL);.     
34be0 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68   if( hostIdMatch
34bf0 20 26 26 20 21 63 72 65 61 74 65 43 6f 6e 63 68   && !createConch
34c00 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
34c10 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64  conchFile->pInod
34c20 65 20 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  e && conchFile->
34c30 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
34c40 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  1 ){.          /
34c50 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20  * We are trying 
34c60 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65  for an exclusive
34c70 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65   lock but anothe
34c80 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  r thread in this
34c90 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  .           ** s
34ca0 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
34cb0 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
34cc0 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
34cd0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
34ce0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
34cf0 20 20 20 7d 20 65 6c 73 65 20 7b 20 20 20 20 20     } else {     
34d00 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
34d10 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c  rc = proxyConchL
34d20 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
34d30 74 49 44 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  tID, EXCLUSIVE_L
34d40 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OCK);.        }.
34d50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34d60 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46       rc = conchF
34d70 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
34d80 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
34d90 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58  e*)conchFile, EX
34da0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
34db0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
34dc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34dd0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 77  {.        char w
34de0 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59  riteBuffer[PROXY
34df0 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
34e00 20 20 20 20 20 20 20 69 6e 74 20 77 72 69 74 65         int write
34e10 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
34e20 20 20 0a 20 20 20 20 20 20 20 20 77 72 69 74 65    .        write
34e30 42 75 66 66 65 72 5b 30 5d 20 3d 20 28 63 68 61  Buffer[0] = (cha
34e40 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52  r)PROXY_CONCHVER
34e50 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 6d 65  SION;.        me
34e60 6d 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65  mcpy(&writeBuffe
34e70 72 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  r[PROXY_HEADERLE
34e80 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52  N], myHostID, PR
34e90 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a  OXY_HOSTIDLEN);.
34ea0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78          if( pCtx
34eb0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 21  ->lockProxyPath!
34ec0 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  =NULL ){.       
34ed0 20 20 20 73 74 72 6c 63 70 79 28 26 77 72 69 74     strlcpy(&writ
34ee0 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41  eBuffer[PROXY_PA
34ef0 54 48 49 4e 44 45 58 5d 2c 20 70 43 74 78 2d 3e  THINDEX], pCtx->
34f00 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 4d  lockProxyPath, M
34f10 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20  AXPATHLEN);.    
34f20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34f30 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72       strlcpy(&wr
34f40 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
34f50 50 41 54 48 49 4e 44 45 58 5d 2c 20 74 65 6d 70  PATHINDEX], temp
34f60 4c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54  LockPath, MAXPAT
34f70 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d  HLEN);.        }
34f80 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 53 69  .        writeSi
34f90 7a 65 20 3d 20 50 52 4f 58 59 5f 50 41 54 48 49  ze = PROXY_PATHI
34fa0 4e 44 45 58 20 2b 20 73 74 72 6c 65 6e 28 26 77  NDEX + strlen(&w
34fb0 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59  riteBuffer[PROXY
34fc0 5f 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a 20 20  _PATHINDEX]);.  
34fd0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 66 74 72        robust_ftr
34fe0 75 6e 63 61 74 65 28 63 6f 6e 63 68 46 69 6c 65  uncate(conchFile
34ff0 2d 3e 68 2c 20 77 72 69 74 65 53 69 7a 65 29 3b  ->h, writeSize);
35000 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
35010 69 78 57 72 69 74 65 28 28 73 71 6c 69 74 65 33  ixWrite((sqlite3
35020 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c  _file *)conchFil
35030 65 2c 20 77 72 69 74 65 42 75 66 66 65 72 2c 20  e, writeBuffer, 
35040 77 72 69 74 65 53 69 7a 65 2c 20 30 29 3b 0a 20  writeSize, 0);. 
35050 20 20 20 20 20 20 20 66 73 79 6e 63 28 63 6f 6e         fsync(con
35060 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20  chFile->h);.    
35070 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 72 65      /* If we cre
35080 61 74 65 64 20 61 20 6e 65 77 20 63 6f 6e 63 68  ated a new conch
35090 20 66 69 6c 65 20 28 6e 6f 74 20 6a 75 73 74 20   file (not just 
350a0 75 70 64 61 74 65 64 20 74 68 65 20 63 6f 6e 74  updated the cont
350b0 65 6e 74 73 20 6f 66 20 61 20 0a 20 20 20 20 20  ents of a .     
350c0 20 20 20 20 2a 2a 20 76 61 6c 69 64 20 63 6f 6e      ** valid con
350d0 63 68 20 66 69 6c 65 29 2c 20 74 72 79 20 74 6f  ch file), try to
350e0 20 6d 61 74 63 68 20 74 68 65 20 70 65 72 6d 69   match the permi
350f0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 64 61  ssions of the da
35100 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 20 20  tabase .        
35110 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
35120 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
35130 20 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a   createConch ){.
35140 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
35150 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20   stat buf;.     
35160 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 6f       int err = o
35170 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c  sFstat(pFile->h,
35180 20 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20   &buf);.        
35190 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29 7b 0a    if( err==0 ){.
351a0 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65              mode
351b0 5f 74 20 63 6d 6f 64 65 20 3d 20 62 75 66 2e 73  _t cmode = buf.s
351c0 74 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53 52 7c  t_mode&(S_IRUSR|
351d0 53 5f 49 57 55 53 52 20 7c 20 53 5f 49 52 47 52  S_IWUSR | S_IRGR
351e0 50 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20 20 20  P|S_IWGRP |.    
351f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35210 20 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f 49 57      S_IROTH|S_IW
35220 4f 54 48 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OTH);.          
35230 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74 63    /* try to matc
35240 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  h the database f
35250 69 6c 65 20 52 2f 57 20 70 65 72 6d 69 73 73 69  ile R/W permissi
35260 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c  ons, ignore fail
35270 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ure */.#ifndef S
35280 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55  QLITE_PROXY_DEBU
35290 47 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 73  G.            os
352a0 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65  Fchmod(conchFile
352b0 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 23 65 6c  ->h, cmode);.#el
352c0 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  se.            d
352d0 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o{.             
352e0 20 72 63 20 3d 20 6f 73 46 63 68 6d 6f 64 28 63   rc = osFchmod(c
352f0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f  onchFile->h, cmo
35300 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  de);.           
35310 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 28 2d 31   }while( rc==(-1
35320 29 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  ) && errno==EINT
35330 52 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  R );.           
35340 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
35350 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
35360 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  code = errno;.  
35370 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69              fpri
35380 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63 68  ntf(stderr, "fch
35390 6d 6f 64 20 25 6f 20 46 41 49 4c 45 44 20 77 69  mod %o FAILED wi
353a0 74 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  th %d %s\n",.   
353b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
353c0 20 20 20 63 6d 6f 64 65 2c 20 63 6f 64 65 2c 20     cmode, code, 
353d0 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b  strerror(code));
353e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
353f0 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
35400 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
35410 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 53  rr, "fchmod %o S
35420 55 43 43 45 44 45 44 5c 6e 22 2c 63 6d 6f 64 65  UCCEDED\n",cmode
35430 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
35440 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
35450 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
35460 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a  t code = errno;.
35470 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69              fpri
35480 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 54 41  ntf(stderr, "STA
35490 54 20 46 41 49 4c 45 44 5b 25 64 5d 20 77 69 74  T FAILED[%d] wit
354a0 68 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20  h %d %s\n", .   
354b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
354c0 20 65 72 72 2c 20 63 6f 64 65 2c 20 73 74 72 65   err, code, stre
354d0 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 23 65 6e  rror(code));.#en
354e0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  dif.          }.
354f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35500 7d 0a 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c  }.      conchFil
35510 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
35520 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
35530 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48  e*)conchFile, SH
35540 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
35550 20 20 0a 20 20 20 20 65 6e 64 5f 74 61 6b 65 63    .    end_takec
35560 6f 6e 63 68 3a 0a 20 20 20 20 20 20 4f 53 54 52  onch:.      OSTR
35570 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE(("TRANSPROXY
35580 3a 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22 2c 20  : CLOSE  %d\n", 
35590 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
355a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
355b0 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f 70  _OK && pFile->op
355c0 65 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20  enFlags ){.     
355d0 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 20     int fd;.     
355e0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e     if( pFile->h>
355f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
35600 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
35610 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f  le, pFile->h, __
35620 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20  LINE__);.       
35630 20 7d 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65   }.        pFile
35640 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ->h = -1;.      
35650 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
35660 65 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c  en(pCtx->dbPath,
35670 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67   pFile->openFlag
35680 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 4f  s, 0);.        O
35690 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52  STRACE(("TRANSPR
356a0 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22  OXY: OPEN  %d\n"
356b0 2c 20 66 64 29 29 3b 0a 20 20 20 20 20 20 20 20  , fd));.        
356c0 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
356d0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20         pFile->h 
356e0 3d 20 66 64 3b 0a 20 20 20 20 20 20 20 20 7d 65  = fd;.        }e
356f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
35700 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  c=SQLITE_CANTOPE
35710 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 51 4c 49 54  N_BKPT; /* SQLIT
35720 45 5f 42 55 53 59 3f 20 70 72 6f 78 79 54 61 6b  E_BUSY? proxyTak
35730 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20  eConch called.  
35740 20 20 20 20 20 20 20 20 20 64 75 72 69 6e 67 20           during 
35750 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20  locking */.     
35760 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35770 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35780 45 5f 4f 4b 20 26 26 20 21 70 43 74 78 2d 3e 6c  E_OK && !pCtx->l
35790 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20  ockProxy ){.    
357a0 20 20 20 20 63 68 61 72 20 2a 70 61 74 68 20 3d      char *path =
357b0 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3f 20   tempLockPath ? 
357c0 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3a 20 70  tempLockPath : p
357d0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
357e0 74 68 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  th;.        rc =
357f0 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78   proxyCreateUnix
35800 46 69 6c 65 28 70 61 74 68 2c 20 26 70 43 74 78  File(path, &pCtx
35810 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20 31 29 3b  ->lockProxy, 1);
35820 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
35830 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
35840 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26  !=SQLITE_NOMEM &
35850 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68  & tryOldLockPath
35860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
35870 20 77 65 20 63 6f 75 6c 64 6e 27 74 20 63 72 65   we couldn't cre
35880 61 74 65 20 74 68 65 20 70 72 6f 78 79 20 6c 6f  ate the proxy lo
35890 63 6b 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  ck file with the
358a0 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70   old lock file p
358b0 61 74 68 0a 20 20 20 20 20 20 20 20 20 20 20 2a  ath.           *
358c0 2a 20 73 6f 20 74 72 79 20 61 67 61 69 6e 20 76  * so try again v
358d0 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e 67 20 0a  ia auto-naming .
358e0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
358f0 20 20 20 20 20 20 20 20 66 6f 72 63 65 4e 65 77          forceNew
35900 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20  LockPath = 1;.  
35910 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f          tryOldLo
35920 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20  ckPath = 0;.    
35930 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
35940 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f 20 74 68  /* go back to th
35950 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65 20 73 74  e do {} while st
35960 61 72 74 20 70 6f 69 6e 74 2c 20 74 72 79 20 61  art point, try a
35970 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  gain */.        
35980 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
35990 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
359a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
359b0 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 63  Need to make a c
359c0 6f 70 79 20 6f 66 20 70 61 74 68 20 69 66 20 77  opy of path if w
359d0 65 20 65 78 74 72 61 63 74 65 64 20 74 68 65 20  e extracted the 
359e0 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20 2a  value.         *
359f0 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 63 68  * from the conch
35a00 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 61 74   file or the pat
35a10 68 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  h was allocated 
35a20 6f 6e 20 74 68 65 20 73 74 61 63 6b 0a 20 20 20  on the stack.   
35a30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
35a40 20 69 66 28 20 74 65 6d 70 4c 6f 63 6b 50 61 74   if( tempLockPat
35a50 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  h ){.          p
35a60 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
35a70 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
35a80 72 44 75 70 28 30 2c 20 74 65 6d 70 4c 6f 63 6b  rDup(0, tempLock
35a90 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20  Path);.         
35aa0 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b   if( !pCtx->lock
35ab0 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
35ac0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
35ad0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
35ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35af0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
35b00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35b10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74  K ){.        pCt
35b20 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31  x->conchHeld = 1
35b30 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
35b40 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
35b50 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 20  kProxy->pMethod 
35b60 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  == &afpIoMethods
35b70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
35b80 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
35b90 2a 61 66 70 43 74 78 3b 0a 20 20 20 20 20 20 20  *afpCtx;.       
35ba0 20 20 20 61 66 70 43 74 78 20 3d 20 28 61 66 70     afpCtx = (afp
35bb0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
35bc0 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  )pCtx->lockProxy
35bd0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
35be0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 43  ;.          afpC
35bf0 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 70 43 74  tx->dbPath = pCt
35c00 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35c10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35c20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
35c30 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d     conchFile->pM
35c40 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
35c50 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
35c60 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b  nchFile, NO_LOCK
35c70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
35c80 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45 43   OSTRACE(("TAKEC
35c90 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20  ONCH  %d %s\n", 
35ca0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20  conchFile->h,.  
35cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 3d               rc=
35cc0 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a  =SQLITE_OK?"ok":
35cd0 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
35ce0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
35cf0 20 7d 20 77 68 69 6c 65 20 28 31 29 3b 20 2f 2a   } while (1); /*
35d00 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64   in case we need
35d10 20 74 6f 20 72 65 74 72 79 20 74 68 65 20 3a 61   to retry the :a
35d20 75 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c 65 20 2d  uto: lock file -
35d30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
35d40 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20     ** we should 
35d50 6e 65 76 65 72 20 67 65 74 20 68 65 72 65 20 65  never get here e
35d60 78 63 65 70 74 20 76 69 61 20 74 68 65 20 27 63  xcept via the 'c
35d70 6f 6e 74 69 6e 75 65 27 20 63 61 6c 6c 2e 20 2a  ontinue' call. *
35d80 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  /.  }.}../*.** I
35d90 66 20 70 46 69 6c 65 20 68 6f 6c 64 73 20 61 20  f pFile holds a 
35da0 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e 63 68 20  lock on a conch 
35db0 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 6c 65 61  file, then relea
35dc0 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f  se that lock..*/
35dd0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
35de0 79 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 75 6e  yReleaseConch(un
35df0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
35e00 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
35e10 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a  E_OK;         /*
35e20 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   Subroutine retu
35e30 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 70 72 6f  rn code */.  pro
35e40 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
35e50 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54 68 65 20   *pCtx;  /* The 
35e60 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
35e70 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 6c 6f  for the proxy lo
35e80 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ck */.  unixFile
35e90 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20   *conchFile;    
35ea0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
35eb0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  he conch file */
35ec0 0a 0a 20 20 70 43 74 78 20 3d 20 28 70 72 6f 78  ..  pCtx = (prox
35ed0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
35ee0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
35ef0 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f 6e 63 68  Context;.  conch
35f00 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
35f10 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54 52 41 43  chFile;.  OSTRAC
35f20 45 28 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48  E(("RELEASECONCH
35f30 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
35f40 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %d\n", conchFile
35f50 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
35f60 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
35f70 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63  Path ? pCtx->loc
35f80 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61  kProxyPath : ":a
35f90 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20 20 20 20  uto:"), .       
35fa0 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a      getpid()));.
35fb0 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63    if( pCtx->conc
35fc0 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 72  hHeld>0 ){.    r
35fd0 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
35fe0 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
35ff0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
36000 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43  onchFile, NO_LOC
36010 4b 29 3b 0a 20 20 7d 0a 20 20 70 43 74 78 2d 3e  K);.  }.  pCtx->
36020 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20  conchHeld = 0;. 
36030 20 4f 53 54 52 41 43 45 28 28 22 52 45 4c 45 41   OSTRACE(("RELEA
36040 53 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e  SECONCH  %d %s\n
36050 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
36060 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d  .           (rc=
36070 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
36080 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29 3b  " : "failed")));
36090 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
360a0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
360b0 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62   name of a datab
360c0 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74  ase file, comput
360d0 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 69 74  e the name of it
360e0 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a  s conch file..**
360f0 20 53 74 6f 72 65 20 74 68 65 20 63 6f 6e 63 68   Store the conch
36100 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d   filename in mem
36110 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
36120 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
36130 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f  ()..** Make *pCo
36140 6e 63 68 50 61 74 68 20 70 6f 69 6e 74 20 74 6f  nchPath point to
36150 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20   the new name.  
36160 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
36170 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
36180 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
36190 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61  f unable to obta
361a0 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  in memory..**.**
361b0 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
361c0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65  esponsible for e
361d0 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65  nsuring that the
361e0 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
361f0 79 0a 2a 2a 20 73 70 61 63 65 20 69 73 20 65 76  y.** space is ev
36200 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a  entually freed..
36210 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74  **.** *pConchPat
36220 68 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  h is set to NULL
36230 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   if a memory all
36240 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
36250 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
36260 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 43  int proxyCreateC
36270 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 63 68 61  onchPathname(cha
36280 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20  r *dbPath, char 
36290 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20  **pConchPath){. 
362a0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
362b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
362c0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
362d0 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 69  /.  int len = (i
362e0 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68  nt)strlen(dbPath
362f0 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20  ); /* Length of 
36300 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  database filenam
36310 65 20 2d 20 64 62 50 61 74 68 20 2a 2f 0a 20 20  e - dbPath */.  
36320 63 68 61 72 20 2a 63 6f 6e 63 68 50 61 74 68 3b  char *conchPath;
36330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36340 20 62 75 66 66 65 72 20 69 6e 20 77 68 69 63 68   buffer in which
36350 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 63 6f   to construct co
36360 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f  nch name */..  /
36370 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
36380 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66   for the conch f
36390 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6e 69 74  ilename and init
363a0 69 61 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65 20  ialize the name 
363b0 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65  to.  ** the name
363c0 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
363d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
363e0 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63 68 50 61  */  .  *pConchPa
363f0 74 68 20 3d 20 63 6f 6e 63 68 50 61 74 68 20 3d  th = conchPath =
36400 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
36410 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29  _malloc(len + 8)
36420 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74  ;.  if( conchPat
36430 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  h==0 ){.    retu
36440 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
36450 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 63 6f  .  }.  memcpy(co
36460 6e 63 68 50 61 74 68 2c 20 64 62 50 61 74 68 2c  nchPath, dbPath,
36470 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a   len+1);.  .  /*
36480 20 6e 6f 77 20 69 6e 73 65 72 74 20 61 20 22 2e   now insert a ".
36490 22 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73  " before the las
364a0 74 20 2f 20 63 68 61 72 61 63 74 65 72 20 2a 2f  t / character */
364b0 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31  .  for( i=(len-1
364c0 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a  ); i>=0; i-- ){.
364d0 20 20 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74      if( conchPat
364e0 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  h[i]=='/' ){.   
364f0 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72     i++;.      br
36500 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
36510 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e   conchPath[i]='.
36520 27 3b 0a 20 20 77 68 69 6c 65 20 28 20 69 3c 6c  ';.  while ( i<l
36530 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50  en ){.    conchP
36540 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b  ath[i+1]=dbPath[
36550 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d  i];.    i++;.  }
36560 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64 20 74 68  ..  /* append th
36570 65 20 22 2d 63 6f 6e 63 68 22 20 73 75 66 66 69  e "-conch" suffi
36580 78 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f  x to the file */
36590 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68  .  memcpy(&conch
365a0 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e  Path[i+1], "-con
365b0 63 68 22 2c 20 37 29 3b 0a 20 20 61 73 73 65 72  ch", 7);.  asser
365c0 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 63  t( (int)strlen(c
365d0 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e  onchPath) == len
365e0 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  +7 );..  return 
365f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
36600 2a 20 54 61 6b 65 73 20 61 20 66 75 6c 6c 79 20  * Takes a fully 
36610 63 6f 6e 66 69 67 75 72 65 64 20 70 72 6f 78 79  configured proxy
36620 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75   locking-style u
36630 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 73 77 69  nix file and swi
36640 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63  tches.** the loc
36650 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  al lock file pat
36660 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h .*/.static int
36670 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79   switchLockProxy
36680 50 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70  Path(unixFile *p
36690 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  File, const char
366a0 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78   *path) {.  prox
366b0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
366c0 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
366d0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
366e0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
366f0 65 78 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64  ext;.  char *old
36700 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  Path = pCtx->loc
36710 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e  kProxyPath;.  in
36720 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
36730 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  ;..  if( pFile->
36740 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
36750 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
36760 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
36770 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e  }  ..  /* nothin
36780 67 20 74 6f 20 64 6f 20 69 66 20 74 68 65 20 70  g to do if the p
36790 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75  ath is NULL, :au
367a0 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65 73 20 74  to: or matches t
367b0 68 65 20 65 78 69 73 74 69 6e 67 20 70 61 74 68  he existing path
367c0 20 2a 2f 0a 20 20 69 66 28 20 21 70 61 74 68 20   */.  if( !path 
367d0 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27  || path[0]=='\0'
367e0 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68   || !strcmp(path
367f0 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20  , ":auto:") ||. 
36800 20 20 20 28 6f 6c 64 50 61 74 68 20 26 26 20 21     (oldPath && !
36810 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c  strncmp(oldPath,
36820 20 70 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45   path, MAXPATHLE
36830 4e 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  N)) ){.    retur
36840 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
36850 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69  else{.    unixFi
36860 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20  le *lockProxy = 
36870 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b  pCtx->lockProxy;
36880 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  .    pCtx->lockP
36890 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70  roxy=NULL;.    p
368a0 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d  Ctx->conchHeld =
368b0 20 30 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   0;.    if( lock
368c0 50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20  Proxy!=NULL ){. 
368d0 20 20 20 20 20 72 63 3d 6c 6f 63 6b 50 72 6f 78       rc=lockProx
368e0 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  y->pMethod->xClo
368f0 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
36900 20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20   *)lockProxy);. 
36910 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
36920 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
36930 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b  qlite3_free(lock
36940 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20  Proxy);.    }.  
36950 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6f    sqlite3_free(o
36960 6c 64 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74  ldPath);.    pCt
36970 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
36980 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
36990 75 70 28 30 2c 20 70 61 74 68 29 3b 0a 20 20 7d  up(0, path);.  }
369a0 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
369b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20  .}../*.** pFile 
369c0 69 73 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  is a file that h
369d0 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62  as been opened b
369e0 79 20 61 20 70 72 69 6f 72 20 78 4f 70 65 6e 20  y a prior xOpen 
369f0 63 61 6c 6c 2e 20 20 64 62 50 61 74 68 0a 2a 2a  call.  dbPath.**
36a00 20 69 73 20 61 20 73 74 72 69 6e 67 20 62 75 66   is a string buf
36a10 66 65 72 20 61 74 20 6c 65 61 73 74 20 4d 41 58  fer at least MAX
36a20 50 41 54 48 4c 45 4e 2b 31 20 63 68 61 72 61 63  PATHLEN+1 charac
36a30 74 65 72 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ters in size..**
36a40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
36a50 20 66 69 6e 64 20 74 68 65 20 66 69 6c 65 6e 61   find the filena
36a60 6d 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  me associated wi
36a70 74 68 20 70 46 69 6c 65 20 61 6e 64 20 77 72 69  th pFile and wri
36a80 74 65 73 20 69 74 0a 2a 2a 20 69 6e 74 20 64 62  tes it.** int db
36a90 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Path..*/.static 
36aa0 69 6e 74 20 70 72 6f 78 79 47 65 74 44 62 50 61  int proxyGetDbPa
36ab0 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e  thForUnixFile(un
36ac0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63  ixFile *pFile, c
36ad0 68 61 72 20 2a 64 62 50 61 74 68 29 7b 0a 23 69  har *dbPath){.#i
36ae0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
36af0 45 5f 5f 29 0a 20 20 69 66 28 20 70 46 69 6c 65  E__).  if( pFile
36b00 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66  ->pMethod == &af
36b10 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
36b20 20 20 2f 2a 20 61 66 70 20 73 74 79 6c 65 20 6b    /* afp style k
36b30 65 65 70 73 20 61 20 72 65 66 65 72 65 6e 63 65  eeps a reference
36b40 20 74 6f 20 74 68 65 20 64 62 20 70 61 74 68 20   to the db path 
36b50 69 6e 20 74 68 65 20 66 69 6c 65 50 61 74 68 20  in the filePath 
36b60 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a 20 6f 66  field .    ** of
36b70 20 74 68 65 20 73 74 72 75 63 74 20 2a 2f 0a 20   the struct */. 
36b80 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29     assert( (int)
36b90 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46  strlen((char*)pF
36ba0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
36bb0 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e  ext)<=MAXPATHLEN
36bc0 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28   );.    strlcpy(
36bd0 64 62 50 61 74 68 2c 20 28 28 61 66 70 4c 6f 63  dbPath, ((afpLoc
36be0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
36bf0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
36c00 65 78 74 29 2d 3e 64 62 50 61 74 68 2c 20 4d 41  ext)->dbPath, MA
36c10 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 20 65  XPATHLEN);.  } e
36c20 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  lse.#endif.  if(
36c30 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
36c40 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  == &dotlockIoMet
36c50 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 64  hods ){.    /* d
36c60 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65 20 75 73  ot lock style us
36c70 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  es the locking c
36c80 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20  ontext to store 
36c90 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a 20 20 20  the dot lock.   
36ca0 20 2a 2a 20 66 69 6c 65 20 70 61 74 68 20 2a 2f   ** file path */
36cb0 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73  .    int len = s
36cc0 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70 46  trlen((char *)pF
36cd0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
36ce0 65 78 74 29 20 2d 20 73 74 72 6c 65 6e 28 44 4f  ext) - strlen(DO
36cf0 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29 3b 0a 20  TLOCK_SUFFIX);. 
36d00 20 20 20 6d 65 6d 63 70 79 28 64 62 50 61 74 68     memcpy(dbPath
36d10 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  , (char *)pFile-
36d20 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c  >lockingContext,
36d30 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 7d 65 6c   len + 1);.  }el
36d40 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6f  se{.    /* all o
36d50 74 68 65 72 20 73 74 79 6c 65 73 20 75 73 65 20  ther styles use 
36d60 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
36d70 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ext to store the
36d80 20 64 62 20 66 69 6c 65 20 70 61 74 68 20 2a 2f   db file path */
36d90 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 74 72  .    assert( str
36da0 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65  len((char*)pFile
36db0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
36dc0 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b  )<=MAXPATHLEN );
36dd0 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64 62 50  .    strlcpy(dbP
36de0 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69  ath, (char *)pFi
36df0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
36e00 78 74 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  xt, MAXPATHLEN);
36e10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
36e20 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
36e30 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c 72 65 61  * Takes an alrea
36e40 64 79 20 66 69 6c 6c 65 64 20 69 6e 20 75 6e 69  dy filled in uni
36e50 78 20 66 69 6c 65 20 61 6e 64 20 61 6c 74 65 72  x file and alter
36e60 73 20 69 74 20 73 6f 20 61 6c 6c 20 66 69 6c 65  s it so all file
36e70 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c   locking .** wil
36e80 6c 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f  l be performed o
36e90 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 72 6f 78  n the local prox
36ea0 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20 20 54 68  y lock file.  Th
36eb0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
36ec0 64 73 0a 2a 2a 20 61 72 65 20 70 72 65 73 65 72  ds.** are preser
36ed0 76 65 64 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  ved in the locki
36ee0 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f 20 74 68  ng context so th
36ef0 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72  at they can be r
36f00 65 73 74 6f 72 65 64 20 61 6e 64 20 0a 2a 2a 20  estored and .** 
36f10 74 68 65 20 75 6e 69 78 20 73 74 72 75 63 74 75  the unix structu
36f20 72 65 20 70 72 6f 70 65 72 6c 79 20 63 6c 65 61  re properly clea
36f30 6e 65 64 20 75 70 20 61 74 20 63 6c 6f 73 65 20  ned up at close 
36f40 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b  time:.**  ->lock
36f50 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d  ingContext.**  -
36f60 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73 74 61 74  >pMethod.*/.stat
36f70 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
36f80 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
36f90 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63  ixFile *pFile, c
36fa0 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29  onst char *path)
36fb0 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   {.  proxyLockin
36fc0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a  gContext *pCtx;.
36fd0 20 20 63 68 61 72 20 64 62 50 61 74 68 5b 4d 41    char dbPath[MA
36fe0 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20 20 20 20  XPATHLEN+1];    
36ff0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
37000 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
37010 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50  */.  char *lockP
37020 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20  ath=NULL;.  int 
37030 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
37040 20 20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e    .  if( pFile->
37050 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
37060 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
37070 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
37080 7d 0a 20 20 70 72 6f 78 79 47 65 74 44 62 50 61  }.  proxyGetDbPa
37090 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 70 46  thForUnixFile(pF
370a0 69 6c 65 2c 20 64 62 50 61 74 68 29 3b 0a 20 20  ile, dbPath);.  
370b0 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74  if( !path || pat
370c0 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73  h[0]=='\0' || !s
370d0 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75  trcmp(path, ":au
370e0 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20 6c 6f 63  to:") ){.    loc
370f0 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 7d 65  kPath=NULL;.  }e
37100 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74  lse{.    lockPat
37110 68 3d 28 63 68 61 72 20 2a 29 70 61 74 68 3b 0a  h=(char *)path;.
37120 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41 43 45    }.  .  OSTRACE
37130 28 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25  (("TRANSPROXY  %
37140 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c  d for %s pid=%d\
37150 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
37160 20 20 20 20 20 20 20 20 20 28 6c 6f 63 6b 50 61           (lockPa
37170 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68 20 3a 20  th ? lockPath : 
37180 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69  ":auto:"), getpi
37190 64 28 29 29 29 3b 0a 0a 20 20 70 43 74 78 20 3d  d()));..  pCtx =
371a0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
371b0 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29   sizeof(*pCtx) )
371c0 3b 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20  ;.  if( pCtx==0 
371d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
371e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
371f0 20 20 6d 65 6d 73 65 74 28 70 43 74 78 2c 20 30    memset(pCtx, 0
37200 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 29  , sizeof(*pCtx))
37210 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f 78 79 43  ;..  rc = proxyC
37220 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61  reateConchPathna
37230 6d 65 28 64 62 50 61 74 68 2c 20 26 70 43 74 78  me(dbPath, &pCtx
37240 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29  ->conchFilePath)
37250 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
37260 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
37270 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69  = proxyCreateUni
37280 78 46 69 6c 65 28 70 43 74 78 2d 3e 63 6f 6e 63  xFile(pCtx->conc
37290 68 46 69 6c 65 50 61 74 68 2c 20 26 70 43 74 78  hFilePath, &pCtx
372a0 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c 20 30 29 3b  ->conchFile, 0);
372b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
372c0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 26 26 20  ITE_CANTOPEN && 
372d0 28 28 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  ((pFile->openFla
372e0 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 29  gs&O_RDWR) == 0)
372f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20   ){.      /* if 
37300 28 61 29 20 74 68 65 20 6f 70 65 6e 20 66 6c 61  (a) the open fla
37310 67 73 20 61 72 65 20 6e 6f 74 20 4f 5f 52 44 57  gs are not O_RDW
37320 52 2c 20 28 62 29 20 74 68 65 20 63 6f 6e 63 68  R, (b) the conch
37330 20 69 73 6e 27 74 20 74 68 65 72 65 2c 20 61 6e   isn't there, an
37340 64 0a 20 20 20 20 20 20 2a 2a 20 28 63 29 20 74  d.      ** (c) t
37350 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20 69  he file system i
37360 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65  s read-only, the
37370 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c 6f 63 6b  n enable no-lock
37380 69 6e 67 20 61 63 63 65 73 73 2e 0a 20 20 20 20  ing access..    
37390 20 20 2a 2a 20 55 67 68 2c 20 73 69 6e 63 65 20    ** Ugh, since 
373a0 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30 30 30 30  O_RDONLY==0x0000
373b0 20 77 65 20 74 65 73 74 20 66 6f 72 20 21 4f 5f   we test for !O_
373c0 52 44 57 52 20 73 69 6e 63 65 20 75 6e 69 78 4f  RDWR since unixO
373d0 70 65 6e 20 61 73 73 65 72 74 73 0a 20 20 20 20  pen asserts.    
373e0 20 20 2a 2a 20 74 68 61 74 20 6f 70 65 6e 46 6c    ** that openFl
373f0 61 67 73 20 77 69 6c 6c 20 68 61 76 65 20 6f 6e  ags will have on
37400 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f 52 44 4f 4e  ly one of O_RDON
37410 4c 59 20 6f 72 20 4f 5f 52 44 57 52 2e 0a 20 20  LY or O_RDWR..  
37420 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72      */.      str
37430 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66  uct statfs fsInf
37440 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  o;.      struct 
37450 73 74 61 74 20 63 6f 6e 63 68 49 6e 66 6f 3b 0a  stat conchInfo;.
37460 20 20 20 20 20 20 69 6e 74 20 67 6f 4c 6f 63 6b        int goLock
37470 6c 65 73 73 20 3d 20 30 3b 0a 0a 20 20 20 20 20  less = 0;..     
37480 20 69 66 28 20 6f 73 53 74 61 74 28 70 43 74 78   if( osStat(pCtx
37490 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c  ->conchFilePath,
374a0 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20 3d 3d 20   &conchInfo) == 
374b0 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69  -1 ) {.        i
374c0 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a  nt err = errno;.
374d0 20 20 20 20 20 20 20 20 69 66 28 20 28 65 72 72          if( (err
374e0 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20 28 73 74  ==ENOENT) && (st
374f0 61 74 66 73 28 64 62 50 61 74 68 2c 20 26 66 73  atfs(dbPath, &fs
37500 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20 29 7b 0a  Info) != -1) ){.
37510 20 20 20 20 20 20 20 20 20 20 67 6f 4c 6f 63 6b            goLock
37520 6c 65 73 73 20 3d 20 28 66 73 49 6e 66 6f 2e 66  less = (fsInfo.f
37530 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44 4f 4e 4c  _flags&MNT_RDONL
37540 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f 4e 4c 59  Y) == MNT_RDONLY
37550 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37560 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67 6f    }.      if( go
37570 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20 20 20 20  Lockless ){.    
37580 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48      pCtx->conchH
37590 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20 72 65 61  eld = -1; /* rea
375a0 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f 63 6b 6c  d only FS/ lockl
375b0 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ess */.        r
375c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
375d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
375e0 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c    .  if( rc==SQL
375f0 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 50 61  ITE_OK && lockPa
37600 74 68 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e  th ){.    pCtx->
37610 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20  lockProxyPath = 
37620 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
37630 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20  0, lockPath);.  
37640 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
37650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43  ITE_OK ){.    pC
37660 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 73 71 6c  tx->dbPath = sql
37670 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
37680 64 62 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  dbPath);.    if(
37690 20 70 43 74 78 2d 3e 64 62 50 61 74 68 3d 3d 4e   pCtx->dbPath==N
376a0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ULL ){.      rc 
376b0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
376c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
376d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
376e0 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d 65 6d 6f  .    /* all memo
376f0 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c  ry is allocated,
37700 20 70 72 6f 78 79 73 20 61 72 65 20 63 72 65 61   proxys are crea
37710 74 65 64 20 61 6e 64 20 61 73 73 69 67 6e 65 64  ted and assigned
37720 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69 74 63 68  , .    ** switch
37730 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
37740 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64  text and pMethod
37750 20 74 68 65 6e 20 72 65 74 75 72 6e 2e 0a 20 20   then return..  
37760 20 20 2a 2f 0a 20 20 20 20 70 43 74 78 2d 3e 6f    */.    pCtx->o
37770 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
37780 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   = pFile->lockin
37790 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 46  gContext;.    pF
377a0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
377b0 65 78 74 20 3d 20 70 43 74 78 3b 0a 20 20 20 20  ext = pCtx;.    
377c0 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64  pCtx->pOldMethod
377d0 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f   = pFile->pMetho
377e0 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d  d;.    pFile->pM
377f0 65 74 68 6f 64 20 3d 20 26 70 72 6f 78 79 49 6f  ethod = &proxyIo
37800 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
37810 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  {.    if( pCtx->
37820 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20 0a 20 20  conchFile ){ .  
37830 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46      pCtx->conchF
37840 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  ile->pMethod->xC
37850 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69  lose((sqlite3_fi
37860 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63 68  le *)pCtx->conch
37870 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  File);.      sql
37880 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e  ite3_free(pCtx->
37890 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20  conchFile);.    
378a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
378b0 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f 63  ree(0, pCtx->loc
378c0 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20  kProxyPath);.   
378d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
378e0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
378f0 68 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65 33  h); .    sqlite3
37900 5f 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20 7d  _free(pCtx);.  }
37910 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41  .  OSTRACE(("TRA
37920 4e 53 50 52 4f 58 59 20 20 25 64 20 25 73 5c 6e  NSPROXY  %d %s\n
37930 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
37940 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c          (rc==SQL
37950 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
37960 22 66 61 69 6c 65 64 22 29 29 29 3b 0a 20 20 72  "failed")));.  r
37970 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
37980 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
37990 20 68 61 6e 64 6c 65 73 20 73 71 6c 69 74 65 33   handles sqlite3
379a0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20  _file_control() 
379b0 63 61 6c 6c 73 20 74 68 61 74 20 61 72 65 20 73  calls that are s
379c0 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 70 72  pecific.** to pr
379d0 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  oxy locking..*/.
379e0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
379f0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
37a00 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
37a10 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
37a20 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  ){.  switch( op 
37a30 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
37a40 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
37a50 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  FILE: {.      un
37a60 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
37a70 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
37a80 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
37a90 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78  pMethod == &prox
37aa0 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  yIoMethods ){.  
37ab0 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69        proxyLocki
37ac0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
37ad0 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
37ae0 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c  ontext*)pFile->l
37af0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
37b00 20 20 20 20 20 20 20 70 72 6f 78 79 54 61 6b 65         proxyTake
37b10 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
37b20 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
37b30 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
37b40 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e  .          *(con
37b50 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20  st char **)pArg 
37b60 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
37b70 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d  yPath;.        }
37b80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
37b90 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
37ba0 70 41 72 67 20 3d 20 22 3a 61 75 74 6f 3a 20 28  pArg = ":auto: (
37bb0 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20 20 20 20  not held)";.    
37bc0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c      }.      } el
37bd0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2a 28 63  se {.        *(c
37be0 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72  onst char **)pAr
37bf0 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  g = NULL;.      
37c00 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
37c10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
37c20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
37c30 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
37c40 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  E: {.      unixF
37c50 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
37c60 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
37c70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
37c80 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20  E_OK;.      int 
37c90 69 73 50 72 6f 78 79 53 74 79 6c 65 20 3d 20 28  isProxyStyle = (
37ca0 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
37cb0 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  = &proxyIoMethod
37cc0 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  s);.      if( pA
37cd0 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e  rg==NULL || (con
37ce0 73 74 20 63 68 61 72 20 2a 29 70 41 72 67 3d 3d  st char *)pArg==
37cf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
37d00 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b   isProxyStyle ){
37d10 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75  .          /* tu
37d20 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63  rn off proxy loc
37d30 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75 70 70 6f  king - not suppo
37d40 72 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  rted */.        
37d50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
37d60 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f 50 52 4f  ROR /*SQLITE_PRO
37d70 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d 49  TOCOL? SQLITE_MI
37d80 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20 20 20 20  SUSE?*/;.       
37d90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
37da0 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72    /* turn off pr
37db0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c  oxy locking - al
37dc0 72 65 61 64 79 20 6f 66 66 20 2d 20 4e 4f 4f 50  ready off - NOOP
37dd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
37de0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
37df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
37e00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  lse{.        con
37e10 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 50 61  st char *proxyPa
37e20 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  th = (const char
37e30 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20   *)pArg;.       
37e40 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c   if( isProxyStyl
37e50 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
37e60 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
37e70 78 74 20 2a 70 43 74 78 20 3d 20 0a 20 20 20 20  xt *pCtx = .    
37e80 20 20 20 20 20 20 20 20 28 70 72 6f 78 79 4c 6f          (proxyLo
37e90 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
37ea0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
37eb0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ext;.          i
37ec0 66 28 20 21 73 74 72 63 6d 70 28 70 41 72 67 2c  f( !strcmp(pArg,
37ed0 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20 20 20 20   ":auto:") .    
37ee0 20 20 20 20 20 20 20 7c 7c 20 28 70 43 74 78 2d         || (pCtx-
37ef0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 26  >lockProxyPath &
37f00 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
37f10 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e   !strncmp(pCtx->
37f20 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 70  lockProxyPath, p
37f30 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54  roxyPath, MAXPAT
37f40 48 4c 45 4e 29 29 0a 20 20 20 20 20 20 20 20 20  HLEN)).         
37f50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
37f60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
37f70 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
37f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
37f90 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78  = switchLockProx
37fa0 79 50 61 74 68 28 70 46 69 6c 65 2c 20 70 72 6f  yPath(pFile, pro
37fb0 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  xyPath);.       
37fc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
37fd0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
37fe0 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78 79 20 66   turn on proxy f
37ff0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  ile locking */. 
38000 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72           rc = pr
38010 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
38020 46 69 6c 65 28 70 46 69 6c 65 2c 20 70 72 6f 78  File(pFile, prox
38030 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  yPath);.        
38040 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
38050 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
38060 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
38070 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20        assert( 0 
38080 29 3b 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c 20  );  /* The call 
38090 61 73 73 75 72 65 73 20 74 68 61 74 20 6f 6e 6c  assures that onl
380a0 79 20 76 61 6c 69 64 20 6f 70 63 6f 64 65 73 20  y valid opcodes 
380b0 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20 20 20 20  are sent */.    
380c0 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
380d0 43 48 45 44 2a 2f 0a 20 20 72 65 74 75 72 6e 20  CHED*/.  return 
380e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  SQLITE_ERROR;.}.
380f0 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68  ./*.** Within th
38100 69 73 20 64 69 76 69 73 69 6f 6e 20 28 74 68 65  is division (the
38110 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e   proxying lockin
38120 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
38130 29 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 73  ) the procedures
38140 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20 70  .** above this p
38150 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20 75 74 69  oint are all uti
38160 6c 69 74 69 65 73 2e 20 20 54 68 65 20 6c 6f 63  lities.  The loc
38170 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74 68 6f 64  k-related method
38180 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 72 6f 78  s of the.** prox
38190 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  y-locking sqlite
381a0 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a 65  3_io_method obje
381b0 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a  ct follow..*/...
381c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
381d0 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
381e0 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
381f0 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
38200 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
38210 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
38220 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
38230 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
38240 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
38250 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
38260 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
38270 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
38280 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
38290 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
382a0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
382b0 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
382c0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
382d0 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
382e0 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
382f0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68  atic int proxyCh
38300 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
38310 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
38320 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
38330 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
38340 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
38350 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
38360 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70  proxyTakeConch(p
38370 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  File);.  if( rc=
38380 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
38390 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
383a0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
383b0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
383c0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
383d0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
383e0 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
383f0 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  eld>0 ){.      u
38400 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d  nixFile *proxy =
38410 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
38420 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
38430 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  roxy->pMethod->x
38440 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
38450 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
38460 29 70 72 6f 78 79 2c 20 70 52 65 73 4f 75 74 29  )proxy, pResOut)
38470 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 2f 2a 20  ;.    }else{ /* 
38480 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73  conchHeld < 0 is
38490 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20   lockless */.   
384a0 20 20 20 70 52 65 73 4f 75 74 3d 30 3b 0a 20 20     pResOut=0;.  
384b0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
384c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
384d0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
384e0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
384f0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
38500 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
38510 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
38520 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing: